Docker介绍
Docker 是轻量级容器化平台,把应用及其依赖(库、环境、配置)打包成镜像 (Image) ,运行时生成容器 (Container)。
- 镜像 Image:应用模板,类似系统盘
.iso
- 容器 Container:镜像运行后的实例,可启动/停止/删除
- Dockerfile:构建镜像的脚本
- Registry:镜像仓库(Docker Hub / 私有 Registry)
Docker环境搭建
常用 Docker 命令
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| docker ps docker ps -a docker info
docker images docker pull nginx docker build -t my-hello:latest . docker save -o my-hello.tar my-hello:latest docker load -i my-hello.tar
docker run -d -p 8080:80 nginx docker start <name> docker stop <name> docker rm <id> docker rmi <id>
|
Docker 使用示例:hello-algo
- 拉取源码
1 2 3
| git clone git@github.com:krahets/hello-algo.git cd hello-algo docker compose up -d
|
- 打开浏览器访问:
1 2
| open http://localhost:8000 open http://your-server-ip:8000
|
- 进入容器运行代码
1 2 3 4 5
| docker exec -it hello-algo-code bash root@xxxx:/codes root@xxxx:/codes exit docker compose down
|
exit,不用时清理: docker compose down
- 定制语言环境
1 2 3 4 5 6 7
| services: hello-algo-code: build: context: . args: LANGS: "python java"
|
- 重新构建 & 启动
1 2
| docker compose build docker compose up -d
|
ESP-IDF v5.4 Docker 使用记录
一、前置条件
- 已安装 Docker(Linux / WSL / macOS)
- 已拉取 ESP-IDF v5.4 官方镜像:
1
| docker pull espressif/idf:release-v5.4
|
1 2 3 4 5
| ~/esp/work/coze_ws_demo ├─ CMakeLists.txt ├─ main/ ├─ components/ ├─ sdkconfig
|
二、核心思想(一定要理解)
- Docker 不拷贝工程,而是 目录映射(volume)
- Docker 内的
/work/coze_ws_demo
- 等价于宿主机的
~/esp/work/coze_ws_demo
三、启动 Docker 并进入工程目录 ⭐⭐⭐
1 2 3 4 5 6 7
| docker run -it --rm \ --device=/dev/ttyUSB0 \ -v ~/esp/work:/work \ -v ~/.ssh:/root/.ssh:ro \ -w /work/coze_ws_demo \ espressif/idf:release-v5.4 \ bash -c "git config --global --add safe.directory /work/coze_ws_demo && bash"
|
- 遇到问题,
idf_component.yml中包含有本地路径,链接时不会执行:1 2 3 4 5 6 7
| dependencies: ... protocol_examples_common: path: /home/ubuntu/esp/esp-adf/esp-idf/examples/common_components/protocol_examples_common 改为 cp -r /opt/esp/idf/examples/common_components/protocol_examples_common components/ path: ../components/protocol_examples_common
|
参数说明
| 参数 |
作用 |
-it |
交互终端 |
--rm |
容器退出后自动删除 |
-v ~/esp/work:/work |
将宿主机目录映射到容器 |
-v ~/.ssh:/root/.ssh:ro |
挂载私钥 |
-w /work/coze_ws_demo |
进入工程目录 |
espressif/idf:release-v5.4 |
ESP-IDF v5.4 镜像 |
进入后你会看到:
1
| root@xxxx:/work/coze_ws_demo#
|
四、烧录 ESP32(可选)
方法一:Docker 直接烧录(推荐)
1 2 3 4 5
| docker run -it --rm \ --device=/dev/ttyUSB0 \ -v ~/esp/work:/work \ -w /work/coze_ws_demo \ espressif/idf:release-v5.4
|
容器内执行:
1
| idf.py flash && idf.py monitor
|
例:
1
| idf.py -p /dev/ttyUSB0 -b 1152000 flash && idf.py -p /dev/ttyUSB0 monitor
|
注意:
方法二:Docker 编译 + 宿主机烧录
- Docker 与宿主机的 ESP-IDF 环境不一致,导致方法二失败
- IDF 版本不一致
- Python 虚拟环境不同
- 工具链路径写死在 build 目录
- Component Manager 解析结果不同
五、退出并关闭容器
在 Docker 中使用 ESP-IDF 完成编译或调试后,可以按以下方式安全退出并关闭容器:
1️⃣ 直接退出并关闭容器(推荐)
使用了 --rm 参数,退出后容器会自动删除
2️⃣ 强制中断(不推荐,除非卡死)
1 2 3
| Ctrl+C docker ps docker stop <container_id>
|
3️⃣ 数据安全
✅ 因为使用 -v ~/esp/work:/work 映射目录,源码、build、sdkconfig 都在宿主机,不会丢失
六、常见问题排查
idf.py: command not found→ 未使用 ESP-IDF 镜像
- Docker 无法访问工程目录 → 检查
-v /home/用户名/esp/work:/work
- USB 权限问题:
1 2
| ls -l /dev/ttyUSB0 sudo chmod 666 /dev/ttyUSB0
|
七、推荐长期使用的「万能启动命令」⭐⭐⭐
1 2 3 4
| docker run -it --rm \ -v ~/esp/work:/work \ -w /work/coze_ws_demo \ espressif/idf:release-v5.4
|
八、工程习惯建议⭐⭐⭐
- Docker 只负责编译 / 烧录 / menuconfig
- 工程代码始终在宿主机编辑
- 一个 Docker 对应一个 IDF 版本,避免污染系统
九、建议的工程习惯
- Docker 只负责:编译 / 烧录 / menuconfig
- 工程代码:始终在宿主机编辑
- 一个 Docker = 一个 IDF 版本,永不污染系统
十、适用场景
- ESP32 / ESP32-S3 / ESP32-C3
- ESP-IDF v5.4
- Audio / ESP-GMF / Coze / AFE 项目
维护者备注:
- 本文档用于长期记录 Docker + ESP-IDF 标准用法
- 如需升级 IDF,仅替换镜像版本即可