Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/docker/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typo3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 3.x 将docker容器环回绑定到主机环回_Python 3.x_Docker_Networking_Containers - Fatal编程技术网

Python 3.x 将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图像(将使用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服务器绑定到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
    地址
将容器的环回127.0.0.1绑定到主机环回的正确方法是什么

在Linux上,这可以通过配置Docker容器以使用主机网络名称空间来实现,即:

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