OpenWrt 与 Docker:打造轻量级容器化应用平台技术分享

文章目录

    • 前言
    • [一、OpenWrt 与 Docker 的集成前提](#一、OpenWrt 与 Docker 的集成前提)
      • [1.1 硬件与内核要求](#1.1 硬件与内核要求)
      • [1.2 软件依赖](#1.2 软件依赖)
    • [二、Docker 环境部署与验证](#二、Docker 环境部署与验证)
      • [2.1 基础服务配置](#2.1 基础服务配置)
      • [2.2 存储驱动适配](#2.2 存储驱动适配)
    • 三、容器化应用部署实践
      • [3.1 资源限制策略](#3.1 资源限制策略)
      • [3.2 Docker Compose 适配](#3.2 Docker Compose 适配)
    • 四、性能优化与监控
      • [4.1 容器资源监控](#4.1 容器资源监控)
      • [4.2 镜像精简策略](#4.2 镜像精简策略)
    • 五、典型问题解决方案
      • [5.1 端口冲突处理](#5.1 端口冲突处理)
      • [5.2 低性能设备适配](#5.2 低性能设备适配)
    • 六、内网穿透远程访问
      • [6.1 下载公钥](#6.1 下载公钥)
      • [6.2 将cpolar源添加至包管理器](#6.2 将cpolar源添加至包管理器)
      • [6.3 更新包管理器](#6.3 更新包管理器)
      • [6.4 安装cpolar插件](#6.4 安装cpolar插件)
      • [6.5 重启OpenWRT](#6.5 重启OpenWRT)
      • [6.6 为OpenWRT Web管理界面配置公网地址](#6.6 为OpenWRT Web管理界面配置公网地址)
    • 总结

前言

OpenWrt 作为一个高度可定制的嵌入式 Linux 发行版,其模块化设计为 Docker 容器化部署提供了可能性。

将 Docker 引入 OpenWrt 环境,能够带来以下优势:

  • 简化应用部署: 无需手动安装依赖和配置环境,只需使用 Docker 镜像即可快速部署应用。
  • 隔离性与安全性: Docker 容器提供应用隔离,避免应用之间的相互干扰和潜在安全风险。
  • 资源利用率提升: Docker 容器共享宿主机的内核,占用资源更少,能够充分利用 OpenWrt 设备的有限资源。
  • 可移植性与可扩展性: Docker 镜像可以在不同的 OpenWrt 设备之间轻松迁移和部署,方便扩展应用规模。
  • 版本控制与回滚: Docker 镜像具有版本控制功能,可以方便地回滚到之前的版本。

然而,受限于默认内核配置和硬件资源,在 OpenWrt 上运行 Docker 需解决内核功能支持存储架构适配两大核心问题。本文将基于技术实践,分享在 OpenWrt 设备上搭建 Docker 环境的完整方案,涵盖从内核编译到容器优化的全流程。


一、OpenWrt 与 Docker 的集成前提

1.1 硬件与内核要求

  • 硬件配置
    CPU 需支持硬件虚拟化(ARMv7+/x86_64),内存 ≥1GB,存储空间 ≥4GB(建议通过 USB 扩展存储)。

  • 内核编译
    OpenWrt 默认内核未启用 Docker 依赖的以下模块,需通过 make menuconfig 手动启用:

    bash 复制代码
    # 必需内核选项
    CONFIG_CGROUPS=y          # 控制组资源隔离
    CONFIG_NAMESPACES=y       # 容器命名空间
    CONFIG_VETH=y             # 虚拟以太网设备
    CONFIG_BRIDGE=y           # 网桥支持
    CONFIG_OVERLAY_FS=y       # Overlay 文件系统

1.2 软件依赖

  • 第三方软件源
    OpenWrt 官方源不提供 Docker 软件包,需通过第三方源(如 istore)安装:

    bash 复制代码
    # 添加 ARM 架构源示例
    echo "src/gz istore https://istore.linkease.com/repo/arm_cortex-a9" >> /etc/opkg/customfeeds.conf
    opkg update
    opkg install docker dockerd
  • 存储配置
    挂载可读写分区作为 Docker 数据目录:

    bash 复制代码
    mkdir -p /mnt/docker
    mount /dev/sda1 /mnt/docker  # 假设 sda1 为扩展存储设备
    dockerd --data-root=/mnt/docker &

二、Docker 环境部署与验证

2.1 基础服务配置

bash 复制代码
# 启动 Docker 守护进程(指定存储路径)
/etc/init.d/docker start --data-root=/mnt/docker

# 验证 Docker 安装
docker info | grep "Storage Driver"  # 应返回 overlay2

2.2 存储驱动适配

若使用 overlay2 驱动,需确保:

  1. 内核版本 ≥4.0
  2. 文件系统为 ext4/btrfs
  3. 执行 mount -t overlay overlay -o lowerdir=/mnt/docker,upperdir=/mnt/docker/diff,workdir=/mnt/docker/work /mnt/merged 测试挂载

三、容器化应用部署实践

3.1 资源限制策略

通过 cgroups 控制容器资源开销:

bash 复制代码
# 限制容器内存为 256MB,CPU 权重为 50%
docker run -d --name my_app \
  --memory=256m \
  --cpu-shares=512 \
  -p 8080:80 \
  nginx:alpine

3.2 Docker Compose 适配

OpenWrt 需手动安装 Python 环境:

bash 复制代码
opkg install python3 python3-pip
pip3 install docker-compose

编写 docker-compose.yml

yaml 复制代码
version: "3.8"
services:
  web:
    image: nginx:alpine
    ports:
      - "8080:80"
    deploy:
      resources:
        limits:
          cpus: "0.5"
          memory: 256M

四、性能优化与监控

4.1 容器资源监控

bash 复制代码
# 实时查看容器资源占用
docker stats --format "table {{.Name}}\t{{.CPUPerc}}\t{{.MemUsage}}"

# 生成性能报告
docker run --rm -v /var/run/docker.sock:/var/run/docker.sock \
  docker.io/docker/docker-bench-security

4.2 镜像精简策略

  • 使用多阶段构建(Multi-stage Build)
  • 选择 Alpine 基础镜像
  • 移除调试工具(如 curl/telnet

示例 Dockerfile:

dockerfile 复制代码
FROM golang:1.18 AS builder
WORKDIR /app
COPY . .
RUN CGO_ENABLED=0 go build -o main .

FROM alpine:3.15
COPY --from=builder /app/main /
CMD ["/main"]

五、典型问题解决方案

5.1 端口冲突处理

禁用 OpenWrt 默认占用的 80 端口服务:

bash 复制代码
/etc/init.d/uhttpd stop
/etc/init.d/uhttpd disable

5.2 低性能设备适配

  • 镜像构建:在 x86 主机交叉编译镜像后推送至仓库

  • 资源分配 :使用 --cpuset-cpus 绑定特定 CPU 核心

  • 日志优化 :限制容器日志大小防止存储溢出

    bash 复制代码
    docker run --log-driver=json-file \
      --log-opt max-size=10m \
      --log-opt max-file=3

六、内网穿透远程访问

如果想实现出门在外,也能随时随地访问家中的OpenWRT软路由系统,但因为没有公网IP而无法实现。可以借助cpolar内网穿透工具来实现公网访问!接下来介绍一下如何安装cpolar内网穿透并实现公网访问!

首先需要在终端SSH连接OpenWRT系统,输入OpenWRT登录时的root账号密码password即可成功连接。

6.1 下载公钥

首先执行下方命令下载公钥:

shell 复制代码
wget -O cpolar-public.key http://openwrt.cpolar.com/releases/public.key

6.2 将cpolar源添加至包管理器

shell 复制代码
echo "src/gz cpolar_packages http://openwrt.cpolar.com/releases/packages/$(. /etc/openwrt_release ; echo $DISTRIB_ARCH)"  >>  /etc/opkg/customfeeds.conf

6.3 更新包管理器

shell 复制代码
opkg update

6.4 安装cpolar插件

shell 复制代码
opkg install cpolar
opkg install luci-app-cpolar
opkg install luci-i18n-cpolar-zh-cn

6.5 重启OpenWRT

shell 复制代码
reboot

然后可以看到OpenWRT重启,重启后重新登录OpenWRT后台,在左侧菜单的服务中就会出现cpolar服务,绑定token即可正常使用:

6.6 为OpenWRT Web管理界面配置公网地址

首先,在OpenWRT管理界面左侧菜单中进入服务,选择cpolar内网穿透。

然后,点击打开webui管理界面:http://localhost:9200,在跳转的浏览器网页中输入你注册的cpolar账号密码进行登录:

登录后,点击左侧仪表盘的隧道管理------创建隧道,

创建一个 OpenWRT Web管理界面的公网http地址隧道

  • 隧道名称:可自定义命名,注意不要与已有的隧道名称重复,本例中使用:openwrt
  • 协议:选择http
  • 本地地址:80
  • 域名类型:免费选择随机域名
  • 地区:选择China VIP

点击创建

隧道创建成功后,点击左侧的状态------在线隧道列表,查看所生成的公网访问地址,有两种访问方式,一种是http 和https,任选其一即可。

使用Cpolar生成的公网地址,在手机或任意设备的浏览器进行登录访问,即可成功看到 OpenWRT Web管理界面,这样一个可以远程访问的公网地址就创建好了,使用了cpolar的公网域名,无需自己购买云服务器,即可到公网访问本地内网的openwrt系统了!

ps:如果我们需要长期异地远程访问OpenWRT Web管理界面,由于刚才创建的是随机的地址,24小时会发生变化。另外它的网址是由随机字符生成,不容易记忆。如果想把域名变成固定的二级子域名,并且不想每次都重新创建隧道来远程访问,我们可以选择创建一个固定不变的公网地址来解决这个问题。

《使用cpolar为本地openwrt web管理界面配置固定公网地址》

总结

在 OpenWrt 上部署 Docker 需克服内核适配与资源限制两大挑战。通过自定义编译内核、扩展存储设备、限制容器资源,可在低功耗设备上实现轻量级容器化应用的稳定运行。建议优先部署无状态服务(如 HTTP API 代理),并严格监控资源使用情况。对于高负载场景,仍推荐使用 x86 架构设备作为生产环境载体。


附:硬件兼容性测试列表

设备型号 CPU 架构 内存 Docker 运行状态
Raspberry Pi 4B ARM Cortex-A72 4GB ✔️ 稳定
GL-iNet MT1300 ARM Cortex-A7 1GB ⚠️ 需关闭 Swap
x86 工控机 Intel Celeron 8GB ✔️ 最佳性能
相关推荐
什么半岛铁盒10 分钟前
【Linux系统】Linux环境变量:系统配置的隐形指挥官
linux
Lw老王要学习42 分钟前
Linux容器篇、第一章_02Rocky9.5 系统下 Docker 的持久化操作与 Dockerfile 指令详解
linux·运维·docker·容器·云计算
橙子小哥的代码世界1 小时前
【大模型RAG】Docker 一键部署 Milvus 完整攻略
linux·docker·大模型·milvus·向量数据库·rag
倔强的石头1062 小时前
【Linux指南】用户与系统基础操作
linux·运维·服务器
云上艺旅2 小时前
centos升级内核
linux·运维·centos
kaikaile19952 小时前
centos开启samba服务
linux·运维·centos
云上艺旅2 小时前
centos部署k8s v1.33版本
linux·云原生·kubernetes·centos
好多知识都想学2 小时前
Centos 7 服务器部署多网站
linux·服务器·centos
好多知识都想学2 小时前
centos 7 部署awstats 网站访问检测
linux·运维·centos
颜淡慕潇3 小时前
【K8S系列】Kubernetes 中 Pod(Java服务)启动缓慢的深度分析与解决方案
容器·kubernetes·pod