什么是 ipvlan 网络
ipvlan 让多个容器共享同一个父接口的 MAC 地址、靠 IP 区分流量,容器看起来像接在同一块二层网卡上。相比 macvlan,它对交换机 MAC 地址表的压力小得多:一个物理口只占用一个 MAC。默认 l2 模式,l3 模式需要自行规划路由。
基本信息
| 创建语法 | docker network create -d ipvlan -o parent=eth0 ... |
|---|---|
| 模式 | l2(默认)/ l3 |
| 关键选项 | --subnet / --gateway / -o parent= |
| 依赖 | 宿主内核需支持 ipvlan 模块 |
| 限制 | 容器访问父接口所在的宿主本身常需额外配置 |
典型使用场景
- 容器需要获得与物理网络同网段的真实地址,直接对外提供服务
- 接入交换机 MAC 表容量紧张,不希望每个容器都占一个 MAC
- 网络实验:同一物理口上放多组容器,用 IP 区分不同业务
- 需要容器参与三层路由、由外部路由器决定转发路径的场景
- 多租户接入:各租户容器同网段但需要严格的策略控制
创建与使用
创建与使用
# 用 l2 模式建一个与物理网段同址的网络,容器共享 eth0 的 MAC
docker network create -d ipvlan \
--subnet 192.168.1.0/24 --gateway 192.168.1.1 \
-o parent=eth0 ipvlan-net
docker run -d --network ipvlan-net --ip 192.168.1.60 --name api nginx:1.27-alpine
docker run --rm --network ipvlan-net --ip 192.168.1.61 alpine ip addr show # 核对地址与接口ipvlan 与 macvlan 选择依据
| 对比项 | ipvlan | macvlan |
|---|---|---|
| MAC 占用 | 容器共享父口 MAC | 每个容器一个独立 MAC |
| 交换机压力 | 小 | 大,MAC 表易溢出 |
| 广播与组播 | 受限 | 支持较好 |
| 典型场景 | 大规模密集接入 | 需要广播能力的传统应用 |
l3 模式不转发二层广播,必须自行规划路由;在没准备好路由的情况下切换模式,结果是容器完全不通,切换前先在测试环境验证。
内核对 ipvlan 的支持与版本相关,较老内核上创建会直接报错,动手前用 modinfo ipvlan 确认模块可用。
ipvlan 由内核直接做接口分流,不依赖二层桥接,因此容器发出的流量不会在同一宿主上的其他容器里被看到;做抓包分析时要到父接口或对端设备上抓。
同一父接口上同时存在多个 ipvlan 网络时,地址段必须错开;地址重叠会让内核路由出现歧义,表现为容器时通时不通。