Docker 的各种网络模式

Docker 的各种网络模式是通过 Linux 内核的网络虚拟化技术(如网络命名空间、虚拟网桥、VETH 对、iptables、Overlay 隧道等)实现的。下面详细说明每种模式的实现原理及关键配置。


1. Bridge 模式(默认)

实现原理

  1. docker0 网桥

    • Docker 启动时自动创建虚拟网桥 docker0(Linux Bridge)。

    • 网桥分配私有子网(如 172.17.0.0/16),并通过 DHCP 为容器分配 IP。

  2. VETH 对(虚拟以太网设备)

    • 每个容器创建一个网络命名空间(Network Namespace),并通过一对 VETH 设备连接容器和 docker0 网桥。

    • 一端在容器内命名为 eth0,另一端附加到 docker0

  3. NAT 与端口映射

    • 通过 iptables 实现 SNAT(容器访问外网)和 DNAT(外部访问容器端口)。

    • 例如:docker run -p 8080:80 会添加 iptables 规则将主机 8080 端口转发到容器 80 端口。

关键命令

复制代码
# 查看 docker0 网桥
brctl show docker0

# 查看容器的网络命名空间
ls /var/run/docker/netns/

# 查看 iptables NAT 规则
iptables -t nat -L -n

2. Host 模式

实现原理

  • 容器直接共享主机的网络命名空间,使用主机的 eth0 和端口。

  • 无虚拟网桥或 NAT,容器网络栈与主机完全一致。

关键命令

复制代码
docker run --network=host nginx  # 容器直接监听主机的 80 端口

3. None 模式

实现原理

  • 容器仅有 lo 回环接口,无外部网络连接。

  • 如需网络,需手动配置(例如通过 ip netns 命令操作容器的网络命名空间)。

关键命令

复制代码
# 进入容器的网络命名空间配置网络
docker inspect --format '{{.NetworkSettings.SandboxKey}}' <容器ID>
nsenter --net=<SandboxKey路径> ip addr add 192.168.1.100/24 dev eth0

4. Overlay 模式(跨主机网络)

实现原理

  1. VXLAN 隧道

    • 通过 VXLAN 封装跨主机的容器流量,底层是 UDP 端口(默认 4789)。

    • 每个容器网络分配唯一的 VXLAN Network ID(VNI)。

  2. Swarm 集群协调

    • Docker Swarm 使用 gossip 协议同步节点信息,并通过 KV 存储(如 etcd)管理网络状态。
  3. 数据平面

    • Linux 内核的 vxlan 模块处理封包/解包。

    • 通过 iptables 实现负载均衡和服务发现。

关键命令

复制代码
# 创建 Overlay 网络(需 Swarm 模式)
docker network create -d overlay my-overlay

# 查看 VXLAN 设备
ip -d link show vxlan0

5. Macvlan 模式

实现原理

  1. 虚拟 MAC 地址

    • 为容器的 eth0 分配独立的 MAC 地址,直接绑定到主机的物理网卡(如 eth0)。
  2. 子接口

    • 主机的物理网卡创建子接口(如 eth0.100@eth0),每个子接口对应一个 Macvlan 网络。
  3. 交换机依赖

    • 需物理交换机支持混杂模式(Promiscuous Mode),允许一个物理网卡接收多个 MAC 地址的流量。

关键命令

复制代码
# 创建 Macvlan 网络
docker network create -d macvlan \
  --subnet=192.168.1.0/24 \
  --gateway=192.168.1.1 \
  -o parent=eth0 \
  my-macvlan

6. IPvlan 模式

实现原理

  1. 共享 MAC 地址

    • 多个容器共享主机的物理网卡 MAC 地址,通过不同 IP 区分。
  2. L2 与 L3 模式

    • L2 模式:容器在同一广播域内,依赖 ARP 通信。

    • L3 模式:容器通过路由通信,需配置静态路由或三层交换机。

关键命令

复制代码
# 创建 IPvlan L2 网络
docker network create -d ipvlan \
  --subnet=192.168.1.0/24 \
  -o parent=eth0 \
  my-ipvlan

7. 自定义网络(User-Defined Bridge)

实现原理

  1. 自定义网桥

    • 用户创建的网桥(如 br-custom)替代默认的 docker0
  2. 内置 DNS 服务

    • Docker 为自定义网络启动内嵌的 DNS 服务器,支持容器名称解析。
  3. 网络隔离

    • 可通过 --internal 禁止容器访问外网。

关键命令

复制代码
# 创建自定义 Bridge 网络
docker network create --driver=bridge \
  --subnet=10.1.0.0/16 \
  --gateway=10.1.0.1 \
  my-bridge

底层技术总结

技术 作用 相关命令/工具
网络命名空间 隔离容器的网络栈 ip netns
VETH 对 连接容器与网桥/主机 ip link add veth0 type veth
Linux Bridge 实现二层交换(如 docker0 brctl show
iptables NAT/端口映射/防火墙 iptables -t nat -L
VXLAN 跨主机的 Overlay 隧道 ip -d link show vxlan0
MACVLAN/IPVLAN 直接接入物理网络 ip link add macvlan0 link eth0 type macvlan

配置示例

跨主机 Overlay 网络(Swarm 模式)

复制代码
# 初始化 Swarm
docker swarm init

# 创建 Overlay 网络
docker network create -d overlay --attachable my-overlay

# 在 Overlay 网络中启动服务
docker service create --network=my-overlay nginx

Macvlan 网络(容器直连物理网络)

复制代码
docker network create -d macvlan \
  --subnet=192.168.1.0/24 \
  --gateway=192.168.1.1 \
  -o parent=eth0 \
  my-macvlan

docker run --network=my-macvlan --ip=192.168.1.100 nginx

总结

  • Bridge/Host/None:依赖 Linux 基础网络虚拟化技术(网桥、命名空间)。

  • Overlay:基于 VXLAN 和集群协调(Swarm/Kubernetes)。

  • Macvlan/IPvlan:直接操作物理网卡,绕过虚拟网桥。

  • 自定义网络:通过用户定义的网桥增强灵活性和隔离性。

理解这些实现原理后,可以更精准地选择网络模式并排查问题(如性能瓶颈、连通性故障)。

相关推荐
凉伊22 分钟前
TCP协议核心机制详解:握手、挥手、可靠传输与拥塞控制
网络·网络协议·tcp
感哥28 分钟前
Docker镜像
docker
Dontla31 分钟前
Dockerfile解析器指令(Parser Directive)指定语法版本,如:# syntax=docker/dockerfile:1
java·docker·eureka
fatiaozhang95271 小时前
中国移动浪潮云电脑CD1000-系统全分区备份包-可瑞芯微工具刷机-可救砖
android·网络·电脑·电视盒子·刷机固件·机顶盒刷机
jyhappy1232 小时前
USB系统学习笔记 - 从概念到抓包解析
网络
青草地溪水旁2 小时前
互联网接入网中PPPoE和PPP协议
网络·ppp·接入网
楠神说软件测试3 小时前
Docker命令(全)
docker
LuiChun3 小时前
docker desktop更新到【4.45.0 】后,旧容器镜像都丢失了
docker·容器·dubbo
子兮曰3 小时前
🔥C盘告急!WSL磁盘暴增?三招秒清20GB+空间
前端·windows·docker
ZLRRLZ3 小时前
【Docker】Docker安装
运维·docker·容器