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.pswp.cn/pingmian/78630.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/78630.shtml
英文地址,請注明出處:http://en.pswp.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元素動畫一般分為兩種:一種是元素基于當前位置的變換動畫,通過不明…