为什么嵌入式开发需要Docker?
1. 解决交叉编译环境问题
- 工具链版本冲突:不同项目需要不同版本的gcc-arm-none-eabi
- 依赖库管理:避免系统污染,隔离各种库文件
- 团队协作:确保所有开发者使用相同的编译环境
2. 快速环境搭建
- 一键启动:几秒钟获得完整的嵌入式开发环境
- 版本控制:开发环境也可以版本化管理
- 跨平台:Windows、Linux、macOS统一开发体验
核心概念
镜像(Image)
就像一个"开发环境安装包",包含了所有工具和库。
容器(Container)
从镜像启动的"开发环境实例",你在里面写代码、编译程序。
挂载(Volume)
把主机的代码目录"挂载"到容器里,这样修改的代码会同步保存。
快速安装
Ubuntu/Debian安装
1# 一键安装脚本
2curl -fsSL https://get.docker.com | sh
3
4# 配置用户权限(避免每次sudo)
5sudo usermod -aG docker $USER
6
7# 重新登录生效,或执行:
8newgrp docker
验证安装
1docker --version
2docker run hello-world
嵌入式开发常用命令
1. 获取嵌入式开发镜像
1# ARM开发环境
2docker pull arm32v7/gcc
3
4# STM32开发环境
5docker pull stm32duino/arduino-core-stm32
6
7# ESP32开发环境
8docker pull espressif/idf
9
10# 通用交叉编译环境
11docker pull multiarch/crossbuild
2. 启动开发容器
1# 基本启动(挂载当前目录)
2docker run -it -v $(pwd):/workspace arm32v7/gcc bash
3
4# 带端口映射(用于调试服务器)
5docker run -it -v $(pwd):/workspace -p 3333:3333 arm32v7/gcc bash
6
7# 后台运行容器
8docker run -d --name my-dev -v $(pwd):/workspace arm32v7/gcc tail -f /dev/null
9
10# 进入后台容器
11docker exec -it my-dev bash
3. 常用操作
1# 查看运行的容器
2docker ps
3
4# 停止容器
5docker stop my-dev
6
7# 删除容器
8docker rm my-dev
9
10# 查看本地镜像
11docker images
实战:STM32开发环境
1. 创建STM32开发镜像
创建 Dockerfile.stm32:
1FROM ubuntu:20.04
2
3# 避免交互式安装
4ENV DEBIAN_FRONTEND=noninteractive
5
6# 安装基本工具
7RUN apt-get update && apt-get install -y \
8 build-essential \
9 git \
10 wget \
11 curl \
12 unzip \
13 python3 \
14 python3-pip
15
16# 安装ARM工具链
17RUN apt-get install -y gcc-arm-none-eabi
18
19# 安装STM32CubeMX(可选)
20RUN apt-get install -y default-jre
21
22# 设置工作目录
23WORKDIR /workspace
24
25# 设置入口
26CMD ["/bin/bash"]
2. 构建和使用
1# 构建镜像
2docker build -f Dockerfile.stm32 -t stm32-dev .
3
4# 启动开发环境
5docker run -it -v $(pwd):/workspace stm32-dev
6
7# 在容器内编译
8cd /workspace
9make clean && make
实战:ESP32开发环境
1. 使用官方ESP-IDF环境
1# 拉取ESP-IDF镜像
2docker pull espressif/idf:latest
3
4# 启动ESP32开发环境
5docker run --rm -v $PWD:/project -w /project -it espressif/idf:latest
6
7# 在容器内操作
8idf.py build
9idf.py flash
2. 简化脚本
创建 esp-dev.sh:
1#!/bin/bash
2docker run --rm -v $PWD:/project -w /project -it \
3 --device=/dev/ttyUSB0 \
4 espressif/idf:latest bash
使用:
1chmod +x esp-dev.sh
2./esp-dev.sh
数据持久化
挂载项目目录
1# 挂载当前目录到容器的/workspace
2docker run -it -v $(pwd):/workspace image_name
3
4# 挂载指定目录
5docker run -it -v /home/user/projects:/workspace image_name
6
7# 只读挂载(防止容器修改主机文件)
8docker run -it -v $(pwd):/workspace:ro image_name
数据卷(用于工具链缓存)
1# 创建数据卷存储编译缓存
2docker volume create build-cache
3
4# 使用数据卷
5docker run -it -v $(pwd):/workspace -v build-cache:/cache image_name
多项目管理
使用Docker Compose
创建 docker-compose.yml:
1version: '3.8'
2
3services:
4 stm32-dev:
5 build:
6 context: .
7 dockerfile: Dockerfile.stm32
8 volumes:
9 - ./stm32-project:/workspace
10 working_dir: /workspace
11 stdin_open: true
12 tty: true
13
14 esp32-dev:
15 image: espressif/idf:latest
16 volumes:
17 - ./esp32-project:/project
18 working_dir: /project
19 devices:
20 - /dev/ttyUSB0:/dev/ttyUSB0
21 stdin_open: true
22 tty: true
使用:
1# 启动STM32开发环境
2docker-compose run stm32-dev
3
4# 启动ESP32开发环境
5docker-compose run esp32-dev
常用技巧
1. 简化命令
在 .bashrc 中添加别名:
1# STM32开发
2alias stm32='docker run -it --rm -v $(pwd):/workspace stm32-dev'
3
4# ESP32开发
5alias esp32='docker run -it --rm -v $(pwd):/project -w /project espressif/idf:latest'
6
7# ARM交叉编译
8alias arm-gcc='docker run -it --rm -v $(pwd):/workspace arm32v7/gcc'
2. 设备访问
1# 访问USB设备(调试器、下载器)
2docker run -it --device=/dev/ttyUSB0 -v $(pwd):/workspace image_name
3
4# 访问多个设备
5docker run -it \
6 --device=/dev/ttyUSB0 \
7 --device=/dev/ttyACM0 \
8 -v $(pwd):/workspace image_name
3. 网络调试
1# 映射GDB调试端口
2docker run -it -p 3333:3333 -v $(pwd):/workspace image_name
3
4# 映射Web服务端口(用于在线调试工具)
5docker run -it -p 8080:8080 -v $(pwd):/workspace image_name
常见问题
1. USB设备访问权限
1# 添加用户到dialout组
2sudo usermod -aG dialout $USER
3
4# 或临时修改设备权限
5sudo chmod 666 /dev/ttyUSB0
2. 容器内编译慢
1# 使用编译缓存卷
2docker run -it -v build-cache:/tmp -v $(pwd):/workspace image_name
3
4# 限制并行编译进程
5make -j$(nproc)
3. 清理空间
1# 清理停止的容器
2docker container prune
3
4# 清理未使用的镜像
5docker image prune
6
7# 一键清理所有未使用资源
8docker system prune
实用示例
嵌入式Linux开发
1# 使用交叉编译环境
2docker run -it --rm \
3 -v $(pwd):/workspace \
4 -e CROSS_COMPILE=arm-linux-gnueabihf- \
5 multiarch/crossbuild bash
RTOS项目编译
1# FreeRTOS项目
2docker run -it --rm \
3 -v $(pwd):/workspace \
4 -w /workspace \
5 arm32v7/gcc \
6 make -f freertos.mk
总结
Docker在嵌入式开发中的主要价值:
- 环境隔离:不同项目使用不同工具链版本
- 快速部署:团队成员快速获得一致的开发环境
- 跨平台:Windows/Linux/macOS统一开发体验
- 版本管理:开发环境也可以版本化
记住这几个命令就够了
1# 启动开发环境
2docker run -it -v $(pwd):/workspace image_name
3
4# 查看容器
5docker ps
6
7# 停止容器
8docker stop container_name
9
10# 清理资源
11docker system prune
专注于解决实际问题,不要被复杂概念困扰。Docker就是一个更好的"虚拟机",让嵌入式开发更简单。
