【问题标题】:What container interface(s) does Docker port mapping (`-p <host-port>:<container-port>`) apply to?Docker 端口映射 (`-p <host-port>:<container-port>`) 适用于哪些容器接口?
【发布时间】:2020-02-10 10:59:08
【问题描述】:

Docker 端口映射 (-p &lt;host-port&gt;:&lt;container-port&gt;) 适用于哪个容器接口?

阅读 Docker 文档后,我不确定 Docker 容器中的哪个网络接口(如(1)和(2))适用于 Docker 端口映射。

默认情况下,会使用eth0lo 两个接口创建一个新容器,但可以添加更多接口。

(1) 是-p 0.0.0.0:8080:80 的简写。

(2) 指的是IP地址为192.168.1.100的主机上的网络接口,它将主机端口8080映射到容器端口80,但是在哪个容器接口上呢?

(1) -p 8080:80  Map TCP port 80 in the container to port 8080 on the Docker host.

(2) -p 192.168.1.100:8080:80    Map TCP port 80 in the container to port 8080 on the Docker host for connections to host IP 192.168.1.100.

是否 (1) 和 (2) 将主机端口 8080 映射到所有容器接口 (0.0.0.0) 上的容器端口 80?如果,那么我可以在文档中的哪里看到,这种行为是否可以限制为一组特定的容器接口?

https://docs.docker.com/config/containers/container-networking/

【问题讨论】:

  • 在这种细节级别上考虑“容器接口”是不寻常的;通常唯一重要的是入站连接将到达容器的eth0,因此如果容器进程 bind(2) 到 127.0.0.1 那么它实际上不会获得入站连接。您是否正在尝试将特定主机接口映射到容器内的多个侦听器?在端口级别执行此操作会更好一些。
  • “将特定主机接口映射到容器内的多个侦听器”是什么意思?我的问题是容器内的一个进程绑定到127.0.0.1:8080,但是如果我指定-p 8080:8080,那么当连接到我的主机的127.0.0.1:8080 时,该进程无法获得连接(为什么?)。使用 netcat 进行测试,它报告 127.0.0.1:8080 是打开的,但容器进程没有得到连接,如果它绑定到 eth0 而不是。
  • @DavidMaze - 您是否有参考文档:“通常唯一重要的是入站连接将到达容器的 eth0”?

标签: linux docker containers


【解决方案1】:

TCP 连接具有单一起点(IP+端口)和单一终点(IP+端口)。因此,端口转发只能映射到容器中的一个 IP 地址。具体来说就是桥接网络接口。

“这种行为是否可以限制在一组特定的容器接口”实际上没有意义,那么:根据 TCP 的性质,只有一个接口被连接。

如果您担心在容器内监听 127.0.0.1 的内容会被公开,那么不要;他们不会(也不能)。

https://pythonspeed.com/articles/docker-connection-refused/ 有一堆图表可能会让这更清楚。

【讨论】:

  • 谢谢,桥接网络接口是指自动创建的eth0接口?就我而言,我有一个绑定到127.0.0.1:8080 的容器进程。如何从主机访问它?是否需要设置iptables防火墙规则,还是可以使用docker配置?
  • 您是否有资源记录以下语句:“特别是桥接网络接口。”?
  • you mean the eth0 interface created automatically? - 容器看到 eth0。根据 docker 网络驱动程序,主机会看到不同的接口。通常使用桥接网络驱动程序,因此主机看到连接到容器的桥接接口。 How can I access this from the host? 就像您将两台机器通过电缆连接一样。连接到&lt;ip address of container&gt;:8080Do you have a resource documentingdocker bridge networks.
  • @KamilCuk - 所以,你是说我可以通过连接到容器 IP 地址来连接到监听 `127.0.0.1:80801 的容器进程?你确定吗?
【解决方案2】:

在所有容器接口 (0.0.0.0) 上执行 (1) 和 (2) 将主机端口 8080 映射到容器端口 80

不完全是。 (1) 将主机端口 8080 映射到所有 主机 接口上的容器端口 80。 (2) 将IP地址为192.168.1.100的host接口上的主机端口8080映射到容器的80端口。

具体来说,它会做一些事情(从我的机器复制):

iptables -t nat -A PREROUTING -m addrypte --dst-type LOCAL -j DOCKER
iptables -t nat -A OUTPUT ! -d 127.0.0.0/8 -m addrtype --dst-type LOCAL -j DOCKER
iptables -t nat -A DOCKER ! -i <bridge docker interface> -p tcp -m tcp --dport 8080 -j DNAT --to-destination <container-IP-address>

在 net:PREROUTING 中,dport 8080 的流量被重定向到容器 IP 地址。

我相信您似乎很困惑,并认为容器具有多个接口。容器(通常)有一个接口并连接到一个 docker 网络。

【讨论】:

  • 谢谢,但您的回答需要更笼统。一个容器可能有更多的接口,默认情况下它有两个接口:loeth0。我的问题是端口映射 (-p) 的目标容器接口是什么。
  • 嗯,我没有将lo 视为“真实”接口...所以它从容器端“瞄准”eth0。
猜你喜欢
  • 2020-02-29
  • 2019-08-28
  • 1970-01-01
  • 2015-08-26
  • 2022-11-28
  • 1970-01-01
  • 2020-07-23
  • 1970-01-01
  • 2017-08-02
相关资源
最近更新 更多