ImmortalWrt使用Docker+Macvlan完整指南

Felix Lv3

概述

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
# docker-compose.yml 示例
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

# 在 lan 段添加:
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
# 创建 macvlan 子接口
sudo ip link add macvlan0 link eth0 type macvlan mode bridge
sudo ip addr add 192.168.50.141/24 dev macvlan0
sudo ip link set macvlan0 up

# 添加路由(可选)
sudo 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 分配方案
宿主机物理 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
# start-immortalwrt.sh

# 创建必要的目录
mkdir -p ./openwrt_etc ./openwrt_overlay ./openwrt_logs

# 设置 macvlan 接口
sudo 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 up

# 启动容器
docker-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
# verify-setup.sh

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 网络
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 访问管理界面

参考资料

  • 标题: ImmortalWrt使用Docker+Macvlan完整指南
  • 作者: Felix
  • 创建于 : 2025-09-09 10:12:07
  • 更新于 : 2025-09-24 11:47:32
  • 链接: https://felixx.top/2025/09/09/202509091012/
  • 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。
评论