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