【问题标题】:ERR_NAME_NOT_RESOLVED using Docker network to communicate between a backend container and a React containerERR_NAME_NOT_RESOLVED 使用 Docker 网络在后端容器和 React 容器之间进行通信
【发布时间】: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


【解决方案1】:

您的浏览器需要知道如何解析 SocketIO 服务器地址。您可以公开端口 2345serverapp 并将端口 2345 绑定到端口 2345serverapp

docker run -it --network=test1 -p 2345:2345 --name serverapp server-app

这样你就可以在你的客户端代码中使用 localhost

const socket = io.connect('http://localhost:2345');

同时从您的客户端 Dockerfile 中删除 2345

【讨论】:

    猜你喜欢
    • 2021-08-30
    • 1970-01-01
    • 2018-01-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-26
    • 2023-03-19
    相关资源
    最近更新 更多