• 作者:老汪软件技巧
  • 发表时间:2024-10-01 11:03
  • 浏览量:

引言

之前一直是直接在宿主机上安装 OpenWrt 来实现透明路由, 当然现在也是如此!!

无意中发现, 其实也是可以通过 Docker 的方式来安装 OpenWrt, 如此, 就可以在宿主机上通过 Docker 上部署其他应用了!

本文则是记录了 Docker 部署 OpenWrt 的过程, 当然最终其实我没有使用该方案, 因为在使用一段时间后总感觉不是很稳定, 而且这种方案会让宿主机网络环境变得复杂。最后还是直接在宿主机上直接安装 OpenWrt

一、Docker 环境搭建

因为我是新环境(Ubuntu)所以需要先配下 Docker 环境, 如果你的设备已经配了 Docker 环境请忽略这一步, 这里的安装以 为准(下面也只是按照官网的步骤来的)

1.1 安装 Docker设置 Docker 的 apt 存储库: 把下面一大段直接复制到终端执行

# Add Docker's official GPG key:
sudo apt-get update
sudo apt-get install ca-certificates curl
sudo install -m 0755 -d /etc/apt/keyrings
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
sudo chmod a+r /etc/apt/keyrings/docker.asc
# Add the repository to Apt sources:
echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu \
  $(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \
  sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt-get update

安装完成状态如下(不要有警告、报错就行)

安装 Docker 相关的工具包

sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

安装完成状态如下(不要有警告、报错就行)

验证是否安装成功: 通过运行 hello-world 映像来验证 Docker Engine 安装是否成功

sudo docker run hello-world

此命令下载测试映像并在容器中运行。容器运行时, 它会打印一条确认消息并退出。如下所示, 则说明您已成功安装并启动了 Docker Engine

1.2 安装 Docker-compose从 官方仓库 获取最新版本安装包

安装(下载)

mkdir -p ~/.docker/cli-plugins/
curl -SL https://github.com/docker/compose/releases/download/v2.29.1/docker-compose-linux-armv7 -o ~/.docker/cli-plugins/docker-compose

设置插件权限

chmod +x ~/.docker/cli-plugins/docker-compose

验证是否安装完成

docker compose version

二、网络连接方式(切换至有线连接)

这里我在安装系统(Ubuntu)时网络设置的是 WIFI 连接, 所以这里需要修改为有线连接!! 所以如果你的网络连接方式是有线的那就可以跳过这一部分!!

而之所以要改为有线

为了网络更稳定是因为如果是 WIFI 连接情况下, 后面设置 Docker 容器桥接网络时会报错!2.1 修改配置SSH 登录系统, 来到 /etc/netplan 目录

cd /etc/netplan
ls

找到配置文件: 如上我的配置文件为 50-cloud-init.yaml 需要注意的是, 这里配置文件名不一定是相同的, 但肯定在该目录下, 所以需要以实际情况为准

修改配置文件 50-cloud-init.yaml

sudo vim 50-cloud-init.yaml

将旧配置注释(推荐)或删除

network:
     version: 2
     ethernets:
         eth0:
             dhcp4: true
             optional: true

执行 netplan generate 和 netplan apply 以激活配置

sudo netplan generate
sudo netplan apply

2.2 一次意外(确定 IP & 固定 IP)这里出现一个意外: 激活完配置, 发现 SSH 连接断开了, 再次连接也上不去了!!!

原因其实就是 IP 地址改变了: 在路由管理器页面上, 进入对应设备信息管理页面, 发现 IP 居然变了

路由器管理页面, 进入「IP 与 MAC 绑定设置」

先删除旧的(我之前其实设置了一条, 删了删了)

重新添加一条配置

顺便把主机名和 IP 给改了

openwrt开发指南__openwrt配置nas

重启树莓派, 等待片刻, 用新 IP 来 SSH 登录三、查看网络信息

使用 ip route 可查看系统的路由表, 包括默认网关、子网和接口信息; 如下所示:

$ ip route
default via 192.168.0.1 dev eth0 proto dhcp src 192.168.0.200 metric 100
172.17.0.0/16 dev docker0 proto kernel scope link src 172.17.0.1 linkdown
192.168.0.0/24 dev eth0 proto kernel scope link src 192.168.0.200 metric 100
192.168.0.1 dev eth0 proto dhcp scope link src 192.168.0.200 metric 100
192.168.1.1 via 192.168.0.1 dev eth0 proto dhcp src 192.168.0.200 metric 100

从 ip route 输出内容可以得到以下内容:

四、设置网络: 混杂模式

混杂模式(promiscuous mode)是电脑网络中的术语。是指一台机器的网卡能够接收所有经过它的数据流, 而不论其目的地址是否是它。一般计算机网卡都工作在非混杂模式下, 此时网卡只接受来自网络端口的目的地址指向自己的数据。当网卡工作在混杂模式下时, 网卡将来自接口的所有数据都捕获并交给相应的驱动程序。

这里我们需要将宿主机的网络设置为 混杂模式 这对于 OpenWrt 容器访问互联网是必要的!!!

4.1 混杂模式开启 & 关闭

在确定当前使用的网卡后, 可通过 ip link 来设置网卡对应的混杂模式, 具体命令如下:

ip link set eth0 promisc on # 开启混杂模式, eth0 是你的网卡
ip link set eth0 promisc off # 取消混杂模式, eth0 是你的网卡

检测是否开启混杂模式: 如下图所示, 设置前后使用 ip link 检查网卡, 会发现开启混杂模式下, 相同命令会输出内容会多个 PROMISC

五、部署 Openwert

下面开始正式部署 Openwert...

5.1 下载 Docker 镜像

这里直接使用其他大佬构建好的镜像, 地址: openwrt.ai

检索, 找到目标设备

找到 Docker 镜像, 右键, 复制下载链接

树莓派上, 使用 wget 进行下载

wget https://dl.openwrt.ai/releases/targets/bcm27xx/bcm2711/openwrt-07.26.2024-bcm27xx-bcm2711-rpi-4-rootfs.tar.gz

5.2 导入镜像

将下载下来的镜像, 使用 docker import 进行导入

# supes_openwrt 则是为导入的镜像命名(随便取)
sudo docker import openwrt-07.26.2024-bcm27xx-bcm2711-rpi-4-rootfs.tar.gz supes_openwrt

执行 docker images 查看所有镜像, 确保导入成功

sudo docker images

5.3 部署容器

在很多文章中, 在部署 Docker 前还需要创建 Docker 网络! 这边我直接是通过 Docker compose 来部署的, 所在网络部分我也是直接在 Docker compose 中进行定义

创建项目目录

mkdir openWrt

创建 docker-compose.yml 配置文件: 下面配置基本不用动, 只需要修改: image、ipv4_address、subnet、gateway

cd openWrt # 进入项目目录
cat >> docker-compose.yml << EOF
version: '3.8'
 
services:
  openwrt:                          # 声明服务
    image: supes_openwrt            # 所使用的镜像
    container_name: openwrt         # 容器命名
    command: /sbin/init             # 运行容器时默认执行的命令
    privileged: true                # 授予容器特权模式, 容器将拥有类似于宿主机的所有权限
    restart: always                 # 定义容器的重启策略(无论退出状态如何, 总是重启容器)
    networks:                       # 设置链接的网络
      openwrt-macvlan:              # - 连接的网络名
        ipv4_address: 192.168.0.222 # - 容器内部 IP 地址
networks:                           # 定义网络
  openwrt-macvlan:                  # 网络名称
    driver: macvlan                 # 指定驱动程序(macvlan: 容器直接连接宿主网络)
    driver_opts:
      parent: eth0                  # parent 配置用于指定 macvlan 网络驱动程序的父接口
    ipam:                           # 配置网络的 IP 地址分配策略
      config: 
        - subnet: 192.168.0.0/24    # 子网段(ip route 查到的信息)
          gateway: 192.168.0.1      # 网关(ip route 查到的信息, 其实就是主路由地址)
EOF

补充: macvlan 是 Docker 网络驱动程序之一, 它允许你将容器直接连接到宿主机的网络, 并为每个容器分配一个唯一的 MAC 地址。这样, 容器可以像物理设备一样直接与网络通信

5.4 启动

下面运行 docker-compose up 来启动容器, -d 则表示后台运行, 运行完成可通过 docker ps 验证容器是否启动

sudo docker compose up -d

以下是一些常用的 docker compose 命令及其作用:

5.5 修改 OpenWrt 登录 IP

默认情况下 Openwert 系统的 IP 为 10.0.0.1, 这里我希望调整为 192.168.0.222

进入容器内部(OpenWrt 内部)

sudo docker exec -it openwrt bash

修改 IP 为, 容器的 IP 地址, 即: 192.168.0.222

# 10.0.0.1 为默认地址, 192.168.0.222 是我们要设置的地址(也是我上面设置的容器地址)
sed -i 's/10.0.0.1/192.168.0.222/' /etc/config/network && /etc/init.d/network restart # 重启

六、Done

到处, OpenWrt 算是部署完成, 浏览器输入 OpwnWrt 容器 IP, 输入账号密码(默认账号密码都是 root), 即可进入系统

七、参考