858 words
4 minutes
Raspberry_pi4_installs_openwrt_with_docker
制作openwrt docker 镜像
- 在github上新建一个仓库
- 创建.github/workflows/build.yml文件:
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说明:
-
下载 openwrt-24.10.1-bcm2711-rpi-4-ext4-factory.img.gz
-
解压 .img.gz 得到 .img
-
挂载 .img 的第二个分区(rootfs)
-
打包 rootfs 为 tar.gz
-
构建 Docker 镜像(基于 scratch)
-
导出 为 openwrt-rpi4.tar,并作为 Artifact 提供下载
使用
- 点击
Actions按钮 - 点击左侧出现的
Build OpenWrt Docker Image from RPi4 Factory IMG,再点击Run workflow - 一分钟左右镜像构建成功,下载镜像
导入镜像
docker load -i openwrt-rpi4.tar #镜像名- 导入的镜像没有名字,用
docker tag来命名
docker images #查看docker imagesdocker tag images_ID openwrt24.10.1:rpi4NOTE可以在构建阶段加入
tag
with:
tags: openwrt24.10.1
运行容器
- 直接运行
docker run -d --name openwrt --network host --privileged openwrt24.10.1:rpi4- 使用macvlan
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(推荐)
- 创建一个目录
Terminal window mkdir openwrt- 进入目录创建
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/32NOTE用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- 启动
docker compose up -d- 进入容器
docker exec -it openwrt /bin/shvi /etc/config/network # 修改ip地址/etc/init.d/network restart # 重启网络- 使用ip地址在浏览器上访问。
Finally
- 此方案没有无线功能,如果一定要有可以考虑做设备直通或者自己编译OpenWrt Docker镜像又或者直接在树莓派上安装OpenWrt。
Raspberry_pi4_installs_openwrt_with_docker
https://infini.cv/posts/raspberry/raspberry_pi4_installs_openwrt_with_docker/ Some information may be outdated