Docker端口映射(-p <host-port>:<container-port>`)适用于哪些容器接口?

时间:2020-02-10 10:59:08

标签: linux docker containers

Docker端口映射(-p <host-port>:<container-port>)适用于哪个容器接口?

在阅读了Docker文档之后,我不确定(1)和(2)之类的Docker端口映射适用于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映射到所有容器接口(80)上的容器端口0.0.0.0?如果可以,那么我在文档中哪里可以看到,并且可以将这种行为限制为一组特定的容器接口吗?

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

2 个答案:

答案 0 :(得分:1)

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

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

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

https://pythonspeed.com/articles/docker-connection-refused/上有一堆图,可能会使其更清楚。

答案 1 :(得分:-1)

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

不完全是。 (1)将主机端口8080映射到所有 host 接口上的容器端口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地址。

我相信您似乎很困惑,并假设容器具有多个接口。容器通常具有一个接口,并连接到一个泊坞窗网络。