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

时间:2016-03-08 12:37:22

标签: node.js docker camunda

目前我正在一个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容器。实现这一目标的最简单方法是什么?

2 个答案:

答案 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容器,则必须重新启动应用程序容器。