【问题标题】:Bind docker container loopback to the host loopback将 docker 容器环回绑定到主机环回
【发布时间】:2018-06-21 19:39:21
【问题描述】:

我拉了一个 docker 镜像(将以 python 3 为例)

docker pull python:3.6

然后我启动一个 docker 容器

docker run -it -p 127.0.0.1:8000:8000 python:3.6 bash

(注意这里的 127.0.0.1:8000:8000 中的 127.0.0.1 允许指定目标,主机 IP 但不能指定源)

所以如果我在 0.0.0.0 的容器内启动服务器:

python -m http.server 8000 --bind 0.0.0.0

然后我可以通过主机上的http://127.0.0.1:8000 毫无问题地从主机访问容器的服务器

但是,如果我的 docker 服务器绑定到 127.0.0.1 而不是 0.0.0.0:

python -m http.server 8000 --bind 127.0.0.1

然后从主机访问http://127.0.0.1:8000 不起作用。

将容器的环回127.0.0.1绑定到主机环回的正确方法是什么?

【问题讨论】:

    标签: python-3.x docker networking containers


    【解决方案1】:

    将容器的环回127.0.0.1绑定到主机环回的正确方法是什么?

    你不能那样做。容器内的loopback 接口表示“仅此容器”,就像在主机上表示“仅此主机”一样。如果服务绑定到127.0.0.1,则无法从您的主机或其他容器访问该服务。

    做你想做的事情的唯一方法是:

    • 修改应用程序配置以监听所有接口(或特别是eth0),或
    • 在您的容器内运行一个代理,该代理绑定到所有接口并将连接转发到localhost 地址。

    【讨论】:

    • 这不是真的。 Docker 容器可以配置为使用您喜欢的任何网络名称空间,包括主机网络名称空间 - 需要注意的是,这仅适用于 Linux(因为在 OSX 和 Windows 上,主机实际上是在 VM 中运行,而不是您的 OSX/Windows机器)。有关详细信息,请参阅docs.docker.com/network/host。因此,如果您在 Linux 上运行“docker run --network=host”,您的 docker 容器将能够绑定到主机 127.0.0.1,并连接到它。
    • 我认为这与“将容器的环回绑定到主机环回”不同。在主机网络命名空间中运行容器会暴露容器内的 all 主机接口,这不是问题中的具体问题。而且,正如您所说,如果您在 MacOS 或 Windows 下运行,则无论如何都不能在主机网络命名空间中运行。
    【解决方案2】:

    将容器的环回127.0.0.1绑定到主机环回的正确方法是什么?

    在 Linux 上,这可以通过将 Docker 容器配置为使用 hosts 网络命名空间来完成,即:

    docker run --network=host
    

    这仅适用于 Linux,因为在 Linux 上,您的机器是主机,而容器在您的机器操作系统中作为容器运行。在 Windows/OSX 上,Docker 主机作为虚拟机运行,容器在虚拟机中运行,因此它们不能共享您的机器网络命名空间。

    【讨论】:

    • 虽然它可能无法回答问题,但它添加了有用的背景信息
    猜你喜欢
    • 2016-07-27
    • 1970-01-01
    • 1970-01-01
    • 2021-11-07
    • 1970-01-01
    • 2017-11-19
    • 1970-01-01
    • 1970-01-01
    • 2019-10-30
    相关资源
    最近更新 更多