繁体   English   中英

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

[英]Access service running in docker container from inside another docker container

目前我正在一个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登录我的app容器并键入wget http://localhost:8000 -q -O - ,我无法访问camunda。 相反,我收到以下错误:

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

当我使用--link camunda:camunda将我的app容器链接到camunda容器,并在我的app容器中输入wget http://camunda:8000 -q -O - ,我收到以下错误:

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

我见过这个选项 ,所以我用--add-host camunda:my_hosts_ip启动了我的app容器并再次尝试了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,并让app容器通过localhost使用camunda服务或将camunda容器链接到我的app容器。 实现这一目标最简单的方法是什么?

为什么不起作用?

容器和主机不共享其本地IP堆栈。 因此,当您在容器内并尝试anything localhost:portanything命令将尝试连接到特定于容器的本地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 -ed放入容器应用程序中,你就可以执行wget http://camunda:8080 -q -O -而不会出错。


请注意,虽然链接的容器图形无法循环,例如, camunda无法链接到应用程序,因为您需要启动容器以便能够链接它,您实际上做任何您想要/需要使用IP地址。 另请注意,您可以使用--ip选项指定容器的IP地址(尽管它只能与--net一起用于用户定义的网络)。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM