Docker网络

Docker 借助 Linux 网络命名空间做网络隔离,提供 4 种网络模式:Host、Container、None、Bridge。

1. Host 模式

  • 命令:docker run --network host 镜像名
  • 原理:容器直接复用宿主机网络命名空间,没有网络隔离,容器和宿主机共用 IP、网卡、端口。
  • 特点:不需要端口映射;宿主机127.0.0.1可以直接访问容器服务。
  • 适用场景:对网络性能要求高的业务。
  • 风险:端口会和宿主机发生冲突。

2. Container 模式

  • 命令:docker run --network container:已有容器名 镜像名
  • 原理:新容器复用另一个已经存在容器的网络命名空间。
  • 特点:两个容器网络配置完全一样,可以直接用localhost互相访问。
  • 适用场景:一组紧密协作的容器,例如主业务容器 + 日志采集容器。

3. None 模式

  • 命令:docker run --network none alpine
  • 原理:不给容器配置任何网络接口,只有本地回环 lo 设备。
  • 特点:容器无法访问外部,外部也访问不到容器,网络完全隔离。
  • 适用场景:本地数据处理、安全隔离场景。

4. Bridge 模式(Docker默认模式)

  • 不指定--network时,默认使用 bridge。
  • 原理:Docker 创建虚拟网桥docker0;每个容器生成独立 veth 虚拟网卡接入 docker0 网桥;给容器分配独立内网 IP。
  • 端口映射语法:-p 宿主机端口:容器端口,例如-p 8080:80。
  • 通信:
    1. 同一网桥下容器之间可以直接通过容器内网 IP 互相访问。
    2. 宿主机通过 iptables NAT/DNAT/MASQUERADE 规则,实现端口转发,把宿主机端口流量转发到容器内部。
  • 适用场景:绝大多数普通容器业务。

Bridge 底层原理

  1. Docker 启动自动创建虚拟网桥docker0,所有默认容器都接入该网桥。
  2. 每个容器一对 veth‑pair 虚拟网卡,一端在容器 net namespace,一端挂到 docker0 网桥。
  3. iptables nat 链负责数据包转发:
    • DNAT:外部访问宿主机端口,转发到容器内网 IP 端口。
    • MASQUERADE:容器访问外网时做源地址伪装。
  4. 宿主机可以直接 ping 通容器分配的内网 IP。

整体技术总结

Docker 网络 = Linux 网络命名空间实现网络隔离 + veth 虚拟网卡 + 网桥 docker0 + iptables NAT 数据包转发,实现容器完整网络通信能力。

更多推荐