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

文章目录

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

  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 控制容器资源开销:

# 限制容器内存为 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:alpineports:- "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

image-20240417113415168

6.4 安装cpolar插件

opkg install cpolar
opkg install luci-app-cpolar
opkg install luci-i18n-cpolar-zh-cn

image-20240417154604437

image-20240417154621079

image-20240417154643961

6.5 重启OpenWRT

reboot

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

image-20240417121451765

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

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

image-20240417155727891

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

image-20240417155834051

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

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

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

点击创建

image-20240417160315275

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

image-20240417160543521

使用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⚠️ 需关闭 Swap
x86 工控机Intel Celeron8GB✔️ 最佳性能

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/78630.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

EasyRTC音视频实时通话嵌入式SDK,打造社交娱乐低延迟实时互动的新体验

一、方案背景 在数字化时代,社交娱乐已经成为人们生活中不可或缺的一部分。随着移动互联网和智能设备的普及,用户对实时互动的需求越来越高。EasyRTC作为一款基于WebRTC技术的实时音视频通信解决方案,凭借其低延迟、高稳定性和跨平台兼容性&…

软件编程命名规范

编程命名规范是保证代码可读性、可维护性和团队协作效率的重要基础。以下是涵盖主流编程语言的通用命名规范,结合行业最佳实践和常见规范(如Google、Microsoft、Airbnb等风格指南): 一、通用命名原则 清晰优先:名称应…

换张电话卡能改变IP属地吗?一文解读

在互联网时代,IP属地(即网络定位信息)的显示引发了许多用户的关注。有人好奇:更换电话卡(SIM卡)是否能改变自己的IP属地?本文将解析IP属地的定义、电话卡的作用,并深入探讨两者之间的…

前端:纯HTML、CSS和JS菜单样式

实现了一个多级折叠菜单系统,使用纯HTML、CSS和JavaScript(无任何框架) 一、二级菜单展开 1、实现效果 初始状态-展示全部一级菜单 选中共状态,一级标题选中共为蓝色背景色,二级标题选中共为蓝色文字,展开右侧图标为-,后缩状态右侧图标为+ 2、实现 ​​HTML结构​​ …

Centos8 安装 Docker

yum 更换国内源 1. 备份原 yum 配置 cd /etc/yum.repos.d/ mkdir backup mv *.repo backup/2. 下载新 yum 配置(阿里源) wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-8.repo3. 替换源中的系统版本变量 sed -…

AI测试工具Testim——告别自动化测试维护难题

随着人工智能技术的快速发展,AI测试工具正在成为提升软件研发效能的关键。每款AI的特性各有差异,今天,我们就给大家介绍一款专注于Web和移动应用的端到端的AI测试工具--Testim。 Testim的简介 官网地址:https://www.testim.io/ 简…

【默子AI】万字长文:MCP与A2A协议详解

【默子AI】万字长文:MCP与A2A协议详解 引言: 让一个大模型凭空解决所有问题,就像让一个书呆子不借助工具就去修汽车 即便他脑子里装满了理论知识,也缺少实践的“手脚”。 长期以来,AI助手(尤其是LLM&#x…

LeNet5 神经网络的参数解析和图片尺寸解析

1.LeNet-5 神经网络 以下是针对 LeNet-5 神经网络的详细参数解析和图片尺寸变化分析,和原始论文设计,通过分步计算说明各层的张量变换过程。 经典的 LeNet-5架构简化版(原始论文输入为 32x32,MNIST 常用 28x28 需调整&#xff09…

第二节:文件系统

理论知识 文件系统的基本概念:文件系统是操作系统中负责管理持久数据的子系统,它将数据组织成文件和目录的形式,方便用户存储和访问数据。Linux文件系统的类型:常见的 Linux 文件系统类型有 Ext2、Ext3、Ext4、XFS、Btrfs 等。Ex…

Python数据结构与算法(5)——动态规划

Python数据结构与算法(5)——动态规划 0. 学习目标1. 动态规划的基本概念1.1 什么是动态规划1.2 动态规划的核心思想1.3 动态规划的适用条件2. 动态规划的实现思路2.1 自顶向下:备忘录法 (Memoization)2.2 自底向上:表格法(Tabulation)3. 0/1 背包问题4. 最长公共子序列5…

【JAVA ee初阶】多线程(3)

一、出现线程安全的原因 1.【根本原因】线程的调度执行时随机的(抢占式执行)->罪魁祸首 2.多个线程同时修改同一个变量 如果是一个线程修改一个变量 或者 多个线程读取同一个变量 或者 多个线程修改不同变量 这些都没事。 3.修改操作不是原子的&a…

Halcon 3D 表面匹配基于形状

文章目录 prepare_object_model_3d 准备 3D 物体模型read_shape_model_3d — 读取3D匹配模型create_shape_model_3d 准备要匹配的3D模型find_shape_model_3d ——发现匹配模型project_shape_model_3d 将三维形状模型的边缘投影到图像坐标中。示例ignore_part_polarity&#xff…

【Linux】Java 开发者的 Linux 常用命令指南

Java 开发者的 Linux 常用命令指南 目录标题 Java 开发者的 Linux 常用命令指南1. Linux 目录结构2. 系统信息命令3. 服务管理系统服务防火墙管理 4. 文本编辑 (vi/vim)常用模式 5. 文件和目录操作查看与导航创建与删除查看文件内容查找文件 6. 用户管理7. 压缩和解压8. 权限管…

每日c/c++题 备战蓝桥杯(P1252洛谷 马拉松接力赛)

洛谷P1060 马拉松接力赛题解:贪心算法在资源分配中的巧妙应用 题目描述 P1060 马拉松接力赛是一道结合贪心策略与动态规划思想的资源分配问题。题目要求将25公里的马拉松接力赛合理分配给5名选手,使得总耗时最短。每位选手可跑1-10公里的整数距离&…

Nginx 中间件

Nginx(发音为 "engine-x")是一款开源的高性能 HTTP 服务器和反向代理服务器,最初由 Igor Sysoev 开发。 它以其高性能、稳定性、丰富的功能集和低资源消耗而闻名,广泛应用于全球的 Web 服务架构中。 作为中间件&#…

Neo4j在win下安装教程(docker环境)

1. 安装命令 1.1 基于正式neo4j安装–不用 docker run --name neo4j-container -p 7474:7474 -p 7687:7687 -d neo4j1.2 基于community安装 需要部署两个Neo4j,一个正式库prod,一个测试库dev。 neo4j默认监听7474(HTTP-也就是浏览器端口&…

kylin v10 + argo + ascend 310p多机多卡 pytorch distributed 训练

最近接了个模型训练编排多机多卡的改造需求,要求使用argo dag task启动多个节点,同时多个节点能实现 torch.distributed.launch 这样多机多卡的训练模式 简述技术 torch.distributed.launch命令介绍 我们在训练分布式时候,会使用到 torch.d…

[Mac] 使用homebrew安装miniconda

使用虚拟环境可以对不同项目的依赖进行隔离。可以使用venv或者conda来创建和使用虚拟环境。 venv是Python内置的虚拟环境管理模块,适合纯Python项目以及快速轻量级的开发和部署。conda具备更强大的版本管理能力,但是占用较大的磁盘空间。 考虑到我基本不…

CMU-15445(1)——环境搭建

前言 最近在找完暑期实习之后,终于有了一些干项目外的空余时间学习新的知识,在这么多轮面试中,数据库的考察非常多,但孱弱的数据库基础导致我有很多次面试被问住,因此我希望在学习CMU-15445(Fall 2024&…

CSS元素动画篇:基于当前位置的变换动画(四)

基于当前位置的变换动画(四) 前言透明效果类元素动画闪烁动画效果效果预览代码实现 淡入动画效果效果预览代码实现 淡出动画效果效果预览代码实现 结语 前言 CSS元素动画一般分为两种:一种是元素基于当前位置的变换动画,通过不明…