容器直连物理网段
macvlan 让容器拿到物理网络里的独立 MAC 与 IP,从局域网其他设备看它就像一台同网段的物理机,访问不需要经过端口映射。创建网络时必须指定父接口、子网与网关,父接口通常是承载业务流量的那块网卡。它带来直观的地址语义,也带来一个固有特性:宿主机默认无法直接访问自己创建的 macvlan 容器。
基本信息
| 创建方式 | docker network create -d macvlan --subnet 段 --gateway 址 -o parent=网卡 名称 |
|---|---|
| 必填项 | 父接口、子网、网关 |
| 典型场景 | 需要被局域网设备直接访问的容器 |
| 已知限制 | 宿主与 macvlan 容器默认互相不可达 |
典型使用场景
- 设备需要被直接访问:应用广播或局域网发现协议,端口映射无法满足
- 保留固定 IP:迁移前后地址不变,便于运维登记与白名单维护
- 替代虚拟机:把轻量服务从虚拟机改为容器,地址规划保持一致
- 演示网络环境:需要容器像真实设备一样出现在同网段里
- 上游设备轮询:某些采集设备只认 IP,不容纳 NAT 后的端口
创建与验证
创建与验证
# 基于物理网卡创建 macvlan 网络
docker network create -d macvlan \
--subnet 192.168.1.0/24 --gateway 192.168.1.1 \
-o parent=eth0 macnet
# 用固定地址启动容器
docker run -d --network macnet --ip 192.168.1.50 --name web nginx:1.27-alpine
# 从同网段的其他机器验证可达性
ping -c 2 192.168.1.50
# 查看容器地址
docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' web与 bridge 网络对照
| 维度 | bridge 网络 | macvlan 网络 |
|---|---|---|
| 地址来源 | 容器内部私有网段 | 物理网段的独立 IP |
| 外部访问方式 | 需要端口映射 | 直接访问容器 IP |
| 宿主机访问容器 | 可以直接访问 | 默认不可访问,需另建接口 |
| 地址管理 | 由 Docker 分配 | 需要自行规划,避免冲突 |
宿主机要访问自己的 macvlan 容器,需要在宿主侧再建一个同网段的 macvlan 接口并把流量指过去;这是 macvlan 的常规做法而不是故障。
云主机与虚拟化平台对 macvlan 的支持取决于底层交换机与安全策略,上线前先在测试环境验证,尤其是网卡是否允许接收带其他 MAC 的帧。