大家好,我是雜燴君。
在嵌入式開發(fā)中,我們經(jīng)常會遇到這樣的場景:
- 本地開發(fā)環(huán)境正常運行的代碼,移植到同事電腦就報錯。更換開發(fā)板后,編譯工具鏈版本不兼容導致構建失敗。團隊協(xié)作時,不同成員的依賴庫版本差異引發(fā)玄學問題。
這些問題的根源在于開發(fā)環(huán)境的不一致性。
傳統(tǒng)嵌入式開發(fā)依賴手動配置工具鏈、交叉編譯器、庫文件等,稍有疏漏就會導致 "環(huán)境依賴黑洞"。
Docker 容器化技術的出現(xiàn),為解決這些痛點提供了全新方案。
單片機開發(fā)的朋友,可能不怎么了解Docker,有必要了解一下。嵌入式Linux開發(fā)中,常常使用Docker容器進行嵌入式開發(fā)。
有沒有朋友好奇這張長圖怎么繪制?PlantUML了解一下:嵌入式開發(fā)中PlantUML圖表的應用!
在DevOps 與 CI/CD中,Docker 鏡像成為嵌入式開發(fā)的標準化交付單元,結合 Jenkins 等工具鏈,實現(xiàn)自動化構建、測試和部署。
DevOps是一種文化和實踐方法,涵蓋了軟件開發(fā)周期的全過程,包括開發(fā)、測試、部署、監(jiān)控等,強調(diào)開發(fā)和運維團隊的緊密合作。
CI/CD是持續(xù)集成和持續(xù)交付的簡稱,聚焦于軟件開發(fā)的一部分流程,主要包括自動化的構建、測試、部署等。
一、Docker 如何實現(xiàn)環(huán)境一致性
1. 容器化的三大核心優(yōu)勢
標準化封裝:將編譯器、依賴庫、腳本等打包成 Docker 鏡像
環(huán)境隔離:容器運行時與宿主機完全隔離,避免版本沖突
跨平臺遷移:一套鏡像可在 Linux/macOS/Windows 上運行
2. 典型容器化開發(fā)流程
上面那張長圖展示了較為全面的嵌入式容器化開發(fā)流程,包括幾個關鍵階段,比如開發(fā)環(huán)境設置、代碼管理、容器化構建、測試、部署到硬件等。
實際上,我們搭建本地docker開發(fā)環(huán)境只需要關注如下幾個步驟:
二、構建docker鏡像
下面我們一起搭建一個嵌入式 Linux 的 Docker 開發(fā)環(huán)境并配置交叉編譯器:
1、安裝 Docker
我們需要先在我們的主機上安裝 Docker。不同的操作系統(tǒng)安裝方法有所不同。
以Ubuntu/Debian為例。
創(chuàng)建如下腳本docker_install.sh并執(zhí)行:
# 更新系統(tǒng)軟件包列表
sudo apt update
# 安裝必要的依賴包
sudo apt install apt-transport-https ca-certificates curl software-properties-common
# 添加Docker官方GPG密鑰
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
# 添加Docker軟件源
echo"deb [arch=$(dpkg --print-architecture)?signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu?$(lsb_release -cs)?stable"?| sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
# 更新軟件包列表
sudo apt update
# 安裝Docker引擎
sudo apt install docker-ce docker-ce-cli containerd.io
# 驗證Docker是否安裝成功
sudo docker run hello-world
2、創(chuàng)建 Dockerfile
Dockerfile 是用于構建 Docker 鏡像的腳本文件,下面我們創(chuàng)建一個包含交叉編譯器的嵌入式 Linux 開發(fā)環(huán)境。
# 使用基礎鏡像
FROM?ubuntu:22.04
# 設置環(huán)境變量,避免交互提示
ENV?DEBIAN_FRONTEND=noninteractive
# 更新系統(tǒng)軟件包列表并安裝必要的工具
RUN?apt-get update && apt-get install -y
? ? build-essential
? ? wget
? ? unzip
? ? && rm -rf /var/lib/apt/lists/*
# 下載并安裝交叉編譯器
# 這里以arm-linux-gnueabihf為例,你可以根據(jù)實際需求替換
RUN?apt-get update && apt-get install -y
? ? gcc-arm-linux-gnueabihf
? ? g++-arm-linux-gnueabihf
? ? && rm -rf /var/lib/apt/lists/*
# 設置工作目錄
WORKDIR?/app
# 定義默認命令
CMD?["/bin/bash"]
3、構建 Docker 鏡像
在包含 Dockerfile 的目錄下,執(zhí)行以下命令來構建 Docker 鏡像:
sudo docker build -t embedded-docker:v1.0?.
-t
:指定鏡像的標簽,這里我們將鏡像命名為embedded-docker
,標簽為v1.0
。
.
:表示使用當前目錄下的 Dockerfile 進行構建。
4、運行 Docker 容器
構建完成后,執(zhí)行以下命令啟動 Docker 容器:
sudo docker?run?-it -v /home/linuxzn:/app --name embedded-container embedded-docker:v1.0
-it
:以交互式終端模式運行容器。
-v
:將主機目錄映射到容器內(nèi)的工作目錄(主機路徑:容器路徑)。將主機的/home/linuxzn目錄內(nèi)容映射到容器/app路徑下。
--name
:指定容器的名稱為embedded-container
。
embedded-docker:v1.0
:指定要使用的鏡像。
在容器內(nèi)部,驗證交叉編譯器是否配置成功:
5、退出容器
命令:exit
6、重新進入容器
如果你需要再次進入容器,可以使用以下命令重新啟動并進入容器:
sudo docker start -i embedded-container
7、編譯測試
實際開發(fā)中,我們在Ubuntu主機上編寫代碼,在主機終端git管理我們的代碼,docker容器終端中進行編譯:
通過以上步驟,我們就成功搭建了一個嵌入式 Linux 的 Docker 開發(fā)環(huán)境,并配置了交叉編譯器。
三、Docker共享
我們制作好的Docker鏡像有兩種常用的方式分享給他人。
1、導出鏡像文件(離線分享)
(1)導出鏡像為.tar 文件
docker save -o 鏡像名.tar <鏡像名:標簽>
如:
docker save -o embedded-docker.tar embedded-docker:v1.0
(2)導入鏡像
docker load -i 鏡像名.tar
2、通過私有倉庫(如 Harbor)
通過私有倉庫分享,這種方式適合企業(yè)內(nèi)部或私密分享,這也是我們公司里在用的方式。
(1)搭建或使用私有倉庫
例如安裝 Harbor,配置倉庫地址(如?http://your-harbor.com
)。
(2)登錄私有倉庫
docker login your-harbor.com
(3)標記鏡像并推送
docker tag <本地鏡像名> your-harbor.com/namespace/鏡像名:標簽
docker push your-harbor.com/namespace/鏡像名:標簽
(4)他人拉取鏡像
docker pull your-harbor.com/namespace/鏡像名:標簽
(5)運行Docker
sudo docker run -it -v 主機路徑:容器工作路徑 --name embedded-container your-harbor.com/namespace/鏡像名:標簽
最后
在嵌入式系統(tǒng)中,Docker 的應用趨勢正隨著物聯(lián)網(wǎng)(IoT)、邊緣計算和云原生技術的發(fā)展而快速演進。
本篇文章我們只是介紹了 Docker 搭建開發(fā)環(huán)境的優(yōu)勢。
使用Docker搭建嵌入式Linux開發(fā)環(huán)境,有研究表明,大致收益如:
- 開發(fā)環(huán)境標準化時間從 4 小時縮短至 5 分鐘跨平臺編譯成功率從 65% 提升至 98%新成員上手時間減少 70%
Docker技術在我們嵌入式中,還有著不少使用場景,如:
資源效率優(yōu)化:Docker 通過容器化技術實現(xiàn)應用隔離,相比虛擬機(VM)更輕量,適合嵌入式設備的低功耗、低算力場景。例如,ARM 架構的邊緣設備通過 Docker 運行微服務,可減少資源占用。
跨平臺部署:Docker 鏡像支持跨硬件平臺(如 x86、ARM)的可移植性,開發(fā)者可在本地開發(fā)后直接部署到嵌入式設備,降低適配成本。
與邊緣計算的深度融合:Docker 容器承載 AI/ML 模型推理任務,結合邊緣設備的本地處理能力(如 NPU 加速),實現(xiàn)實時決策(如工業(yè)質(zhì)檢、自動駕駛)。
Docker 在嵌入式領域的核心價值在于環(huán)境一致性、跨平臺性和開發(fā)效率提升。未來將深度融入邊緣計算、AI/ML 和云原生生態(tài)。我們需要關注輕量級容器技術優(yōu)化、以充分發(fā)揮 Docker 在嵌入式場景中的潛力。