【问题标题】:Unable to have Docker containers communicate with each other无法让 Docker 容器相互通信
【发布时间】:2019-11-16 05:29:28
【问题描述】:

我有两个 Docker 容器,一个运行 React 应用程序(使用 create-react-app 构建),另一个运行 Node 应用程序 API。我设置了一个 docker-compose 文件,根据documentation,我应该能够使用服务的名称在容器之间进行通信。

但是,当我尝试从 React 应用程序向我的 API 的 /login 端点发送请求时,我收到了 net::ERR_NAME_NOT_RESOLVED 错误。我正在使用 Unirest 发送请求。

我在网上进行了很多挖掘,遇到了一些描述类似问题的东西,但仍然无法找到解决方案。当我在我的 React 容器中运行cat /etc/resolve.conf(请参阅this 问题)时,带有我的 API 的容器没有显示出来,但 Docker 对我来说仍然相当新,所以我不确定这是否是问题的一部分。我也尝试在撰写文件中使用链接和用户定义的网络,但无济于事。

我已经包含了我的docker-compose.yml 文件的要点以及我的请求的代码 sn-p。非常感谢任何帮助!

docker-compose.yml
Unirest request to /login

【问题讨论】:

  • 在 docker 上 ping api 主机是否有效?
  • @LuisMuñoz 是的。如果我运行docker exec -it amplifydemo_reactapp_1 ping api,我可以看到响应。
  • 很好,那么错误出现在哪里?
  • 在我的浏览器中使用 React 应用程序时。我有一个登录表单,它调用在api 容器中运行的我的API 的/login 端点。当我提交表单时,我在浏览器控制台中收到http://api:8080/login net::ERR_NAME_NOT_RESOLVED
  • DNS 问题!您必须将 api 替换为您的浏览器可解析的主机名!

标签: node.js reactjs docker docker-compose unirest


【解决方案1】:

正如原始帖子的 cmets 中所讨论的,这是一个 DNS 问题。对于这个项目的用例来说,配置 DNS 有点麻烦,所以我通过使用环境变量来设置 URL 来解决我的问题,该 URL 用于根据我是否正在运行来调用我的 API 容器开发或生产环境:

(process.env.REACT_APP_URL_ROOT || '/app')

我在本地运行时将REACT_APP_URL_ROOT 设置为我的本地主机地址,并在我构建和部署React 应用程序时将一个nginx 容器配置为代理到/app

【讨论】:

    猜你喜欢
    • 2021-11-21
    • 2017-01-28
    • 1970-01-01
    • 2017-12-04
    • 2022-11-10
    • 1970-01-01
    • 1970-01-01
    • 2020-06-10
    • 1970-01-01
    相关资源
    最近更新 更多