Docker进阶——多容器编排和机器人仿真环境搭建
面试翻车现场
上篇讲了Docker基础,有读者问:"机器人系统那么复杂,一个容器够吗?"
确实不够。一个完整的机器人系统通常包含多个组件:导航、感知、规划、控制、仿真器……每个组件都有各自的依赖。如果全塞进一个容器,镜像会很大,而且难以维护。
Docker Compose可以解决这个问题——用多个容器分别运行不同的组件,统一管理。今天咱们聊聊Docker进阶用法。
Docker Compose:多容器编排
Docker Compose是一个工具,用YAML文件定义和运行多容器应用。
安装Docker Compose:
sudo apt install docker-compose-plugin创建一个docker-compose.yml文件:
version: '3.8' services: ros-master: image: osrf/ros:humble-desktop-full container_name: ros_master command: ros2 run demo_nodes_cpp talker networks: - robot_net robot-node: image: osrf/ros:humble-desktop-full container_name: robot_node command: ros2 run demo_nodes_py listener networks: - robot_net depends_on: - ros-master networks: robot_net: driver: bridge启动所有服务:
docker-compose up -d # -d表示后台运行查看状态:
docker-compose ps # 列出所有容器 docker-compose logs # 查看所有日志 docker-compose logs -f robot-node # 实时跟踪某个服务的日志停止所有服务:
docker-compose down机器人仿真环境搭建
用Docker搭建Gazebo仿真环境,需要处理图形显示的问题。
方法1:使用X11转发
version: '3.8' services: gazebo: image: osrf/ros:humble-desktop-full container_name: gazebo_sim environment: - DISPLAY=$DISPLAY - QT_X11_NO_MITSHM=1 volumes: - /tmp/.X11-unix:/tmp/.X11-unix:rw command: ros2 launch gazebo_ros gazebo.launch.py network_mode: host启动前需要允许本地X server连接:
xhost +local:docker方法2:使用noVNC(浏览器访问)
如果机器人没有显示器,可以用noVNC通过浏览器访问图形界面:
version: '3.8' services: gazebo: image: tiryoh/ros2-desktop-vnc:humble container_name: gazebo_vnc ports: - "6080:80" # noVNC端口 environment: - RESOLUTION=1920x1080 shm_size: "2gb" # 共享内存,Gazebo需要启动后,浏览器访问http://localhost:6080就能看到Gazebo界面。
GPU加速:容器里用显卡
机器人仿真需要GPU加速。Docker默认不支持GPU,需要安装NVIDIA Container Toolkit:
# 安装NVIDIA驱动和CUDA(宿主机) # 然后安装NVIDIA Container Toolkit distribution=$(. /etc/os-release;echo $ID$VERSION_ID) curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey | sudo apt-key add - curl -s -L https://nvidia.github.io/nvidia-docker/$distribution/nvidia-docker.list | sudo tee /etc/apt/sources.list.d/nvidia-docker.list sudo apt update sudo apt install -y nvidia-container-toolkit sudo systemctl restart docker在docker-compose.yml里启用GPU:
services: gazebo: image: osrf/ros:humble-desktop-full deploy: resources: reservations: devices: - driver: nvidia count: 1 capabilities: [gpu]或者用docker run:
docker run --gpus all -it osrf/ros:humble-desktop-full bash数据持久化和共享
多个容器需要共享数据时,用命名卷(named volume):
version: '3.8' services: robot1: image: robot-dev:v1 volumes: - shared_data:/data robot2: image: robot-dev:v1 volumes: - shared_data:/data volumes: shared_data: driver: local driver_opts: type: none o: bind device: /home/robot/shared这样两个容器都能访问/home/robot/shared目录。
和机器人开发的关系
Docker Compose在机器人开发中的典型应用:
多机器人仿真:每个机器人一个容器,共享网络,模拟多机器人协作场景。
分离开发和仿真:开发容器编译代码,仿真容器运行Gazebo,通过共享卷或网络通信。
CI/CD流水线:代码提交后,自动在容器里编译、测试,确保每次提交都在干净环境里验证。
快速部署:开发环境打包成镜像,部署到机器人上也是同一套镜像,避免环境差异导致的问题。
面试常见考点
"Docker Compose和Docker的区别?"——Docker是单容器管理工具,Docker Compose是多容器编排工具。Compose用YAML文件定义多个服务,一条命令启动所有容器。
"容器之间怎么通信?"——同一个docker-compose网络里的容器可以用容器名作为主机名互相访问。比如robot-node可以通过ros-master这个主机名访问另一个容器。
"怎么在容器里使用GPU?"——安装NVIDIA Container Toolkit,运行时加--gpus all参数,或在compose文件里配置GPU资源。
"Docker容器数据怎么持久化?"——用数据卷(volume)或绑定挂载(bind mount)。容器删除后,数据卷里的数据还在。
Docker Compose与多容器编排
实际机器人系统中通常有多个组件需要协同运行,比如感知节点、规划节点、控制节点等。Docker Compose可以用一个YAML文件定义所有服务,一条命令全部启动。配置中关键是设置好容器间的网络通信,用networks定义自定义网络,容器之间通过服务名互相访问。面试时如果被问到容器编排,能说出Compose的基本用法就足够了。
给你的建议
Docker Compose是多容器编排的标准工具,做机器人开发值得学习。
先从简单的开始:用Compose管理ROS2节点和仿真器。熟悉后再尝试更复杂的场景,比如多机器人仿真、CI/CD流水线。
GPU加速对仿真很重要。如果你的机器人需要跑Gazebo,一定要配置NVIDIA Container Toolkit,否则仿真会卡成PPT。
数据持久化别忘了配置。容器删除后数据就没了,用volume把重要数据保存到宿主机。
上一篇:第96篇 Docker入门——机器人开发环境的隔离与复现
下一篇预告:第98篇 Git基础——add/commit/push/branch的正确使用姿势
