从另一个 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
一起用于用户定义的网络)。
目前我是 运行 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
一起用于用户定义的网络)。