Docker 端口映射原理分析

根据您提供的实验环境,我来详细解释 Docker 端口映射的工作原理:

初始网络环境分析

  1. 初始网络接口
    • docker0: Docker 默认网桥,初始 IP 为 172.17.0.1/16
    • ens33: 宿主机的物理网卡,IP 为 10.0.0.102/24
    • lo: 本地回环接口

创建容器后的变化

  1. 创建了两个容器

    • c1:映射宿主机 81 端口到容器 80 端口
    • c2:映射宿主机 82 端口到容器 80 端口
  2. 新增的网络接口

    • veth86a4799veth9adb333:这是 Docker 创建的 veth pair(虚拟以太网设备对)的宿主机端

Docker 网络映射原理

  1. veth pair 工作原理

    • 每个容器内部有一个 eth0 接口(如 c1 的 eth0@if17)
    • 宿主机上对应一个 veth 接口(如 veth86a4799@if16)
    • 这两个接口通过虚拟网络管道连接,形成容器与宿主机之间的通信通道
  2. 网桥连接

    • brctl show docker0 显示两个 veth 接口都连接到了 docker0 网桥
    • 这使得容器可以通过 docker0 网桥相互通信
  3. IP 分配

    • c1 获得 IP 172.17.0.2
    • c2 获得 IP 172.17.0.3
  4. 端口映射机制

    • 通过 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 端口
  5. MASQUERADE 规则

    • 允许容器访问外部网络时进行源地址转换
    • 使得外部看到的请求源 IP 是宿主机的 IP 而非容器 IP

关键配置参数

  1. net.ipv4.ip_forward
    • 必须设置为 1 才能让宿主机转发不同网络接口间的数据包
    • 影响容器访问外部网络的能力

常见错误解决方案

  1. 端口已被占用

    • 更换宿主机映射端口
  2. 容器名称冲突

    • 使用不同的容器名称或删除/重命名现有容器
  3. IPv4 转发未启用

    • 执行 sysctl -w net.ipv4.ip_forward=1 启用转发

总结

Docker 端口映射的核心是通过:

  1. veth pair 连接容器和宿主机
  2. docker0 网桥管理容器网络
  3. iptables NAT 规则实现端口转发
  4. 内核 IP 转发功能实现跨网络通信

这种设计使得容器可以安全地与外部网络通信,同时保持网络隔离性。

posted on 2025-04-01 19:03  Leo-Yide  阅读(57)  评论(0)    收藏  举报