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

3

目前,我正在一个 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

现在两个应用程序都在运行,我可以通过导航到主机IP的8000端口访问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`

我看到了这个选项,所以我使用--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,并让应用容器通过localhost或将camunda容器链接到我的应用容器来使用camunda服务。实现这一点最简单的方法是什么?
2个回答

4

为什么它不能工作?

容器和主机没有共享本地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

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


请注意,虽然链接的容器图不能形成循环,例如camunda不能链接到app,因为你需要启动一个容器才能链接它,但你可以通过操作IP地址来实现自己想要/需要的任何操作。 同时,你也可以使用--ip选项指定容器的IP地址(尽管它只能与--net一起在用户定义的网络中使用)。


感谢Sebastian给出的答案,我找到了问题所在:当我启动容器时,Camunda未在我映射到的端口(8000)上可用。因此,wget http://camunda:8000 -q -O -将无法工作,而wget http://camunda:8080 -q -O -可以正常工作。如果能够在我自己选择的端口上访问Camunda就更好了,但我想当使用链接的容器时可能不可能实现这一点。 - Koningh
抱歉打错字了,我会编辑帖子以匹配端口。你可以自己选择端口,为什么不能呢?这只是一个配置问题。 - Auzias
标准的Camunda容器暴露端口8080。因此,当我将我的应用程序容器链接到正在运行的Camunda容器时,如何实现在我的应用程序容器内使用端口8000访问Camunda? - Koningh
如果配置不提供更改此端口的选项,则可以使用 socat、使用反向代理,例如nginx,甚至可以添加 iptable 或更改 Camunda 的源代码,因为它是开源的。 - Auzias
2
你正在使用的Camunda docker容器内部启动了一个Tomcat服务器,Camunda已经部署在其中。如果你想要更改Tomcat的端口,可以将自己的配置链接到容器中。例如,下载此server.xml并在第96行更改端口。然后使用-v PATH/TO/server.xml:/camunda/conf/server.xml命令启动容器。 - Sebastian Menski

1

以下是原始答案。请注意,链接已被弃用,推荐使用network进行替换。这在回答这个问题的答案中有解释:docker-compose: difference between network and link

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


“camunda” 代表着特定的东西吗? - Daniel Hernández
不,这只是Docker容器的名称。假设您使用以下--link选项启动名为_container2_的容器:--link container1:otherapp。然后,在_container2_内部,您可以通过在_container1_中运行的应用程序上的端口上的http://otherapp访问_container1_中的容器。 - Koningh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接