858 words
4 minutes
Raspberry_pi4_installs_openwrt_with_docker
2025-10-14

制作openwrt docker 镜像#

  1. 在github上新建一个仓库
  2. 创建.github/workflows/build.yml文件:
Terminal window
name: Build OpenWrt Docker Image from RPi4 Factory IMG
on:
workflow_dispatch: # 手动触发
jobs:
build:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Download OpenWrt RPi4 Factory Image
run: |
mkdir image
cd image
wget https://downloads.openwrt.org/releases/24.10.1/targets/bcm27xx/bcm2711/openwrt-24.10.1-bcm27xx-bcm2711-rpi-4-ext4-factory.img.gz
gunzip openwrt-24.10.1-bcm27xx-bcm2711-rpi-4-ext4-factory.img.gz
cd ..
- name: Extract rootfs from IMG
run: |
mkdir rootfs
sudo apt-get update && sudo apt-get install -y kpartx e2fsprogs
# 建立 loop 设备
LOOP=$(sudo losetup -f --show image/openwrt-24.10.1-bcm27xx-bcm2711-rpi-4-ext4-factory.img)
sudo partprobe $LOOP
# 挂载第二个分区 (rootfs)
sudo mount ${LOOP}p2 /mnt
sudo tar -C /mnt -czf rootfs/openwrt-rpi4-rootfs.tar.gz .
sudo umount /mnt
sudo losetup -d $LOOP
- name: Create Dockerfile
run: |
cat > Dockerfile <<'EOF'
FROM scratch
ADD rootfs/openwrt-rpi4-rootfs.tar.gz /
CMD ["/sbin/init"]
EOF
- name: Set up QEMU
uses: docker/setup-qemu-action@v3
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3
- name: Build Docker Image
uses: docker/build-push-action@v6
with:
context: .
file: ./Dockerfile
platforms: linux/arm64
push: false
outputs: type=docker,dest=./openwrt-rpi4.tar
- name: Upload Image Artifact
uses: actions/upload-artifact@v4
with:
name: openwrt-rpi4-image
path: ./openwrt-rpi4.tar

说明:

  1. 下载 openwrt-24.10.1-bcm2711-rpi-4-ext4-factory.img.gz

  2. 解压 .img.gz 得到 .img

  3. 挂载 .img 的第二个分区(rootfs)

  4. 打包 rootfs 为 tar.gz

  5. 构建 Docker 镜像(基于 scratch)

  6. 导出 为 openwrt-rpi4.tar,并作为 Artifact 提供下载

使用#

  1. 点击Actions按钮
  2. 点击左侧出现的Build OpenWrt Docker Image from RPi4 Factory IMG ,再点击Run workflow
  3. 一分钟左右镜像构建成功,下载镜像

导入镜像#

Terminal window
docker load -i openwrt-rpi4.tar #镜像名
  • 导入的镜像没有名字,用docker tag 来命名
Terminal window
docker images #查看docker images
docker tag images_ID openwrt24.10.1:rpi4
NOTE

可以在构建阶段加入tag
with:
tags: openwrt24.10.1

运行容器#

  • 直接运行
Terminal window
docker run -d --name openwrt --network host --privileged openwrt24.10.1:rpi4
  • 使用macvlan
Terminal window
sudo ip link set eth0 promisc on # 打开有线网卡的混杂模式
docker network create -d macvlan --subnet=192.168.0.0/24 --gateway=192.168.0.1 -o parent=eth0 openwrt_macnet
# 创建macvlan网卡
# --subnet=真实的网络
# parent=网卡名字 虚拟网卡名
docker run --restart always --name openwrt -d --network openwrt_macnet --privileged rpi4
  • 使用docker compose(推荐)
    1. 创建一个目录
    Terminal window
    mkdir openwrt
    1. 进入目录创建docker-compose.yml文件
services:
openwrt:
image: openwrt24.10.1:rpi4
container_name: openwrt
privileged: true
networks:
macnet:
ipv4_address: 192.168.1.31 # 给 OpenWrt 容器分配的局域网 IP
restart: unless-stopped
volumes:
- ./openwrt-overlay:/overlay # 持久化 OpenWrt 配置到当前目录
- ./openwrt-root:/root # 可选:持久化 root 用户目录(在当前目录)
- ./openwrt-tmp:/tmp # 可选:持久化临时目录(避免容器重启丢失)
networks:
macnet:
driver: macvlan
driver_opts:
parent: eth0 # 你的物理网卡名称
ipam:
config:
- subnet: 192.168.1.0/24 # 你的局域网网段
gateway: 192.168.1.1 # 你的路由器网关
ip_range: 192.168.1.31/32
NOTE

用macvlan的方式,容器无法与宿主机通信(宿主机ping不通容器)
可以在宿主机再建一个macvlan接口
sudo ip link add macvlan1 link eth0 type macvlan mode bridge # 创建一个macvlan1的接口
sudo ip addr add 192.168.1.32/24 dev macvlan1 # 分配同一网段的ip地址
sudo ip link set macvlan1 up # 启用接口

  • 使用ipvlan模式
services:
openwrt:
image: openwrt24.10.1:rpi4
container_name: openwrt
privileged: true
networks:
ipvlan_net:
ipv4_address: 192.168.1.31 # 给 OpenWrt 容器分配的局域网 IP
restart: unless-stopped
volumes:
- ./openwrt-overlay:/overlay # 持久化 OpenWrt 配置到当前目录
- ./openwrt-root:/root # 可选:持久化 root 用户目录
- ./openwrt-tmp:/tmp # 可选:持久化临时目录
networks:
ipvlan_net:
driver: ipvlan
driver_opts:
parent: eth0 # 改成你的物理网卡名称
ipvlan_mode: l2 # L2 模式,容器像局域网独立设备
ipam:
config:
- subnet: 192.168.1.0/24 # 你的局域网网段
gateway: 192.168.1.1 # 你的路由器网关
ip_range: 192.168.1.31/32 # 限定容器 IP
  1. 启动
Terminal window
docker compose up -d
  1. 进入容器
Terminal window
docker exec -it openwrt /bin/sh
vi /etc/config/network # 修改ip地址
/etc/init.d/network restart # 重启网络
  1. 使用ip地址在浏览器上访问。

Finally#

  • 此方案没有无线功能,如果一定要有可以考虑做设备直通或者自己编译OpenWrt Docker镜像又或者直接在树莓派上安装OpenWrt
Raspberry_pi4_installs_openwrt_with_docker
https://infini.cv/posts/raspberry/raspberry_pi4_installs_openwrt_with_docker/
Author
infini
Published at
2025-10-14
License
CC BY-SA 4.0

Some information may be outdated