从Docker容器与Docker主机通信

时间:2016-08-13 20:31:17

标签: docker

我正在尝试使用docker网络,而我似乎无法找到实现以下目标的方法:

在主机中启动一个简单的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选项启动docker,它可以正常工作:

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)的情况下从docker容器内与简单主机netcat服务器进行通信?

(fyi:我正在运行docker server / client 1.11.2)

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

2 个答案:

答案 0 :(得分:0)

为了解决这个问题,您需要了解一些事项。

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

答案 1 :(得分:0)

据我了解,基于两条评论[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 - 截至撰写时,此问题仍未解决,因此未来某些时候可能成为正式的非零机会并取代任何变通办法;虽然它可能也会像其各个前辈那样被关闭和解雇。