将docker容器环回绑定到主机环回

Ily*_*mov 5 networking containers python-3.x docker

我拉了一个 docker 镜像(将使用 python 3 作为示例)

docker pull python:3.6
Run Code Online (Sandbox Code Playgroud)

然后我启动一个 docker 容器

docker run -it -p 127.0.0.1:8000:8000 python:3.6 bash
Run Code Online (Sandbox Code Playgroud)

(请注意,这里 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
Run Code Online (Sandbox Code Playgroud)

然后我可以通过在主机上访问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
Run Code Online (Sandbox Code Playgroud)

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

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

Jam*_*per 6

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

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

docker run --network=host
Run Code Online (Sandbox Code Playgroud)

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


lar*_*sks 5

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

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

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

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

  • 我认为这与“将容器的环回绑定到主机环回”不同。在主机网络命名空间中运行容器会公开容器内的“所有”主机接口,这不是问题中的具体要求。而且,正如您所说,如果您在 MacOS 或 Windows 下运行,则在任何情况下都不能选择在主机网络命名空间中运行。 (3认同)