OpenWrt Docker 配置与管理 – wiki基地

OpenWrt Docker 配置与管理

OpenWrt 是一款专为路由器及其他嵌入式设备设计的开源 Linux 发行版,以其高度的可定制性而闻名。Docker 作为一个轻量级的容器化平台,能够将应用程序及其所有依赖项打包成独立的容器,实现快速部署和环境隔离。将 OpenWrt 与 Docker 结合,可以将您的路由器转变为功能更强大的边缘计算节点,运行诸如广告拦截(Pi-hole, AdGuard Home)、媒体服务器(Jellyfin)、下载工具等各类服务。

1. 前提条件

在 OpenWrt 设备上成功部署和运行 Docker,需要满足以下硬件和软件要求:

  • 硬件架构: Docker 通常支持 ARMv7、x86 或 x86_64 架构。部分老旧的 MIPS 架构路由器可能无法支持 Docker。
  • 内存 (RAM): 至少 256MB RAM,为保证流畅运行,推荐 512MB 或更多。
  • 存储空间: 至少 1GB 可用存储空间,推荐 4GB 或更多。由于 Docker 镜像和容器会占用大量空间,强烈建议使用外部存储设备(如 USB 驱动器或 SSD)扩展存储,并将其挂载为 Docker 的数据根目录。
  • 网络连接: 稳定的互联网连接,用于下载软件包和 Docker 镜像。
  • SSH 访问: 具备通过 SSH 终端访问 OpenWrt 设备的权限,以便执行命令行操作。

2. 安装 Docker

在 OpenWrt 上安装 Docker 主要通过 opkg 包管理器进行。

安装步骤:

  1. 更新软件包列表:
    通过 SSH 连接到您的 OpenWrt 设备,并执行以下命令更新软件包列表:
    bash
    opkg update
  2. 安装 Docker 核心组件:
    安装 Docker 守护进程 (dockerd) 和命令行客户端 (docker):
    bash
    opkg install dockerd docker

    如果您计划使用 Docker Compose 管理多容器应用,也请一并安装:
    bash
    opkg install docker-compose
  3. 安装 LuCI Docker 管理界面(可选):
    如果您希望通过 OpenWrt 的 Web 界面 (LuCI) 管理 Docker,可以安装 luci-app-dockerman。这将自动安装 dockerddocker-compose 作为依赖项。
    bash
    opkg install luci-app-dockerman
  4. 启用并启动 Docker 服务:
    安装完成后,启用 Docker 服务并设置开机自启,然后启动服务:
    bash
    /etc/init.d/dockerd enable
    /etc/init.d/dockerd start
  5. 验证安装:
    检查 Docker 是否成功安装并运行:
    bash
    docker version
    docker run hello-world

    如果显示 Docker 客户端和服务器版本信息,并且 hello-world 容器成功运行,则表明 Docker 已正确安装。

3. 配置 Docker

3.1 扩展存储空间

路由器内置存储通常有限,为避免空间不足,强烈建议将 Docker 的数据目录(用于存放镜像、容器、卷等)配置到外部存储设备上。

  1. 挂载外部存储:
    确保您的 USB 驱动器或 SSD 已格式化(推荐 ext4 文件系统)并正确挂载到 OpenWrt 系统上,例如挂载到 /opt 目录。您可以使用 block-mountkmod-fs-ext4e2fsprogs 等软件包来管理外部存储。
  2. 配置 Docker 数据根目录:
    • 通过 LuCI 界面: 导航到 “Docker” > “Overview”,在 “Docker Root Dir” 设置中,将默认路径更改为您的外部存储挂载点下的路径(例如 /opt/docker)。
    • 通过命令行: 修改 Docker 守护进程的配置文件来设置 data_root 参数。
      修改后,重启 dockerd 服务以使更改生效。

3.2 配置 Docker 守护进程

Docker 守护进程的配置可以通过修改其配置文件进行,一些重要的配置项包括:

  • data_root:指定 Docker 数据(镜像、容器、卷)的存储路径。
  • log_level:日志记录级别,默认为 warn
  • hosts:Docker API 监听地址,默认为 UNIX 套接字 /var/run/docker.sock
  • iptables:是否启用 iptables 规则集成,默认为 1(启用)。
  • bip:Docker 默认桥接网络的 IP 地址,默认为 172.18.0.1/24
  • fixed_cidr:为容器分配 IP 的范围。
  • ipv6:是否启用 IPv6 网络支持。

3.3 网络配置

Docker 的网络配置决定了容器如何与外部网络和您的局域网进行通信。

  • 默认桥接网络 (docker0): Docker 默认创建一个名为 docker0 的桥接网络。容器通过此网络相互通信,并通过 NAT 访问互联网。
  • 自定义桥接网络: 您可以创建自定义的 Docker 桥接网络,使用特定的子网,以实现更精细的控制和路由。
    bash
    docker network create --subnet=172.20.0.0/16 my_bridge
  • 主机网络 (Host Networking): 如果容器需要直接使用路由器的网络堆栈,可以使用 --network host 选项运行容器。
  • OpenWrt 防火墙集成: 如果 Docker 容器需要与 LAN 内部设备或互联网进行通信,您可能需要在 OpenWrt 防火墙中添加相应的转发规则。
    • 通过 LuCI 界面: 导航到 “网络” > “防火墙”,添加必要的转发规则。
    • 通过命令行: 手动添加 iptables 规则,例如:
      bash
      iptables -I FORWARD -i docker0 -o br-lan -j ACCEPT
      iptables -I FORWARD -i br-lan -o docker0 -j ACCEPT

4. 管理 Docker 容器

4.1 拉取 Docker 镜像

  • 通过 LuCI 界面: 导航到 “Docker” > “Images”,在 “Pull Image” 框中输入镜像名称(例如 linuxserver/transmission),然后点击 “Pull”。
  • 通过命令行: 使用 docker pull 命令。对于大型镜像,命令行方式通常更稳定,因为 LuCI 可能会有超时限制。
    bash
    docker pull <image_name>:<tag>
    # 示例:docker pull lscr.io/linuxserver/unifi-network-application:latest

4.2 运行 Docker 容器

  • 通过 LuCI 界面: 导航到 “Docker” > “Containers” > “Add”。选择 Docker 镜像,然后配置端口映射、卷挂载、环境变量等参数,最后点击 “Submit” 创建并运行容器。
  • 通过命令行: 使用 docker run 命令,指定容器名称、端口映射、卷挂载等。
    bash
    docker run -d --name <container_name> -p <host_port>:<container_port> -v <host_path>:<container_path> <image_name>:<tag>
    # 示例:运行一个 Pi-hole 容器
    # docker run -d --name pihole -p 53:53/tcp -p 53:53/udp -p 80:80 pihole/pihole

4.3 管理容器

  • 列出运行中的容器:
    bash
    docker ps
  • 列出所有容器(包括已停止的):
    bash
    docker ps -a
  • 停止容器:
    bash
    docker stop <container_name_or_id>
  • 启动容器:
    bash
    docker start <container_name_or_id>
  • 移除容器:
    bash
    docker rm <container_name_or_id>
  • 移除镜像:
    bash
    docker rmi <image_name_or_id>
  • 查看容器日志:
    bash
    docker logs <container_name_or_id>

4.4 使用 Docker Compose

Docker Compose 是一个用于定义和运行多容器 Docker 应用程序的工具。您可以通过一个 YAML 文件配置应用程序的所有服务,然后通过一个命令启动所有服务。

  1. 创建 docker-compose.yml 文件:
    例如,一个简单的 Mosquitto MQTT Broker 的 docker-compose.yml 文件:
    yaml
    version: '3.3'
    services:
    eclipse-mosquitto:
    restart: always
    ports:
    - '1883:1883'
    - '9001:9001'
    volumes:
    - '/etc/config/mosquitto.conf:/mosquitto/config/mosquitto.conf'
    image: eclipse-mosquitto
  2. 启动服务:
    docker-compose.yml 文件所在的目录执行:
    bash
    docker-compose up -d

    或者指定文件路径:
    bash
    docker-compose -f /path/to/your/docker-compose.yml up -d

5. 常见问题与故障排除

  • 磁盘空间不足: 这是在 OpenWrt 设备上运行 Docker 最常见的问题。务必将 Docker 数据目录配置到外部存储。
  • 架构不兼容: 确保您尝试拉取的 Docker 镜像与您的 OpenWrt 设备(CPU 架构)兼容。
  • Docker 服务无法启动: 检查系统日志获取详细错误信息。确认内存和存储空间是否充足,并检查 Docker 守护进程的配置文件是否有误。
  • 容器网络问题: 检查 OpenWrt 防火墙规则,确保容器的网络流量(特别是端口映射)被正确转发。

通过遵循上述步骤,您将能够在 OpenWrt 设备上成功配置和管理 Docker,从而极大地扩展路由器的功能和应用场景。

滚动至顶部