Docker入门——机器人开发环境的隔离与复现 面试翻车现场面试过一个候选人我问他你们团队开发环境怎么管理的新人入职怎么配环境他说每个人自己装Ubuntu、ROS2、各种依赖遇到问题互相帮忙解决。我问如果两个人用了不同版本的库代码在一个人电脑上能跑另一个人跑不了呢他说那就……统一版本这就是在我电脑上能跑的经典问题。机器人开发依赖复杂——ROS2版本、Python版本、各种C库每个人环境不一样出了问题很难排查。Docker可以解决这个问题把整个开发环境打包成镜像任何人拉下来就能用环境完全一致。Docker是什么Docker是容器化平台。简单说它把应用程序和所有依赖打包在一起形成一个独立的运行环境容器。容器之间互相隔离和宿主机也隔离。虚拟机vs容器虚拟机模拟整个硬件运行完整的操作系统启动慢、资源占用大容器共享宿主机内核只隔离文件系统、进程、网络等启动快、资源占用小。安装DockerUbuntu上安装Docker# 卸载旧版本 sudo apt remove docker docker-engine docker.io containerd runc # 设置仓库 sudo apt update sudo apt install -y ca-certificates curl gnupg sudo install -m 0755 -d /etc/apt/keyrings curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg echo deb [arch$(dpkg --print-architecture) signed-by/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu $(. /etc/os-release echo $UBUNTU_CODENAME) stable | sudo tee /etc/apt/sources.list.d/docker.list /dev/null # 安装Docker sudo apt update sudo apt install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin # 把当前用户加入docker组免sudo sudo usermod -aG docker $USER重新登录后生效。测试安装docker run hello-world基本命令镜像操作docker pull ubuntu:22.04 # 下载镜像 docker images # 列出本地镜像 docker rmi ubuntu:22.04 # 删除镜像 docker build -t myimage . # 从Dockerfile构建镜像容器操作docker run -it ubuntu:22.04 bash # 运行容器交互式终端 docker ps # 列出运行中的容器 docker ps -a # 列出所有容器包括已停止的 docker stop container_id # 停止容器 docker start container_id # 启动已停止的容器 docker rm container_id # 删除容器 docker exec -it container_id bash # 进入运行中的容器-it是交互模式bash是启动后执行的命令。运行后你就进入了容器的bash。Dockerfile定义镜像Dockerfile是一个文本文件描述了如何构建镜像。# 基础镜像 FROM ubuntu:22.04 # 设置环境变量 ENV DEBIAN_FRONTENDnoninteractive # 安装依赖 RUN apt update apt install -y \ ros-humble-desktop \ python3-colcon-common-extensions \ rm -rf /var/lib/apt/lists/* # 设置工作目录 WORKDIR /robot_ws # 复制代码 COPY . . # 编译 RUN /bin/bash -c source /opt/ros/humble/setup.bash colcon build # 启动命令 CMD [/bin/bash]构建镜像docker build -t robot-dev:v1 .运行容器docker run -it robot-dev:v1 bash数据卷持久化数据容器删除后里面的数据就没了。用数据卷volume可以把宿主机的目录映射到容器里数据持久化。# 挂载目录 docker run -it -v /home/robot/robot_ws:/robot_ws robot-dev:v1 bash # 挂载多个目录 docker run -it \ -v /home/robot/robot_ws:/robot_ws \ -v /home/robot/data:/data \ robot-dev:v1 bash这样容器里的/robot_ws就是宿主机的/home/robot/robot_ws修改会同步。和机器人开发的关系Docker在机器人开发中非常有用环境一致性团队共享同一个镜像所有人开发环境完全一样。新人入职拉镜像就能开始开发不用花三天装环境。环境隔离不同项目用不同镜像依赖不冲突。项目A用ROS2 Humble项目B用ROS2 Iron互不影响。快速部署开发环境打包成镜像部署到机器人上也是同一个镜像避免在我电脑上能跑的问题。CI/CD集成自动化测试在容器里运行每次代码提交都在干净环境里测试结果可复现。面试常见考点Docker和虚拟机有什么区别——虚拟机模拟硬件运行完整操作系统启动慢、资源占用大容器共享宿主机内核启动快、资源占用小。容器更适合应用部署虚拟机适合需要完全隔离的场景。Dockerfile里FROM、RUN、CMD的区别——FROM指定基础镜像RUN在构建时执行命令结果会保存到镜像层CMD在容器启动时执行可以被覆盖。怎么把宿主机的文件传到容器里——用-v挂载目录或者用docker cp命令复制文件。容器删除后数据还在吗——容器本身的数据会丢失。用数据卷volume或绑定挂载bind mount可以持久化数据。Docker网络与ROS2Docker默认用bridge网络容器有独立的IP地址。如果你需要在容器里运行ROS2节点并和外部通信需要用host网络模式docker run --nethost。这样容器直接使用宿主机的网络栈DDS的multicast发现机制才能正常工作。否则容器内的ROS2节点无法被外部发现这是很多新手用Docker跑ROS2时踩的第一个坑。Docker在机器人开发中的应用Docker在机器人项目中最大的价值是环境隔离和可复现性。想象一下团队里每个人开发环境不同在我电脑上能跑的问题层出不穷。用Docker可以把ROS2版本、依赖库、编译工具链全部打包成镜像任何人拉取镜像就能得到完全一致的环境。实际使用中通常会把编译环境和运行环境分开用多阶段构建减小最终镜像体积。另外Docker镜像的层缓存机制也值得了解。Dockerfile中把不常变化的指令放前面比如安装系统依赖频繁变化的放后面比如拷贝源码这样可以充分利用缓存加速构建。给你的建议Docker是现代软件开发的标配机器人开发也应该用起来。先从简单的开始用现成的ROS2镜像osrf/ros:humble-desktop-full在容器里开发。熟悉后再自己写Dockerfile。团队共享一个基础镜像所有人用同样的环境。新人入职一条命令拉镜像马上开始开发。遇到依赖冲突、环境问题的试试Docker。把环境打包成镜像问题就消失了。下一篇会讲Docker进阶——多容器编排和机器人仿真环境搭建。上一篇第95篇 SSH远程开发——连接机器人本体调试的标配方式下一篇预告第97篇 Docker进阶——多容器编排和机器人仿真环境搭建