半亩花草 发表于 6 天前

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

前言

OpenWrt 作为一个高度可定制的嵌入式 Linux 发行版,其模块化设计为 Docker 容器化摆设提供了可能性。
将 Docker 引入 OpenWrt 环境,能够带来以下上风:


[*]简化应用摆设: 无需手动安装依靠和配置环境,只需利用 Docker 镜像即可快速摆设应用。
[*]隔离性与安全性: Docker 容器提供应用隔离,制止应用之间的相互干扰和潜在安全风险。
[*]资源利用率提升: Docker 容器共享宿主机的内核,占用资源更少,能够充分利用 OpenWrt 设备的有限资源。
[*]可移植性与可扩展性: Docker 镜像可以在不同的 OpenWrt 设备之间轻松迁徙和摆设,方便扩展应用规模。
[*]版本控制与回滚: Docker 镜像具有版本控制功能,可以方便地回滚到之前的版本。
然而,受限于默认内核配置和硬件资源,在 OpenWrt 上运行 Docker 需解决内核功能支持与存储架构适配两大核心问题。本文将基于技术实践,分享在 OpenWrt 设备上搭建 Docker 环境的完备方案,涵盖从内核编译到容器优化的全流程。
https://i-blog.csdnimg.cn/direct/b463a5b8f67e4f4fad2796f3843390a4.png
一、OpenWrt 与 Docker 的集成条件

1.1 硬件与内核要求



[*]硬件配置:
CPU 需支持硬件假造化(ARMv7+/x86_64),内存 ≥1GB,存储空间 ≥4GB(建议通过 USB 扩展存储)。
[*]内核编译:
OpenWrt 默认内核未启用 Docker 依靠的以下模块,需通过 make menuconfig 手动启用:# 必需内核选项
CONFIG_CGROUPS=y          # 控制组资源隔离
CONFIG_NAMESPACES=y       # 容器命名空间
CONFIG_VETH=y             # 虚拟以太网设备
CONFIG_BRIDGE=y         # 网桥支持
CONFIG_OVERLAY_FS=y       # Overlay 文件系统

1.2 软件依靠



[*]第三方软件源:
OpenWrt 官方源不提供 Docker 软件包,需通过第三方源(如 istore)安装:# 添加 ARM 架构源示例
echo "src/gz istore https://istore.linkease.com/repo/arm_cortex-a9" >> /etc/opkg/customfeeds.conf
opkg update
opkg install docker dockerd

[*]存储配置:
挂载可读写分区作为 Docker 数据目次:mkdir -p /mnt/docker
mount /dev/sda1 /mnt/docker# 假设 sda1 为扩展存储设备
dockerd --data-root=/mnt/docker &

二、Docker 环境摆设与验证

2.1 底子服务配置

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

# 验证 Docker 安装
docker info | grep "Storage Driver"# 应返回 overlay2
2.2 存储驱动适配

若利用 overlay2 驱动,需确保:

[*]内核版本 ≥4.0
[*]文件系统为 ext4/btrfs
[*]执行 mount -t overlay overlay -o lowerdir=/mnt/docker,upperdir=/mnt/docker/diff,workdir=/mnt/docker/work /mnt/merged 测试挂载
三、容器化应用摆设实践

3.1 资源限制策略

通过 cgroups 控制容器资源开销:
# 限制容器内存为 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 环境:
opkg install python3 python3-pip
pip3 install docker-compose
编写 docker-compose.yml:
version: "3.8"
services:
web:
    image: nginx:alpine
    ports:
      - "8080:80"
    deploy:
      resources:
      limits:
          cpus: "0.5"
          memory: 256M
四、性能优化与监控

4.1 容器资源监控

# 实时查看容器资源占用
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:
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 端口服务:
/etc/init.d/uhttpd stop
/etc/init.d/uhttpd disable
5.2 低性能设备适配



[*]镜像构建:在 x86 主机交叉编译镜像后推送至仓库
[*]资源分配:利用 --cpuset-cpus 绑定特定 CPU 核心
[*]日志优化:限制容器日志大小防止存储溢出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 下载公钥

首先执行下方命令下载公钥:
wget -O cpolar-public.key http://openwrt.cpolar.com/releases/public.key
6.2 将cpolar源添加至包管理器

echo "src/gz cpolar_packages http://openwrt.cpolar.com/releases/packages/$(. /etc/openwrt_release ; echo $DISTRIB_ARCH)">>/etc/opkg/customfeeds.conf
6.3 更新包管理器

opkg update
https://i-blog.csdnimg.cn/img_convert/b99d62f0d315710abdf95892320d67cf.png
6.4 安装cpolar插件

opkg install cpolar
opkg install luci-app-cpolar
opkg install luci-i18n-cpolar-zh-cn
https://i-blog.csdnimg.cn/img_convert/e6fb004887ab9f2c84c6c2ed475a410d.png
https://i-blog.csdnimg.cn/img_convert/0125e6ee81b35feabc13f8a191ac86e6.png
https://i-blog.csdnimg.cn/img_convert/c1c19dc3515b29ca439eaa9789e37342.png
6.5 重启OpenWRT

reboot
然后可以看到OpenWRT重启,重启后重新登录OpenWRT后台,在左侧菜单的服务中就会出现cpolar服务,绑定token即可正常利用:
https://i-blog.csdnimg.cn/img_convert/a39d6f0b3a6f6f722c94794ba7ff54b2.png
6.6 为OpenWRT Web管理界面配置公网地点

首先,在OpenWRT管理界面左侧菜单中进入服务,选择cpolar内网穿透。
https://i-blog.csdnimg.cn/img_convert/d53c30d2933e6e75471d95c5e918906d.png
然后,点击打开webui管理界面:http://localhost:9200,在跳转的浏览器网页中输入你注册的cpolar账号密码进行登录:
https://i-blog.csdnimg.cn/img_convert/3fe5ccd5685a2d9e883e092143274da1.png
登录后,点击左侧仪表盘的隧道管理——创建隧道,
创建一个 OpenWRT Web管理界面的公网http地点隧道


[*]隧道名称:可自界说命名,留意不要与已有的隧道名称重复,本例中利用:openwrt
[*]协议:选择http
[*]本地地点:80
[*]域名范例:免费选择随机域名
[*]地域:选择China VIP
点击创建
https://i-blog.csdnimg.cn/img_convert/abac68f75f69b87ac34111635b7209d0.png
隧道创建成功后,点击左侧的状态——在线隧道列表,查看所天生的公网访问地点,有两种访问方式,一种是http 和https,任选其一即可。
https://i-blog.csdnimg.cn/img_convert/33cfb5e262c41348ce73e8fdd51d2c55.png
利用Cpolar天生的公网地点,在手机或恣意设备的浏览器进行登录访问,即可成功看到 OpenWRT Web管理界面,如许一个可以长途访问的公网地点就创建好了,利用了cpolar的公网域名,无需自己购买云服务器,即可到公网访问本地内网的openwrt系统了!
   ps:如果我们必要恒久异地长途访问OpenWRT Web管理界面,由于刚才创建的是随机的地点,24小时会发生变革。别的它的网址是由随机字符天生,不容易记忆。如果想把域名酿成固定的二级子域名,并且不想每次都重新创建隧道来长途访问,我们可以选择创建一个固定不变的公网地点来解决这个问题。
   《利用cpolar为本地openwrt web管理界面配置固定公网地点》
    总结

在 OpenWrt 上摆设 Docker 需克服内核适配与资源限制两大挑衅。通过自界说编译内核、扩展存储设备、限制容器资源,可在低功耗设备上实现轻量级容器化应用的稳定运行。建议优先摆设无状态服务(如 HTTP API 代理),并严酷监控资源利用环境。对于高负载场景,仍推荐利用 x86 架构设备作为生产环境载体。
附:硬件兼容性测试列表

设备型号CPU 架构内存Docker 运行状态Raspberry Pi 4BARM Cortex-A724GB✔️ 稳定GL-iNet MT1300ARM Cortex-A71GB⚠️ 需关闭 Swapx86 工控机Intel Celeron8GB✔️ 最佳性能
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作! 更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: OpenWrt 与 Docker:打造轻量级容器化应用平台技术分享