为什么我不能通过主机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容器的名字)