我正在嘗試通過 axios 從我的本地主機(節點服務器)發送一個 http 請求到屬于 docker 網路并由特定 IP 標識的 docker 容器(節點中也包含一個簡單的服務器)。
我使用過郵遞員、xmlhttprequests 和 axios,但似乎沒有任何效果。我也嘗試過獲取和發布請求,但其中任何一個都可以從容器端得到任何答案。
你知道我做錯了什么嗎?
我運行以啟動容器的 .sh 檔案是:
docker build -t connectimg .
docker network create --subnet=119.18.0.0/16 mynet
docker run -d --name instance2 -p 4002:4000 --net mynet --ip 119.18.0.2 connectimg
啟動后實體的 docker 日志結果是:
{
lo: [
{
address: '127.0.0.1',
netmask: '255.0.0.0',
family: 'IPv4',
mac: '00:00:00:00:00:00',
internal: true,
cidr: '127.0.0.1/8'
}
],
eth0: [
{
address: '119.18.0.2',
netmask: '255.255.0.0',
family: 'IPv4',
mac: '02:42:77:12:00:02',
internal: false,
cidr: '119.18.0.2/16'
}
]
}
Example app listening on port 3000
我的 Docker 實體節點應用程式代碼是:
const express = require('express')
const app = express()
const port = 3000
const cors = require('cors')
var os = require('os');
app.use(cors());
app.use(express.json());
app.listen(port, () => {
console.log(`Example app listening on port ${port}`)
})
app.get('/listen', (req,res) => {
console.log('got it');
})
var networkInterfaces = os.networkInterfaces();
console.log(networkInterfaces);
我的節點服務器負責向實體發送獲取請求的代碼是:
const connect = (req,res) => {
axios.get('http://119.18.0.2:3000/listen').then(resp => {
console.log(resp.data);
});
}
我不斷收到的錯誤是:
ETIMEDOUT 119.18.0.2:3000
at TCPConnectWrap.afterConnect [as oncomplete] (net.js:1159:16)
uj5u.com熱心網友回復:
首先,您的 URIhttp://119.18.0.2:3000/listen不正確。無法直接訪問 docker 網路,因為它不是主機知道的網路。
該選項-p 4002:4000是將您的 docker 容器暴露給主機(以及您連接到的網路)的原因。4002是您的容器在 docker 網路內公開4000的埠,埠是公開給主機和網路的埠。
要從主機訪問容器,您的 URI 將變為http://localhost:4000/listen
要從同一網路上的不同機器訪問容器,URI 將變為http://<ip-address-of-this-machine>:4000/listen. ipconfig您可以在 Windows 上的命令提示符或ifconfig基于 Linux 的系統的終端中找到您的 IP 。
其次,您的埠分配不匹配。您使用docker run 命令在節點應用程式中設定埠,并使用容器的const port = 3000公開埠。4002-p 4002:4000
更改您的節點應用程式以4002使用公開埠const port = 4002
或更改您的 docker run 命令以3000使用 公開容器的埠-p 3000:4000。
Docker 網路一開始可能會有點混亂。閱讀它們或查看檔案(很有用),它將在未來的開發中為您提供良好的服務。:)
編輯:您可以使用類似于以下的 DockerFile 正確容器化您的節點應用程式:
FROM node:lts-alpine3.15
LABEL maintainer="MyDevName"
WORKDIR /usr/app
COPY ./myNodeApp ./
RUN npm install
CMD ["npm", "start"]
這樣您的節點應用程式就會在啟動時自動運行。
uj5u.com熱心網友回復:
我運行以啟動容器的 .sh 檔案是:
docker build -t connectimg . docker network create --subnet=119.18.0.0/16 mynet docker run -d --name instance2 -p 4002:4000 --net mynet --ip 119.18.0.2 connectimg
如果將利用 docker-compose,您可能不需要該腳本。
我正在嘗試通過 axios 從我的本地主機(節點服務器)發送一個 http 請求到屬于 docker 網路并由特定 IP 標識的 docker 容器(節點中也包含一個簡單的服務器)。
似乎需要調整兩件事:
0.0.0.0:4200在 dockerized 服務器中使用。- 驗證您與容器關聯的網路是否可以從您的主機作業系統訪問。如果 docker 網路不是那么重要,你可以放棄它
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/439528.html
