大家好,我是杂烩君。
在嵌入式开发中,我们经常会遇到这样的场景:
这些问题的根源在于开发环境的不一致性。
传统嵌入式开发依赖手动配置工具链、交叉编译器、库文件等,稍有疏漏就会导致 "环境依赖黑洞"。
Docker 容器化技术的出现,为解决这些痛点提供了全新方案。
单片机开发的朋友,可能不怎么了解Docker,有必要了解一下。嵌入式Linux开发中,常常使用Docker容器进行嵌入式开发。
有没有朋友好奇这张长图怎么绘制?PlantUML了解一下:嵌入式开发中PlantUML图表的应用!
在DevOps 与 CI/CD中,Docker 镜像成为嵌入式开发的标准化交付单元,结合 Jenkins 等工具链,实现自动化构建、测试和部署。
DevOps是一种文化和实践方法,涵盖了软件开发周期的全过程,包括开发、测试、部署、监控等,强调开发和运维团队的紧密合作。
CI/CD是持续集成和持续交付的简称,聚焦于软件开发的一部分流程,主要包括自动化的构建、测试、部署等。
上面那张长图展示了较为全面的嵌入式容器化开发流程,包括几个关键阶段,比如开发环境设置、代码管理、容器化构建、测试、部署到硬件等。
实际上,我们搭建本地docker开发环境只需要关注如下几个步骤:
下面我们一起搭建一个嵌入式 Linux 的 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"]
在包含 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
:指定要使用的镜像。在容器内部,验证交叉编译器是否配置成功:
命令:
exit
如果你需要再次进入容器,可以使用以下命令重新启动并进入容器:
sudo docker start -i embedded-container
实际开发中,我们在Ubuntu主机上编写代码,在主机终端git管理我们的代码,docker容器终端中进行编译:
通过以上步骤,我们就成功搭建了一个嵌入式 Linux 的 Docker 开发环境,并配置了交叉编译器。
我们制作好的Docker镜像有两种常用的方式分享给他人。
docker save -o 镜像名.tar <镜像名:标签>
如:
docker save -o embedded-docker.tar embedded-docker:v1.0
docker load -i 镜像名.tar
通过私有仓库分享,这种方式适合企业内部或私密分享,这也是我们公司里在用的方式。
例如安装 Harbor,配置仓库地址(如 http://your-harbor.com
)。
docker login your-harbor.com
docker tag <本地镜像名> your-harbor.com/namespace/镜像名:标签
docker push your-harbor.com/namespace/镜像名:标签
docker pull your-harbor.com/namespace/镜像名:标签
sudo docker run -it -v 主机路径:容器工作路径 --name embedded-container your-harbor.com/namespace/镜像名:标签
在嵌入式系统中,Docker 的应用趋势正随着物联网(IoT)、边缘计算和云原生技术的发展而快速演进。
本篇文章我们只是介绍了 Docker 搭建开发环境的优势。
使用Docker搭建嵌入式Linux开发环境,有研究表明,大致收益如:
Docker技术在我们嵌入式中,还有着不少使用场景,如:
资源效率优化:Docker 通过容器化技术实现应用隔离,相比虚拟机(VM)更轻量,适合嵌入式设备的低功耗、低算力场景。例如,ARM 架构的边缘设备通过 Docker 运行微服务,可减少资源占用。
跨平台部署:Docker 镜像支持跨硬件平台(如 x86、ARM)的可移植性,开发者可在本地开发后直接部署到嵌入式设备,降低适配成本。
与边缘计算的深度融合:Docker 容器承载 AI/ML 模型推理任务,结合边缘设备的本地处理能力(如 NPU 加速),实现实时决策(如工业质检、自动驾驶)。
Docker 在嵌入式领域的核心价值在于环境一致性、跨平台性和开发效率提升。未来将深度融入边缘计算、AI/ML 和云原生生态。我们需要关注轻量级容器技术优化、以充分发挥 Docker 在嵌入式场景中的潜力。
猜你喜欢:
一个非常轻量的嵌入式日志库!
一个面向对象的C语言框架!
一个非常轻量的嵌入式线程池库!
Github上热门 C 语言项目汇总!
实用 | 10分钟教你通过网页点灯
WiFi6+蓝牙+星闪,三合一开发板,真香!