必须用macvlan模式让docker容器获得宿主机同网段ip和独立mac;需确认物理网卡、子网参数,配置交换机支持多mac,创建macvlan网络并指定subnet、gateway、ip-range和parent,启动容器时显式分配静态ip和mac,宿主机访问需添加shim接口。

要用 Macvlan 让 Docker 容器拥有和宿主机同网段的独立物理 IP,核心是让容器跳过 NAT 和 docker0 网桥,直接“插”进局域网——就像给它配了一张真实网卡。这不是改个参数就能跑通的事,得从网卡、子网、交换机、宿主机连通性四方面协同配置。
确认物理网卡与当前网络环境
Macvlan 必须绑定真实有线网卡(如 enp0s3、eth0 或群晖的 ovs_eth0),不能用 docker0、lo 或 bond 接口。
- 运行
ip link show找出处于 UP 状态的真实网卡名 - 运行
ip addr show enp0s3查看当前 IP(例如192.168.1.10/24),这个子网就是容器要加入的网段 - 记录网关(如
192.168.1.1)和可用 IP 范围(避开宿主机 IP、网关、DHCP 池) - Wi-Fi 网卡通常不支持 Macvlan,务必使用有线网卡
确保交换机或路由器支持多 MAC
Macvlan 容器在二层表现为独立设备,会带新 MAC 地址发包。若交换机端口默认只学习一个 MAC,就会丢包。
- 家用路由器:关闭「客户端隔离」或「AP 隔离」,部分型号需开启「AP 模式」
- 企业交换机:将端口设为 trunk 模式,或启用混杂模式(
ip link set enp0s3 promisc on) - 群晖等 NAS:确认已启用 Open vSwitch,且网卡未被聚合或虚拟化屏蔽
创建 Macvlan 网络并指定关键参数
执行命令绑定物理网卡,并声明与宿主机完全一致的子网拓扑:
docker network create -d macvlan \ --subnet=192.168.1.0/24 \ --gateway=192.168.1.1 \ --ip-range=192.168.1.128/25 \ -o parent=enp0s3 \ my-lan-net
-
--subnet必须与宿主机所在网段严格一致(不能写成/32或单个 IP) -
--ip-range划定容器可用 IP 区间(如192.168.1.128–192.168.1.254),避开宿主机和网关 -
-o parent=enp0s3中的网卡名必须准确,大小写敏感 - 验证:运行
docker network inspect my-lan-net,检查Subnet、Gateway、Parent是否匹配
启动容器并分配静态 IP 和 MAC
Macvlan 不提供 DHCP,必须显式指定 IP,且该 IP 必须未被占用:
docker run -d \ --name web-app \ --network=my-lan-net \ --ip=192.168.1.150 \ --mac-address=02:42:c0:a8:01:96 \ nginx:alpine
-
--ip必须落在--subnet范围内,建议启动前先ping测试是否空闲 -
--mac-address可选,但推荐指定(格式为 XX:XX:XX:XX:XX:XX,首字节为偶数) - 局域网内其他设备可直接访问
http://192.168.1.150 - 宿主机默认无法 ping 通该 IP —— 这是正常行为,不是故障
若需宿主机也能访问容器,需额外创建 shim 接口并配置路由,这部分属于增强连通性,非必需但实用。











