目前我正在一个docker容器中运行一个node.js应用程序,该容器需要连接到另一个容器中运行的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 -
也会返回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
将我的应用容器链接到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 -
时,我会立即收到正确的响应。
理想情况下,我想启动我的app容器,而无需以任何方式提供外部IP,并让app容器只通过localhost使用camunda服务,或者将camunda容器链接到我的app容器。实现这一目标的最简单方法是什么?
答案 0 :(得分:3)
容器和主机不共享其本地IP堆栈。因此,当您在容器内并尝试anything localhost:port
时,anything
命令将尝试连接到特定于容器的本地IP堆栈,而不是其他容器和主机。
困难:您需要知道其他容器的IP地址并连接到此IP地址。
更轻松,更清洁: .. 链接您的容器。
--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 -
。
请注意,虽然链接容器图表无法循环,例如 camunda 无法链接到 app ,因为您需要启动容器才能链接它,实际上做任何你想要/需要使用IP地址的东西。
另请注意,您可以使用--ip
选项指定容器的IP地址(尽管它只能与--net
一起用于用户定义的网络)。
答案 1 :(得分:1)
使用适用于您的应用容器的--link camunda:camunda
选项。然后,您可以通过http://camunda:8080/...
访问camunda。链接选项使用camunda容器的IP地址向应用程序容器的/etc/hosts
文件添加条目。这也意味着如果重新启动camunda容器,则必须重新启动应用程序容器。