传统虚拟机: Docker 容器:
┌─────────────────┐ ┌─────────────────┐
│ App A │ App B │ │ App A │ App B │
├────────┬────────┤ ├────────┬────────┤
│ Guest │ Guest │ │ Docker Engine │
│ OS │ OS │ ├─────────────────┤
├────────┴────────┤ │ Host Kernel │
│ Hypervisor │ ├─────────────────┤
├─────────────────┤ │ Hardware │
│ Host OS │ └─────────────────┘
├─────────────────┤
│ Hardware │
└─────────────────┘
| 维度 | 虚拟机 | Docker 容器 |
|---|---|---|
| 启动速度 | 分钟级 | 秒级 |
| 内存占用 | GB 级 | MB 级 |
| 磁盘占用 | 数十 GB | 数百 MB |
| 隔离级别 | 完全隔离 (Hypervisor) | 进程隔离 (Namespace) |
| 性能 | 接近原生但有损耗 | 几乎等于原生 |
ghcr.io/tiryoh/ros2-desktop-vnc:humble 是一个预配置的 ROS2 桌面容器镜像:
在 Windows 下载 Docker Desktop,安装后确保 WSL2 后端已启用。
在 PowerShell 中执行:
# 拉取镜像
docker pull ghcr.io/tiryoh/ros2-desktop-vnc:humble
# 运行容器
docker run -p 6080:80 --shm-size=512m ghcr.io/tiryoh/ros2-desktop-vnc:humble
参数说明:
-p 6080:80:将容器的 80 端口映射到本机 6080 端口--shm-size=512m:增加共享内存,避免 GUI 应用崩溃

http://127.0.0.1:6080source /opt/ros/humble/setup.bash
ros2 run turtlesim turtlesim_node
💡 原理:noVNC 将 VNC 协议封装为 WebSocket,浏览器无需安装任何插件即可访问完整的 Linux 桌面环境。

# 查看运行中的容器
docker ps
# 查看所有容器(含已停止)
docker ps -a
# 停止容器
docker stop <container-id>
# 重新启动已停止的容器
docker start <container-id>
# 删除容器
docker rm <container-id>
# 删除镜像
docker rmi <image-name>
| 问题 | 原因 | 解决方案 |
|---|---|---|
| 端口 6080 访问无响应 | 容器未正确启动或端口冲突 | docker ps 确认容器在运行,检查端口映射 |
| 容器内 GUI 程序崩溃 | 共享内存不足 | 添加 --shm-size=512m 参数 |
| WSL2 中无法运行 Docker | Docker Desktop 未集成 WSL2 | Docker Desktop → Settings → Resources → WSL Integration |
| 浏览器连接被拒绝 | 防火墙阻拦或端口号错误 | 检查 Windows 防火墙,确认使用 127.0.0.1 而非 localhost |
| 容器关闭后数据丢失 | 未做持久化 | 使用 docker commit 保存容器状态(Week 11 详讲) |
本周跨越了从原生 ROS2 到容器化 ROS2 的关键一步:
Docker 容器化是 Week 10-12 高级实验的基础,后续将深入卷挂载、镜像提交和跨设备通信。