文章目錄
- 前言
- 一、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
驅動,需確保:
- 內核版本 ≥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: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
6.4 安裝cpolar插件
opkg install cpolar
opkg install luci-app-cpolar
opkg install luci-i18n-cpolar-zh-cn
6.5 重啟OpenWRT
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 | ?? 最佳性能 |