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

Linux Docker端口映射(`-p<;host port>;:<;container port>;`)适用于哪个容器接口?,linux,docker,containers,Linux,Docker,Containers,Docker端口映射(-p:)应用于哪个容器接口 在阅读了Docker文档之后,我不确定Docker容器中的Docker端口映射(如(1)和(2))适用于哪个网络接口 默认情况下,将创建一个新容器,其中包含两个接口eth0和lo,但可以添加更多接口 (1) 是-p0.0.0.0:8080:80的缩写 (2) 指IP地址为192.168.1.100的主机上的网络接口,它将主机端口8080映射到容器端口80,但在哪个容器接口上 (1) -p 8080:80 Map TCP port 80 in t

Docker端口映射(
-p:
)应用于哪个容器接口

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

默认情况下,将创建一个新容器,其中包含两个接口
eth0
lo
,但可以添加更多接口

(1) 是
-p0.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)是否在所有容器接口(
0.0.0
)上将主机端口
8080
映射到容器端口
80
?如果是,那么我在文档中哪里可以看到它,并且这种行为可以限制在一组特定的容器接口上


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

“这种行为能被限制在一组特定的容器接口上吗?”这真的没有意义,那么:根据TCP的性质,只有一个接口被连接到

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


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

“这种行为能被限制在一组特定的容器接口上吗?”这真的没有意义,那么:根据TCP的性质,只有一个接口被连接到

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

有一系列的图表可以让这更清楚

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

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

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

iptables-t nat-A预路由-m addrypte-dst类型LOCAL-j DOCKER
iptables-tnat-A输出-d 127.0.0.0/8-m addrtype--dst类型本地-j DOCKER
iptables-t nat-A DOCKER-i-p tcp-m tcp--dport 8080-j DNAT--to destination
在网络中:预路由dport 8080的流量被重定向到容器IP地址

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

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

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

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

iptables-t nat-A预路由-m addrypte-dst类型LOCAL-j DOCKER
iptables-tnat-A输出-d 127.0.0.0/8-m addrtype--dst类型本地-j DOCKER
iptables-t nat-A DOCKER-i-p tcp-m tcp--dport 8080-j DNAT--to destination
在网络中:预路由dport 8080的流量被重定向到容器IP地址


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

在这种细节层次上考虑“容器接口”是不寻常的;通常唯一重要的事情是入站连接将到达容器的
eth0
,因此如果容器进程绑定(2)到127.0.0.1,那么它实际上不会获得入站连接。您是否正在尝试将特定主机接口映射到容器中的多个侦听器?在端口级别这样做会更好一些。您所说的“将特定主机接口映射到容器中的多个侦听器”是什么意思。我的问题是容器内的进程绑定到
127.0.0.1:8080
,但是如果我指定
-p8080:8080
,那么当连接到主机的
127.0.0.1:8080
时,该进程无法获得连接(为什么?)。使用netcat进行测试时,它报告
127.0.0.1:8080
为打开状态,但如果容器进程绑定到
eth0
,则它不会获得连接。@DavidMaze-您是否有参考文档:“通常唯一重要的事情是入站连接将到达容器的eth0”?在这种详细程度上考虑“容器接口”是不寻常的;通常唯一重要的事情是入站连接将到达容器的
eth0
,因此如果容器进程绑定(2)到127.0.0.1,那么它实际上不会获得入站连接。您是否正在尝试将特定主机接口映射到容器中的多个侦听器?在端口级别这样做会更好一些。您所说的“将特定主机接口映射到容器中的多个侦听器”是什么意思。我的问题是容器内的进程绑定到
127.0.0.1:8080
,但是如果我指定
-p8080:8080
,那么当连接到主机的
127.0.0.1:8080
时,该进程无法获得连接(为什么?)。使用netcat进行测试,it代表
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>