Lab / Docker

Docker MACVLAN Network creation error 排查

一次 Docker macvlan 网络创建失败的排查记录:残留网络、VLAN 子接口和长期方案。

问题现象

创建 Docker macvlan 网络时,命令报错,表现为网络名或网络配置看起来不存在,但 Docker 仍然认为相关资源冲突。

典型场景:

  • 之前创建过同名网络。
  • 网络删除不完整。
  • Docker 网络数据库残留。
  • 父接口或 VLAN 规划发生过变化。

原因分析

macvlan 本身依赖底层网络接口。只看 docker network ls 不一定能解释所有问题,还需要检查宿主机接口、VLAN 子接口和 Docker 的本地状态。

排查方向:

docker network ls
docker network inspect YOUR_NETWORK
ip link

如果网络已经删掉但仍然冲突,要考虑 Docker 网络状态残留。

清理网络数据库

先停掉依赖该网络的容器,再删除网络:

docker network rm YOUR_NETWORK

如果确认是测试环境,并且已经备份重要配置,可以进一步清理 Docker 网络状态。这个动作有风险,生产环境不要盲目执行。

systemctl stop docker
# inspect and backup Docker network state before editing
systemctl start docker

这里不放具体破坏性命令,因为不同环境的 Docker 数据目录和风险不一样。

VLAN 子接口方案

更长期的做法是显式创建 VLAN 子接口,再基于子接口创建 macvlan 网络:

ip link add link eth0 name eth0.10 type vlan id 10
ip link set eth0.10 up

创建 macvlan:

docker network create -d macvlan \
  --subnet=192.0.2.0/24 \
  --gateway=192.0.2.1 \
  -o parent=eth0.10 \
  YOUR_MACVLAN_NETWORK

示例地址使用文档网段,不代表真实内网。

补充说明

macvlan 很适合让容器像局域网独立设备一样出现,但它也会带来宿主机与容器互通、交换机策略、IP 管理上的复杂度。

如果只是反代或普通服务,bridge 网络往往更省心。macvlan 应该用于确实需要独立二层身份的服务。