Python 3.x 将docker容器环回绑定到主机环回
我拉一个docker图像(将使用python 3作为示例) 然后我启动一个docker容器Python 3.x 将docker容器环回绑定到主机环回,python-3.x,docker,networking,containers,Python 3.x,Docker,Networking,Containers,我拉一个docker图像(将使用python 3作为示例) 然后我启动一个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 然后,我可以从主机访问容器的服务器,而无需任何问
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
然后,我可以从主机访问容器的服务器,而无需任何问题
但是,如果我的docker服务器绑定到127.0.0.1而不是0.0.0.0:
python -m http.server 8000 --bind 127.0.0.1
然后,从主机进行访问不起作用
将容器的环回127.0.0.1绑定到主机环回的正确方法是什么
将容器的环回127.0.0.1绑定到主机环回的正确方法是什么
你不能那样做。容器内的环回
接口表示“仅此容器”,就像主机上的接口表示“仅此主机”。如果某个服务绑定到127.0.0.1
,那么您的主机或其他容器就无法访问该服务
做你想做的事情的唯一方法是:
- 修改应用程序配置以侦听所有接口(或特别是
),或eth0
- 在容器内运行一个绑定到所有接口的代理,并将连接转发到
地址localhost
docker run --network=host
这只适用于Linux,因为在Linux上,您的机器是主机,容器在您的机器操作系统中作为容器运行。在Windows/OSX上,Docker主机作为虚拟机运行,容器在虚拟机中运行,因此它们不能共享您的计算机网络命名空间。这不是真的。Docker容器可以配置为使用您喜欢的任何网络名称空间,包括主机网络名称空间,但需要注意的是,这只适用于Linux(因为在OSX和Windows上,主机实际上是在VM中运行的,它不是您的OSX/Windows机器)。有关更多详细信息,请参阅。因此,如果您在Linux上运行“docker run--network=host”,您的docker容器将能够绑定到主机127.0.0.1,并连接到它。我认为这与“将容器的环回绑定到主机环回”不同。在主机网络名称空间中运行容器将公开容器内的所有主机接口,这不是问题中的具体问题。而且,正如您所说,如果您在MacOS或Windows下运行,在主机网络名称空间中运行在任何情况下都不是一个选项。尽管它可能无法回答这个问题,但它添加了有用的背景信息
docker run --network=host