为什么我不能通过主机curl一个docker集装箱

我真的不明白这里发生了什么事。 我只是想在一个发布的端口上,通过主机的公共IP ,从一个docker集装箱到另一个docker集装箱执行一个http请求。

这是我的设置。 我有我的开发机器。 我有一个docker主机与两个容器。 CONT_A在端口3000上监听和发布Web服务。

DEV-MACHINE HOST (Public IP = 111.222.333.444) CONT_A (Publish 3000) CONT_B 

在这里输入图像说明

在我的开发机器上(一个完全不同的机器)

我可以curl没有任何问题

 curl http://111.222.333.444:3000 --> OK 

当我SSH进入主机

我可以curl没有任何问题

 curl http://111.222.333.444:3000 --> OK 

当我在CONT_B内执行时

不可能,只是暂停。 平安虽然…

 docker exec -it CONT_B bash $ curl http://111.222.333.444:3000 --> TIMEOUT $ ping 111.222.333.444 --> OK 

为什么?

Ubuntu 16.04,Docker 1.12.3(默认networking设置)

我知道这不是严格的问题的答案,但有更多的Docker解决你的问题的方式。 我会忘记发布集装箱间通信的端口。 相反,使用docker群创build一个覆盖networking。 你可以在这里find完整的指南,但实质上你做了以下几点:

 //create network docker network create --driver overlay --subnet=10.0.9.0/24 my-net //Start Container A docker run -d --name=A --network=my-net producer:latest //Start Container B docker run -d --name=B --network=my-net consumer:latest //Magic has occured docker exec -it B /bin/bash > curl A:3000 //MIND BLOWN! 

然后在容器内,你可以只是curl主机名A,它会解决你(即使当你开始做缩放等)

如果你不喜欢使用Docker群,你仍然可以使用Docker旧版链接:

 docker run -d --name B --link A:A consumer:latest 

这将链接您的A容器中的任何公开的(未发布的)端口。

最后,如果你开始转向生产…忘了关于链接和覆盖networking…使用Kubernetes :-)有点困难的初始设置,但他们引入了一堆的概念和工具,使集装箱连接和缩放集群很容易! 但这只是我个人的意见。

我有一个类似的问题,我有一个容器中的nginx服务器(让我们称之为networking)与几个服务器块和cron安装在另一个容器(让我们叫它cron)。 我使用docker撰写。 我想不时地从cron使用curl到web上执行一个应用程序的一些PHP脚本。 它应该看起来如下:

 curl http://app1.example.com/some_maintance.php 

但是我经常在一段时间之后让主机无法访问。

第一个解决scheme是更新cron容器中的/ etc / hosts,并添加:

 1.2.3.4 app1.example.com 

其中1.2.3.4是Web容器的IP,它工作 – 但这是一个黑客 – 也据我所知,这种手动更新不鼓励。 您应该在extra_hosts中使用extra_hosts ,这需要使用显式IP地址而不是容器名来指定IP地址。

我试图使用自定义networking解决scheme,正如我所看到的是解决这个问题的正确方法,但我从来没有在这里取得成功。 如果我学会了如何做到这一点,我保证更新这个答案。

最后,我使用curlfunction来指定服务器的IP地址,并将域名作为单独的parameter passing给标题:

 curl -H'Host: app1.example.com' web/some_maintance.php 

不是很漂亮,但工作。

(这里的web是我的nginx容器的名字)