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:直接操作物理网卡,绕过虚拟网桥。

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

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

相关推荐
zizisuo2 小时前
面试篇:Spring Security
网络·数据库·安全
玉笥寻珍2 小时前
Web安全渗透测试基础知识之HTTP参数污染篇
网络·网络协议·安全·web安全·http
GCKJ_08242 小时前
观成科技:加密C2框架Vshell流量分析
网络·科技·信息与通信
李匠20244 小时前
C++GO语言微服务之Dockerfile && docker-compose②
c++·容器
大蚂蚁2号4 小时前
windows文件共享另一台电脑资源管理器网络文件夹无法找到机器
运维·服务器·网络
LetsonH5 小时前
Home Assistant 米家集成:开启智能家居新体验
网络·智能家居
斤斤计较5 小时前
Docker 环境安装(2025最新版)
运维·docker·容器
小锋学长生活大爆炸5 小时前
【教程】Docker方式本地部署Overleaf
运维·docker·容器
掘金者说5 小时前
docker系列-DockerDesktop报错信息(Windows Hypervisor is not present)
运维·docker·容器