在嵌入式开发中,我们经常会遇到这样的场景:
- 本地开发环境正常运行的代码,移植到同事电脑就报错。
- 更换开发板后,编译工具链版本不兼容导致构建失败。
- 团队协作时,不同成员的依赖库版本差异引发玄学问题。
这些问题的根源在于开发环境的不一致性。
传统嵌入式开发依赖手动配置工具链、交叉编译器、库文件等,稍有疏漏就会导致 "环境依赖黑洞"。
Docker 容器化技术的出现,为解决这些痛点提供了全新方案。
单片机开发的朋友,可能不怎么了解 Docker,有必要了解一下。嵌入式 Linux 开发中,常常使用 Docker 容器进行嵌入式开发。
有没有朋友好奇这张长图怎么绘制?PlantUML 了解一下:嵌入式开发中 PlantUML 图表的应用!
在 DevOps 与 CI/CD 中,Docker 镜像成为嵌入式开发的标准化交付单元,结合 Jenkins 等工具链,实现自动化构建、测试和部署。
DevOps 是一种文化和实践方法,涵盖了软件开发周期的全过程,包括开发、测试、部署、监控等,强调开发和运维团队的紧密合作。
CI/CD 是持续集成和持续交付的简称,聚焦于软件开发的一部分流程,主要包括自动化的构建、测试、部署等。
一、Docker 如何实现环境一致性
1. 容器化的三大核心优势
- 标准化封装:将编译器、依赖库、脚本等打包成 Docker 镜像
- 环境隔离:容器运行时与宿主机完全隔离,避免版本冲突
- 跨平台迁移:一套镜像可在 Linux/macOS/Windows 上运行
2. 典型容器化开发流程
上面那张长图展示了较为全面的嵌入式容器化开发流程,包括几个关键阶段,比如开发环境设置、代码管理、容器化构建、测试、部署到硬件等。
实际上,我们搭建本地 docker 开发环境只需要关注如下几个步骤:
二、构建 docker 镜像
下面我们一起搭建一个嵌入式 Linux 的 Docker 开发环境并配置交叉编译器:
1、安装 Docker
我们需要先在我们的主机上安装 Docker。不同的操作系统安装方法有所不同。
以 Ubuntu/Debian 为例。
创建如下脚本 docker_install.sh 并执行:
# 更新系统软件包列表
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、创建 Dockerfile
Dockerfile 是用于构建 Docker 镜像的脚本文件,下面我们创建一个包含交叉编译器的嵌入式 Linux 开发环境。
# 使用基础镜像
FROM ubuntu:22.04
# 设置环境变量,避免交互提示
ENV DEBIAN_FRONTEND=noninteractive
# 更新系统软件包列表并安装必要的工具
RUN apt-get update && apt-get install -y \
build-essential \
wget \
unzip \
&& rm -rf /var/lib/apt/lists/*
# 下载并安装交叉编译器
# 这里以 arm-linux-gnueabihf 为例,你可以根据实际需求替换
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 的目录下,执行以下命令来构建 Docker 镜像:
sudo docker build -t embedded-docker:v1.0 .
-t
:指定镜像的标签,这里我们将镜像命名为embedded-docker
,标签为v1.0
。.
:表示使用当前目录下的 Dockerfile 进行构建。
4、运行 Docker 容器
构建完成后,执行以下命令启动 Docker 容器:
sudo docker run -it -v /home/linuxzn:/app --name embedded-container embedded-docker:v1.0
-it
:以交互式终端模式运行容器。-v
:将主机目录映射到容器内的工作目录(主机路径:容器路径)。将主机的/home/linuxzn 目录内容映射到容器/app 路径下。--name
:指定容器的名称为embedded-container
。embedded-docker:v1.0
:指定要使用的镜像。
在容器内部,验证交叉编译器是否配置成功:
5、退出容器
命令:
exit
6、重新进入容器
如果你需要再次进入容器,可以使用以下命令重新启动并进入容器:
sudo docker start -i embedded-container
7、编译测试
实际开发中,我们在 Ubuntu 主机上编写代码,在主机终端 git 管理我们的代码,docker 容器终端中进行编译:
通过以上步骤,我们就成功搭建了一个嵌入式 Linux 的 Docker 开发环境,并配置了交叉编译器。
三、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)
通过私有仓库分享,这种方式适合企业内部或私密分享,这也是我们公司里在用的方式。
(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/镜像名:标签
最后
在嵌入式系统中,Docker 的应用趋势正随着物联网(IoT)、边缘计算和云原生技术的发展而快速演进。
本篇文章我们只是介绍了 Docker 搭建开发环境的优势。
使用 Docker 搭建嵌入式 Linux 开发环境,有研究表明,大致收益如:
- 开发环境标准化时间从 4 小时缩短至 5 分钟
- 跨平台编译成功率从 65% 提升至 98%
- 新成员上手时间减少 70%
Docker 技术在我们嵌入式中,还有着不少使用场景,如:
- 资源效率优化:Docker 通过容器化技术实现应用隔离,相比虚拟机(VM)更轻量,适合嵌入式设备的低功耗、低算力场景。例如,ARM 架构的边缘设备通过 Docker 运行微服务,可减少资源占用。
- 跨平台部署:Docker 镜像支持跨硬件平台(如 x86、ARM)的可移植性,开发者可在本地开发后直接部署到嵌入式设备,降低适配成本。
- 与边缘计算的深度融合:Docker 容器承载 AI/ML 模型推理任务,结合边缘设备的本地处理能力(如 NPU 加速),实现实时决策(如工业质检、自动驾驶)。
Docker 在嵌入式领域的核心价值在于环境一致性、跨平台性和开发效率提升。未来将深度融入边缘计算、AI/ML 和云原生生态。我们需要关注轻量级容器技术优化、以充分发挥 Docker 在嵌入式场景中的潜力。
END
来源:strongerHuang
推荐阅读
欢迎大家点赞留言,更多 Arm 技术文章动态请关注极术社区嵌入式客栈专栏欢迎添加极术小姐姐微信(id:aijishu20)加入技术交流群,请备注研究方向。