大家好,我是杂烩君。
在嵌入式开发中,我们经常会遇到这样的场景:
本地开发环境正常运行的代码,移植到同事电脑就报错。更换开发板后,编译工具链版本不兼容导致构建失败。团队协作时,不同成员的依赖库版本差异引发玄学问题。这些问题的根源在于开发环境的不一致性。
传统嵌入式开发依赖手动配置工具链、交叉编译器、库文件等,稍有疏漏就会导致 "环境依赖黑洞"。
Docker 容器化技术的出现,为解决这些痛点提供了全新方案。
单片机开发的朋友,可能不怎么了解Docker,有必要了解一下。嵌入式Linux开发中,常常使用Docker容器进行嵌入式开发。

有没有朋友好奇这张长图怎么绘制?PlantUML了解一下:嵌入式开发中PlantUML图表的应用!
在DevOps 与 CI/CD中,Docker 镜像成为嵌入式开发的标准化交付单元,结合 Jenkins 等工具链,实现自动化构建、测试和部署。
DevOps是一种文化和实践方法,涵盖了软件开发周期的全过程,包括开发、测试、部署、监控等,强调开发和运维团队的紧密合作。
CI/CD是持续集成和持续交付的简称,聚焦于软件开发的一部分流程,主要包括自动化的构建、测试、部署等。
一、Docker 如何实现环境一致性1. 容器化的三大核心优势标准化封装:将编译器、依赖库、脚本等打包成 Docker 镜像环境隔离:容器运行时与宿主机完全隔离,避免版本冲突跨平台迁移:一套镜像可在 Linux/macOS/Windows 上运行2. 典型容器化开发流程上面那张长图展示了较为全面的嵌入式容器化开发流程,包括几个关键阶段,比如开发环境设置、代码管理、容器化构建、测试、部署到硬件等。
实际上,我们搭建本地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
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 进行构建。
构建完成后,执行以下命令启动 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:指定要使用的镜像。在容器内部,验证交叉编译器是否配置成功:

命令:
exit6、重新进入容器如果你需要再次进入容器,可以使用以下命令重新启动并进入容器:
sudo docker start -i embedded-container7、编译测试实际开发中,我们在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 镜像名.tar2、通过私有仓库(如 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)运行Dockersudo 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 在嵌入式场景中的潜力。