问题现象
创建 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 应该用于确实需要独立二层身份的服务。