在 Docker 中,端口映射的实现是通过 iptables
的 NAT 表和 PREROUTING
链来完成的。具体来说,Docker 使用以下 iptables
规则链来管理端口映射:
-
PREROUTING
链:- 这是 NAT 表中的一个链,用于处理所有到达宿主机的流量。在这里,Docker 通过修改目的 IP 地址和端口号,将外部请求重定向到容器的内部 IP 地址和端口上。
- 当请求到达宿主机时,
PREROUTING
链会捕获请求并根据 Docker 设置的规则,将请求重定向到对应容器的网络接口。
示例命令查看 PREROUTING 链:
iptables -t nat -L PREROUTING
-
OUTPUT
链:- 当请求是由宿主机自身发起时,会通过 NAT 表的
OUTPUT
链。同样地,Docker 会在这里添加规则,确保宿主机自己发出的请求可以正确映射到容器的网络接口。
- 当请求是由宿主机自身发起时,会通过 NAT 表的
-
POSTROUTING
链:- 当数据包从容器发出并返回到外部时,Docker 使用 NAT 表中的
POSTROUTING
链来修改源地址。这保证了容器的返回流量可以正确地发送回外部客户端。
- 当数据包从容器发出并返回到外部时,Docker 使用 NAT 表中的
-
DOCKER
链:- Docker 会在 NAT 表中创建一个名为
DOCKER
的自定义链,用于管理容器的端口映射和 NAT 规则。 PREROUTING
链中的规则会指向DOCKER
链,并在这里处理具体的端口映射。
示例查看 DOCKER 链:
iptables -t nat -L DOCKER
- Docker 会在 NAT 表中创建一个名为
端口映射工作流程:
- 当你使用
docker run -p <host_port>:<container_port>
启动一个容器时,Docker 会通过iptables
将宿主机的<host_port>
映射到容器的<container_port>
。 PREROUTING
链中的规则会捕获外部发向<host_port>
的流量,重定向到容器的 IP 地址和<container_port>
。
总结一下,Docker 的端口映射主要通过 NAT 表 中的 PREROUTING
链 和 DOCKER
链 来实现的。这些链协作,确保外部请求可以被正确地转发到容器中对应的端口。