- 需要提前安装
docker与nvidia-container-toolkit==1.17.6。
nvidia-container-toolkit 1.18.0~1.19.1目前有 bug,因此依赖显卡的仿真环境需要安装 1.17.6 issue#1559
- 建议先做最小可用性检查:
docker --version
nvidia-smi
docker run --rm --gpus all nvidia/cuda:11.8.0-base-ubuntu20.04 nvidia-smi- 选择版本
- 修改镜像内用户 uid 以适配本地用户
bash build.sh <name>构建镜像- 启动时为了保证 gui 以及显卡调用
bash run_docker_gui.sh <name>
值得注意的:
- 当需要后续修改容器内 UID 以及 GID,以 root 启动容器,指定
export NEW_UID=1001
export NEW_GID=1001后运行 ch_uid_gid.sh
在使用的时候有几个常用 ssh 参数
-N -L l_port:r_ip:r_port user@host用于端口转发,访问跳板机后面的服务-R将远端的请求经过本地代理-D将本地的请求交给远端代理,用于给跳板机登录校园网
目前远程桌面使用novnc以后可以折腾一下sunshine+moonlight
- 容器需要有 privilege 权限才能启动
如果容器内已安装 Miniforge(默认路径 ~/miniforge3),可按以下步骤初始化并启用:
source ~/miniforge3/bin/activate
conda init --all执行 conda init --all 后,建议重新打开一个 shell 以确保初始化脚本生效。
在使用 run_docker_gui.sh 启动并正确透传 X11 的前提下,rviz、rqt 等可视化窗口可在本机或远程桌面环境中无缝显示与交互。
进入目录后执行:
cd cuda11_8_ROS
bash build.sh <image_name>build.sh 会执行 docker build --network host,并透传本机的 http_proxy 与 https_proxy 到构建参数。
cd cuda11_8_ROS
bash run_docker_gui.sh <container_name>run_docker_gui.sh 会使用以下关键参数启动容器:
--gpus all--network=host --ipc=host- X11 相关挂载与环境变量(
/tmp/.X11-unix、DISPLAY) --privileged--user ros--ulimit nofile=1024:524288
注意:该脚本固定使用镜像 cuda11_8_ros:latest 启动容器。如果你构建时使用了其他镜像名,请确保标签一致(例如直接构建为 cuda11_8_ros:latest),否则运行脚本会找不到镜像。
run_docker_gui.sh 使用了:
-v $(pwd)/mnt:/workspace该设计的核心意图是:在容器实例创建后,仍能通过调整 mnt 软链接目标,灵活修改容器内 /workspace 可见的目录范围。
这意味着:
- 你必须在
cuda11_8_ROS目录下执行脚本(保证$(pwd)/mnt正确)。 - 容器挂载入口固定为宿主机路径
$(pwd)/mnt,即cuda11_8_ROS/mnt。 cuda11_8_ROS/mnt应是一个指向宿主机真实工作目录的软链接。- 容器内
/workspace最终可见内容由mnt的软链接目标决定。
调整可见范围时,优先修改 mnt 的目标指向(例如切换到更大或更小的宿主目录),而不是改容器内路径。
创建或更新 mnt 软链接示例:
cd cuda11_8_ROS
ln -sfn /path/to/your/workspace mnt示例中 ln -sfn 会将 mnt 指向新的宿主目录目标,便于切换容器内 /workspace 的可见范围。
示例检查命令:
cd cuda11_8_ROS
ls -l mnt
readlink mnt如果软链接目标不存在或无权限,容器内 /workspace 可能为空或不可用;若切换目标后容器内未及时反映,以重启或重建容器实例作为兜底。
如果你在远程 ssh -X 场景运行,按脚本注释可额外挂载:
-v $HOME/.Xauthority:/root/.Xauthority
-v $HOME/.Xauthority:/home/ros/.Xauthority用于处理 X11 鉴权问题。