ImmortalWrt使用Docker+Macvlan完整指南 概述 ImmortalWrt 是基于 OpenWrt 的固件项目,通过 Docker + macvlan 可以在容器中运行完整的路由器系统。本文将详细介绍部署过程中的常见问题及解决方案。
环境准备 系统要求 Docker 和 Docker Compose 支持 macvlan 的网络环境 宿主机需要有固定 IP 基础配置 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 version: '3.8' services: immortalwrt: image: immortalwrt/immortalwrt:latest container_name: immortalwrt privileged: true networks: macvlan_net: ipv4_address: 192.168 .50 .140 volumes: - ./openwrt_overlay:/overlay - ./openwrt_etc:/etc/config networks: macvlan_net: driver: macvlan driver_opts: parent: eth0 ipam: config: - subnet: 192.168 .50 .0 /24 gateway: 192.168 .50 .1
常见问题及解决方案 1. 容器网络连接问题 问题现象:
容器只能 ping 通局域网设备,无法访问外网 ip route 显示缺少默认路由原因分析: /etc/config/network 配置文件缺少网关设置
解决方案:
在 lan 网段配置中添加网关和 DNS:
1 2 3 4 5 6 vi /etc/config/network option gateway '192.168.50.1' option dns '114.114.114.114 8.8.8.8'
重启网络服务:
1 /etc/init.d/network restart
2. 容器与宿主机通信问题 问题现象: 容器(192.168.50.140)无法 ping 通宿主机物理 IP(192.168.50.139)
原因分析: macvlan 网络模式的限制:容器和宿主机的物理网卡接口无法直接通信
解决方案:
在宿主机创建 macvlan 子接口:
1 2 3 4 5 6 7 sudo ip link add macvlan0 link eth0 type macvlan mode bridgesudo ip addr add 192.168.50.141/24 dev macvlan0sudo ip link set macvlan0 upsudo ip route add 192.168.50.140/32 dev macvlan0
持久化配置:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 sudo tee /etc/systemd/network/macvlan0.netdev > /dev/null <<EOF [NetDev] Name=macvlan0 Kind=macvlan [MACVLAN] Mode=bridge EOF sudo tee /etc/systemd/network/macvlan0.network > /dev/null <<EOF [Match] Name=macvlan0 [Network] Address=192.168.50.141/24 EOF
3. 数据持久化配置 问题现象: 容器删除后,所有配置和已安装的软件包都会丢失
解决方案:
在 docker-compose.yml 中配置数据卷挂载:
1 2 3 4 5 6 7 volumes: - ./openwrt_etc:/etc/config - ./openwrt_overlay:/overlay - ./openwrt_logs:/var/log
目录说明:
/etc/config:系统配置文件/overlay:完整的文件系统覆盖层/var/log:系统日志文件最佳实践 网络规划建议 1 2 3 4 5 宿主机物理 IP: 192.168.50.139 宿主机 macvlan IP: 192.168.50.141 容器 IP: 192.168.50.140 网关: 192.168.50.1
启动脚本 创建便捷的启动脚本:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 #!/bin/bash mkdir -p ./openwrt_etc ./openwrt_overlay ./openwrt_logssudo ip link add macvlan0 link eth0 type macvlan mode bridge 2>/dev/null || true sudo ip addr add 192.168.50.141/24 dev macvlan0 2>/dev/null || true sudo ip link set macvlan0 updocker-compose up -d echo "immortalwrt 容器已启动" echo "容器 IP: 192.168.50.140" echo "宿主机通信 IP: 192.168.50.141" echo "Web 管理界面: http://192.168.50.140"
验证脚本 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 #!/bin/bash echo "=== 网络连接测试 ===" echo "测试容器网络连通性..." docker exec immortalwrt ping -c 3 8.8.8.8 echo "测试宿主机与容器通信..." ping -c 3 192.168.50.140 echo "容器路由表:" docker exec immortalwrt ip route echo "宿主机 macvlan 接口:" ip addr show macvlan0
故障排查 常用诊断命令 1 2 3 4 5 6 7 8 9 10 11 12 13 14 docker exec immortalwrt ip addr docker exec immortalwrt ip route ip addr show ip route show docker network ls docker network inspect <network_name> docker logs immortalwrt
总结 通过以上配置,可以实现:
✅ 容器 IP 固定 :192.168.50.140 ✅ 宿主机通信 :通过 192.168.50.141 与容器互通 ✅ 外网访问 :容器可正常访问互联网 ✅ 数据持久化 :配置和软件包永久保存 ✅ Web 管理 :通过 http://192.168.50.140 访问管理界面
参考资料