从Docker容器通信到Docker主机

我正在尝试与dockernetworking,我似乎无法find一种方法来完成以下内容:

在主机上启动一个简单的netcat服务器:

nc -l -p 5555 

然后从docker集装箱传送给该服务器,例如,

 # grab the docker network interface ip hostip=$(ip route | awk '/docker0/ { print $NF }') # pass in the docker network interface as a host and try a curl command docker run --add-host=docker:"${hostip}" --rm -it hiromasaono/curl curl docker:5555 

curl请求只是挂起,主机netcat服务器没有收到请求。

如果我使用--net=host选项启动--net=host ,它可以工作:

 docker run --net=host --rm -it hiromasaono/curl curl 127.0.0.1:5555 

和netcat服务器接收

 GET / HTTP/1.1 User-Agent: curl/7.35.0 Host: 127.0.0.1:5555 Accept: */* 

如何在不使用--net=host (默认是--net=bridge )的情况下从--net=bridge容器内与简单主机netcat服务器进行通信?

(fyi:我正在运行docker服务器/客户端1.11.2)

Potentailly我研究过的相关资源寻找答案:

  • 文档如何从容器连接到docker主机(github问题)
  • 如何从容器连接到Docker主机(github问题)
  • 允许Docker容器连接到本地Postgres数据库
  • Docker容器networking文档

据我了解,根据两条评论[1] [2] ,截至今日(2016.10.27),下面的非官方黑客似乎正在为我工​​作:

在需要连接到Docker主机的应用程序的Dockerfile中,我添加了以下几行:

 ... # netstat RUN apt-get update && apt-get install net-tools -y ... CMD (netstat -nr | grep '^0\.0\.0\.0' | awk '{print $2" dockerhost"}' >> /etc/hosts) && \ ...old CMD line... ... 

这似乎使Docker主机在容器内作为dockerhost


请注意未来的读者:另请参阅https://github.com/docker/docker/issues/23177 – 截至撰写时,这个问题仍然是开放的,所以在将来某个时候有可能成为正式的取代任何解决方法; 尽pipe它也可能像其前辈一样被封闭和解散。

为了解决这个问题,你需要研究几件事情。

  1. Netcat必须监听所有接口(或者至less在Docker客户端可以连接的接口上)。 不在本地主机上。 运行netcat -l -p 5555如果在另一个terminal上运行netstat -a -l -n | grep 5555 netstat -a -l -n | grep 5555你应该看到0.0.0.0:5555*:5555 。 如果您看到127.0.0.1:5555那么它将无法正常工作,您需要在查看Docker之前先解决此问题。
  2. Docker必须能够ping docker主机,并且不能parsing为127.0.0.1 。 尝试docker run --net=host --rm -it hiromasaono/curl ping docker 。 如果你看到它正在ping 127.0.0.1那么你的configuration是错误的,你需要修复这一行: hostip=$(ip route | awk '/docker0/ { print $NF }') 。 如果它不是127.0.0.1,但ping不成功,那么你的networking设置是错误的或者hostip是错误的。