【发布时间】:2020-04-24 08:00:59
【问题描述】:
我有一个后端 (NodeJS),它正在侦听某个端口(本例中为 2345)。
客户端应用程序是一个 React 应用程序。两者都在利用socket.io 在他们之间进行通信。两者都是容器化的。
然后我使用“network”标志在同一个网络上运行它们:
docker run -it --network=test1 --name serverapp server-app
docker run -it --network=test1 client-app
在客户端,我有这段代码(在服务器中代码非常标准,几乎是从 socket.io 页面复制粘贴):
const socket = io.connect('http://serverapp:2345');
socket.emit('getData');
socket.on('data', function(data) {
console.log('got data: ${data}');
})
我怀疑问题与 http-server 包提供客户端(React)应用程序有关,然后在浏览器上下文中,主机名不被理解,因此无法解决。当我进入浏览器控制台时,我看到以下错误:GET http://tbserver:2345/socket.io/?EIO=3&transport=polling&t=MzyGQLT net::ERR_NAME_NOT_RESOLVED
现在,如果我(在客户端应用程序中)将主机名 serverapp 切换为 localhost(浏览器可以理解但不建议在 docker 中使用,因为它的解释不同),当尝试连接到服务器套接字时,我收到错误:GET http://localhost:2345/socket.io/?EIO=3&transport=polling&t=MzyFyAe net::ERR_CONNECTION_REFUSED。
另一条信息是我们目前构建 React 应用程序(使用 npm run build),然后我们使用以下 Dockerfile 构建和运行 Docker 容器:
FROM mhart/alpine-node
RUN npm install -g http-server
WORKDIR /app
COPY /app/build/. /app/.
EXPOSE 2974 2326 1337 2324 7000 8769 8000 2345
CMD ["http-server", "-p", "8000"]`
(因此,在构建容器时不会构建 React 应用程序;我们宁愿依赖预构建一次)
不确定我在这里缺少什么以及它是否与http-server 有关,但在此之前,我设法在使用相同 Docker 网络的 2 个 NodeJS 应用程序之间建立了一个完全正常工作的socket.io 连接,所以这不应该是代码问题。
【问题讨论】:
-
你能在你的 docker 中获取这个地址并查看它是否有效吗?
'http://serverapp:2345'你可能没有 docker 里面的 DNS -
docker 中的 wget 到底是什么意思?你的意思是使用 docker exec?
-
在 docker shell 中运行这个命令
-
docker exec -it cdbd wget 'serverapp:2345' 产生:wget: bad address 'serverapp:2345'
-
尝试将您的域添加到 etc/hosts,如下所示:thegeekdiary.com/… 让我知道这是否可行,以便我将作为答案发布
标签: node.js reactjs docker socket.io docker-networking