Docker 端口映射原理分析
根据您提供的实验环境,我来详细解释 Docker 端口映射的工作原理:
初始网络环境分析
- 初始网络接口:
docker0: Docker 默认网桥,初始 IP 为 172.17.0.1/16ens33: 宿主机的物理网卡,IP 为 10.0.0.102/24lo: 本地回环接口
创建容器后的变化
-
创建了两个容器:
c1:映射宿主机 81 端口到容器 80 端口c2:映射宿主机 82 端口到容器 80 端口
-
新增的网络接口:
veth86a4799和veth9adb333:这是 Docker 创建的 veth pair(虚拟以太网设备对)的宿主机端
Docker 网络映射原理
-
veth pair 工作原理:
- 每个容器内部有一个 eth0 接口(如 c1 的 eth0@if17)
- 宿主机上对应一个 veth 接口(如 veth86a4799@if16)
- 这两个接口通过虚拟网络管道连接,形成容器与宿主机之间的通信通道
-
网桥连接:
brctl show docker0显示两个 veth 接口都连接到了 docker0 网桥- 这使得容器可以通过 docker0 网桥相互通信
-
IP 分配:
- c1 获得 IP 172.17.0.2
- c2 获得 IP 172.17.0.3
-
端口映射机制:
- 通过 iptables 的 NAT 规则实现:
DNAT tcp -- !docker0 * 0.0.0.0/0 0.0.0.0/0 tcp dpt:81 to:172.17.0.2:80 DNAT tcp -- !docker0 * 0.0.0.0/0 0.0.0.0/0 tcp dpt:82 to:172.17.0.3:80 - 这些规则将宿主机的 81 和 82 端口流量转发到相应容器的 80 端口
- 通过 iptables 的 NAT 规则实现:
-
MASQUERADE 规则:
- 允许容器访问外部网络时进行源地址转换
- 使得外部看到的请求源 IP 是宿主机的 IP 而非容器 IP
关键配置参数
- net.ipv4.ip_forward:
- 必须设置为 1 才能让宿主机转发不同网络接口间的数据包
- 影响容器访问外部网络的能力
常见错误解决方案
-
端口已被占用:
- 更换宿主机映射端口
-
容器名称冲突:
- 使用不同的容器名称或删除/重命名现有容器
-
IPv4 转发未启用:
- 执行
sysctl -w net.ipv4.ip_forward=1启用转发
- 执行
总结
Docker 端口映射的核心是通过:
- veth pair 连接容器和宿主机
- docker0 网桥管理容器网络
- iptables NAT 规则实现端口转发
- 内核 IP 转发功能实现跨网络通信
这种设计使得容器可以安全地与外部网络通信,同时保持网络隔离性。
浙公网安备 33010602011771号