从另一个 docker 容器中访问 docker 容器中的服务 运行

Access service running in docker container from inside another docker container

目前我是 运行 node.js 应用程序,位于 docker 容器内,需要连接到在另一个容器中运行的 camunda。

我使用以下命令启动容器

docker run -d --restart=always --name camunda -p 8000:8080 camunda/camunda-bpm-platform:tomcat-7.4.0
docker run -d --name app -p 3000:3000 app

这两个应用程序现在都是 运行,我可以通过在端口 8000 上导航到主机的 IP 来访问 camunda,运行 wget http://localhost:8000 -q -O - 也 returns camunda 页面.当我使用 docker exec -it app sh 登录到我的应用程序容器并键入 wget http://localhost:8000 -q -O - 时,我无法访问 camunda。相反,我收到以下错误:

 wget: can't connect to remote host (127.0.0.1): Connection refused

当我使用 --link camunda:camunda link 我的应用程序容器到 camunda 容器,并在我的应用程序容器中键入 wget http://camunda:8000 -q -O - 时,我收到以下错误:

wget: can't connect to remote host (172.17.0.4): Connection refused`

我已经看到 this option,所以我用 --add-host camunda:my_hosts_ip 启动了我的应用程序容器并再次尝试 wget,结果是:

 wget: can't connect to remote host (149.210.227.191): Operation timed out

然而,当在我的主机上 运行 wget http://149.210.227.191:5001 -q -O - 时,我立即得到正确的响应。

理想情况下,我只想启动我的应用程序容器而无需以任何方式提供外部 IP,并让应用程序容器仅通过本地主机或通过 linking camunda 使用 camunda 服务容器到我的应用程序容器。实现此目标的最简单方法是什么?

原回答如下。请注意 link 已被弃用,推荐的替代品是网络。这在这个问题的答案中有解释:

-- 为您的应用程序容器使用 --link camunda:camunda 选项。然后你可以通过 http://camunda:8080/... 访问 camunda。 link 选项使用 camunda 容器的 IP 地址向应用程序容器的 /etc/hosts 文件添加一个条目。这也意味着如果您重新启动 camunda 容器,则必须重新启动您的应用程序容器。

为什么不起作用?

容器和主机不共享它们的本地 IP 堆栈。因此,当您在容器中并尝试 anything localhost:port 时,anything 命令将尝试连接到容器特定的本地 IP 堆栈,而不是其他容器或主机。

如何让它发挥作用?

困难的方法: 你要么需要知道另一个容器的 IP 地址,然后连接到这个 IP 地址..

更简单、更清洁的方法: .. link 您的容器。

  --link=[]
      Add link to another container in the form of <name or id>:alias or just <name or id> in which case the alias will match the name

所以你需要执行,假设 camunda 容器被命名为 camunda:

docker run -d --name app -p 3000:3000 --link camunda app

然后,一旦您 docker-exec 进入容器 app,您将能够执行 wget http://camunda:8080 -q -O - 而不会出错。


请注意,虽然 linked 容器图不能循环,例如,camunda 不能 linked 到 app 因为你需要启动一个容器才能 link 它,你实际上做任何你 want/need 使用 IP 地址的事情。 另请注意,您可以使用 --ip 选项指定容器的 IP 地址(尽管它只能与 --net 一起用于用户定义的网络)。