【问题标题】:Communicate to Docker host from Docker container从 Docker 容器与 Docker 主机通信
【发布时间】:2016-10-27 23:30:25
【问题描述】:

我正在尝试使用 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服务器通信?

(仅供参考:我正在运行 docker server/client 1.11.2)

我为寻找答案而研究的可能相关的资源:

【问题讨论】:

    标签: docker


    【解决方案1】:

    据我了解,基于两个 cmets[1][2],截至今天(2016.10.27),以下非官方黑客似乎对我有用:

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

    ...
    # 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 — 在撰写本文时,此问题仍处于开放状态,因此它在未来某个时候成为官方并取代任何变通办法的可能性非零;尽管它也可能像它的各种前辈一样被关闭和解雇。

    【讨论】:

      【解决方案2】:

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

      1. Netcat 必须侦听所有接口(或至少在 Docker 客户端可以连接的接口上)。不在本地主机上。 运行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. 对我来说看起来不错:tcp 0 0 0.0.0.0:5555 0.0.0.0:* LISTEN 2. Ping 在有和没有--net=host 的情况下都是成功的,前提是我的问题中描述了 docker 主机名的设置
      • 是否有防火墙阻止了端口 5555 上的请求?如果 docker 主机名没有指向 127.0.0.1 并且您能够从 docker 容器中 ping 它指向的 IP,那么我的猜测是主机上的防火墙。
      • 再次感谢您的回复:据我所知,我没有任何防火墙处于活动状态。您是否能够从 docker 容器成功地与主机的“LISTEN”端口通信?
      • 是的,当然。我可以毫无问题地从容器内通过 SSH 连接到我的 dockerhost。
      • 我也可以这样做,但是我无法连接到我的帖子中提到的简单的 netcat 服务器:你能连接到 netcat 服务器吗?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-21
      相关资源
      最近更新 更多