【工具】手把手教你搭建嵌入式容器化开发环境!


大家好,我是杂烩君。

在嵌入式开发中,我们经常会遇到这样的场景:

  • 本地开发环境正常运行的代码,移植到同事电脑就报错。
  • 更换开发板后,编译工具链版本不兼容导致构建失败。
  • 团队协作时,不同成员的依赖库版本差异引发玄学问题。

这些问题的根源在于开发环境的不一致性

传统嵌入式开发依赖手动配置工具链、交叉编译器、库文件等,稍有疏漏就会导致 “环境依赖黑洞”。

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 在嵌入式场景中的潜力。



文章作者: 杂烩君
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 杂烩君 !
  目录