在OpenWrt設(shè)備上搭建Docker環(huán)境的完整方案
前言
OpenWrt 作為一個(gè)高度可定制的嵌入式 Linux 發(fā)行版,其模塊化設(shè)計(jì)為 Docker 容器化部署提供了可能性。
將 Docker 引入 OpenWrt 環(huán)境,能夠帶來以下優(yōu)勢(shì):
- 簡(jiǎn)化應(yīng)用部署: 無需手動(dòng)安裝依賴和配置環(huán)境,只需使用 Docker 鏡像即可快速部署應(yīng)用。
- 隔離性與安全性: Docker 容器提供應(yīng)用隔離,避免應(yīng)用之間的相互干擾和潛在安全風(fēng)險(xiǎn)。
- 資源利用率提升: Docker 容器共享宿主機(jī)的內(nèi)核,占用資源更少,能夠充分利用 OpenWrt 設(shè)備的有限資源。
- 可移植性與可擴(kuò)展性: Docker 鏡像可以在不同的 OpenWrt 設(shè)備之間輕松遷移和部署,方便擴(kuò)展應(yīng)用規(guī)模。
- 版本控制與回滾: Docker 鏡像具有版本控制功能,可以方便地回滾到之前的版本。
然而,受限于默認(rèn)內(nèi)核配置和硬件資源,在 OpenWrt 上運(yùn)行 Docker 需解決內(nèi)核功能支持與存儲(chǔ)架構(gòu)適配兩大核心問題。本文將基于技術(shù)實(shí)踐,分享在 OpenWrt 設(shè)備上搭建 Docker 環(huán)境的完整方案,涵蓋從內(nèi)核編譯到容器優(yōu)化的全流程。
一、OpenWrt 與 Docker 的集成前提
1.1 硬件與內(nèi)核要求
- 硬件配置:
CPU 需支持硬件虛擬化(ARMv7+/x86_64),內(nèi)存 ≥1GB,存儲(chǔ)空間 ≥4GB(建議通過 USB 擴(kuò)展存儲(chǔ))。 - 內(nèi)核編譯:
OpenWrt 默認(rèn)內(nèi)核未啟用 Docker 依賴的以下模塊,需通過make menuconfig
手動(dòng)啟用:
# 必需內(nèi)核選項(xiàng) CONFIG_CGROUPS=y # 控制組資源隔離 CONFIG_NAMESPACES=y # 容器命名空間 CONFIG_VETH=y # 虛擬以太網(wǎng)設(shè)備 CONFIG_BRIDGE=y # 網(wǎng)橋支持 CONFIG_OVERLAY_FS=y # Overlay 文件系統(tǒng)
1.2 軟件依賴
- 第三方軟件源:
OpenWrt 官方源不提供 Docker 軟件包,需通過第三方源(如istore
)安裝:
# 添加 ARM 架構(gòu)源示例 echo "src/gz istore https://istore.linkease.com/repo/arm_cortex-a9" >> /etc/opkg/customfeeds.conf opkg update opkg install docker dockerd
- 存儲(chǔ)配置:
掛載可讀寫分區(qū)作為 Docker 數(shù)據(jù)目錄:
mkdir -p /mnt/docker mount /dev/sda1 /mnt/docker # 假設(shè) sda1 為擴(kuò)展存儲(chǔ)設(shè)備 dockerd --data-root=/mnt/docker &
二、Docker 環(huán)境部署與驗(yàn)證
2.1 基礎(chǔ)服務(wù)配置
# 啟動(dòng) Docker 守護(hù)進(jìn)程(指定存儲(chǔ)路徑) /etc/init.d/docker start --data-root=/mnt/docker # 驗(yàn)證 Docker 安裝 docker info | grep "Storage Driver" # 應(yīng)返回 overlay2
2.2 存儲(chǔ)驅(qū)動(dòng)適配
若使用 overlay2
驅(qū)動(dòng),需確保:
- 內(nèi)核版本 ≥4.0
- 文件系統(tǒng)為 ext4/btrfs
- 執(zhí)行 mount -t overlay overlay -o lowerdir=/mnt/docker,upperdir=/mnt/docker/diff,workdir=/mnt/docker/work /mnt/merged 測(cè)試掛載
三、容器化應(yīng)用部署實(shí)踐
3.1 資源限制策略
通過 cgroups
控制容器資源開銷:
# 限制容器內(nèi)存為 256MB,CPU 權(quán)重為 50% docker run -d --name my_app \ --memory=256m \ --cpu-shares=512 \ -p 8080:80 \ nginx:alpine
3.2 Docker Compose 適配
OpenWrt 需手動(dòng)安裝 Python 環(huán)境:
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
四、性能優(yōu)化與監(jiān)控
4.1 容器資源監(jiān)控
# 實(shí)時(shí)查看容器資源占用 docker stats --format "table {{.Name}}\t{{.CPUPerc}}\t{{.MemUsage}}" # 生成性能報(bào)告 docker run --rm -v /var/run/docker.sock:/var/run/docker.sock \ docker.io/docker/docker-bench-security
4.2 鏡像精簡(jiǎn)策略
- 使用多階段構(gòu)建(Multi-stage Build)
- 選擇 Alpine 基礎(chǔ)鏡像
- 移除調(diào)試工具(如
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 默認(rèn)占用的 80 端口服務(wù):
/etc/init.d/uhttpd stop /etc/init.d/uhttpd disable
5.2 低性能設(shè)備適配
- 鏡像構(gòu)建:在 x86 主機(jī)交叉編譯鏡像后推送至倉庫
- 資源分配:使用
--cpuset-cpus
綁定特定 CPU 核心 - 日志優(yōu)化:限制容器日志大小防止存儲(chǔ)溢出
docker run --log-driver=json-file \ --log-opt max-size=10m \ --log-opt max-file=3
六、內(nèi)網(wǎng)穿透遠(yuǎn)程訪問
如果想實(shí)現(xiàn)出門在外,也能隨時(shí)隨地訪問家中的OpenWRT軟路由系統(tǒng),但因?yàn)闆]有公網(wǎng)IP而無法實(shí)現(xiàn)。可以借助cpolar內(nèi)網(wǎng)穿透工具來實(shí)現(xiàn)公網(wǎng)訪問!接下來介紹一下如何安裝cpolar內(nèi)網(wǎng)穿透并實(shí)現(xiàn)公網(wǎng)訪問!
首先需要在終端SSH連接OpenWRT系統(tǒng),輸入OpenWRT登錄時(shí)的root賬號(hào)密碼password即可成功連接。
6.1 下載公鑰
首先執(zhí)行下方命令下載公鑰:
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
6.4 安裝cpolar插件
opkg install cpolar opkg install luci-app-cpolar opkg install luci-i18n-cpolar-zh-cn
6.5 重啟OpenWRT
reboot
然后可以看到OpenWRT重啟,重啟后重新登錄OpenWRT后臺(tái),在左側(cè)菜單的服務(wù)中就會(huì)出現(xiàn)cpolar服務(wù),綁定token即可正常使用:
6.6 為OpenWRT Web管理界面配置公網(wǎng)地址
首先,在OpenWRT管理界面左側(cè)菜單中進(jìn)入服務(wù),選擇cpolar內(nèi)網(wǎng)穿透。
然后,點(diǎn)擊打開webui管理界面
:http://localhost:9200,在跳轉(zhuǎn)的瀏覽器網(wǎng)頁中輸入你注冊(cè)的cpolar賬號(hào)密碼進(jìn)行登錄:
登錄后,點(diǎn)擊左側(cè)儀表盤的隧道管理——創(chuàng)建隧道,
創(chuàng)建一個(gè) OpenWRT Web管理界面的公網(wǎng)http地址隧道
- 隧道名稱:可自定義命名,注意不要與已有的隧道名稱重復(fù),本例中使用:openwrt
- 協(xié)議:選擇http
- 本地地址:80
- 域名類型:免費(fèi)選擇隨機(jī)域名
- 地區(qū):選擇China VIP
點(diǎn)擊創(chuàng)建
隧道創(chuàng)建成功后,點(diǎn)擊左側(cè)的狀態(tài)——在線隧道列表,查看所生成的公網(wǎng)訪問地址,有兩種訪問方式,一種是http 和https,任選其一即可。
使用Cpolar生成的公網(wǎng)地址,在手機(jī)或任意設(shè)備的瀏覽器進(jìn)行登錄訪問,即可成功看到 OpenWRT Web管理界面,這樣一個(gè)可以遠(yuǎn)程訪問的公網(wǎng)地址就創(chuàng)建好了,使用了cpolar的公網(wǎng)域名,無需自己購買云服務(wù)器,即可到公網(wǎng)訪問本地內(nèi)網(wǎng)的openwrt系統(tǒng)了!
ps:如果我們需要長(zhǎng)期異地遠(yuǎn)程訪問OpenWRT Web管理界面,由于剛才創(chuàng)建的是隨機(jī)的地址,24小時(shí)會(huì)發(fā)生變化。另外它的網(wǎng)址是由隨機(jī)字符生成,不容易記憶。如果想把域名變成固定的二級(jí)子域名,并且不想每次都重新創(chuàng)建隧道來遠(yuǎn)程訪問,我們可以選擇創(chuàng)建一個(gè)固定不變的公網(wǎng)地址來解決這個(gè)問題。
總結(jié)
在 OpenWrt 上部署 Docker 需克服內(nèi)核適配與資源限制兩大挑戰(zhàn)。通過自定義編譯內(nèi)核、擴(kuò)展存儲(chǔ)設(shè)備、限制容器資源,可在低功耗設(shè)備上實(shí)現(xiàn)輕量級(jí)容器化應(yīng)用的穩(wěn)定運(yùn)行。建議優(yōu)先部署無狀態(tài)服務(wù)(如 HTTP API 代理),并嚴(yán)格監(jiān)控資源使用情況。對(duì)于高負(fù)載場(chǎng)景,仍推薦使用 x86 架構(gòu)設(shè)備作為生產(chǎn)環(huán)境載體。
附:硬件兼容性測(cè)試列表
設(shè)備型號(hào) | CPU 架構(gòu) | 內(nèi)存 | Docker 運(yùn)行狀態(tài) |
---|---|---|---|
Raspberry Pi 4B | ARM Cortex-A72 | 4GB | 穩(wěn)定 |
GL-iNet MT1300 | ARM Cortex-A7 | 1GB | 需關(guān)閉 Swap |
x86 工控機(jī) | Intel Celeron | 8GB | 最佳性能 |
以上就是在OpenWrt設(shè)備上搭建Docker環(huán)境的完整方案的詳細(xì)內(nèi)容,更多關(guān)于OpenWrt搭建Docker環(huán)境的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
docker搭建redis哨兵集群并且整合springboot的實(shí)現(xiàn)
本文主要介紹了docker搭建redis哨兵集群并且整合springboot的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-07-07Docker Base Image自己創(chuàng)建具體實(shí)現(xiàn)
這篇文章主要介紹了Docker Base Image創(chuàng)建具體實(shí)現(xiàn)的相關(guān)資料,這里提供了詳細(xì)的具體步驟,需要的朋友可以參考下2016-11-11Jenkins整合Docker實(shí)現(xiàn)CICD自動(dòng)化部署的詳細(xì)過程(若依項(xiàng)目)
本文介紹了如何使用Jenkins和Docker實(shí)現(xiàn)CI/CD自動(dòng)化部署,文章介紹了環(huán)境準(zhǔn)備,包括Jenkins、Docker、JDK、Node和Maven,然后討論了如何配置GitLab環(huán)境并利用Webhooks實(shí)現(xiàn)代碼的自動(dòng)拉取和部署,最后,展示了如何部署前后端分離的項(xiàng)目,并通過實(shí)際操作驗(yàn)證了整個(gè)流程的有效性2024-10-10docker中使用mysql數(shù)據(jù)庫實(shí)現(xiàn)局域網(wǎng)訪問
在本篇內(nèi)容里小編給大家整理了關(guān)于docker中使用mysql數(shù)據(jù)庫實(shí)現(xiàn)局域網(wǎng)訪問相關(guān)內(nèi)容,有需要的朋友們可以學(xué)習(xí)下。2020-03-03Docker創(chuàng)建容器時(shí)目錄權(quán)限踩坑
這篇文章主要介紹了Docker創(chuàng)建容器時(shí)目錄權(quán)限踩坑,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-03-03docker安裝openjdk并運(yùn)行jar包的操作方法
這篇文章主要介紹了docker安裝openjdk并運(yùn)行jar包的操作方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-12-12IDEA連接遠(yuǎn)程服務(wù)器Docker部署Spring Boot項(xiàng)目的詳細(xì)教程
這篇文章主要介紹了IDEA連接遠(yuǎn)程服務(wù)器Docker部署Spring Boot項(xiàng)目,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-06-06