核心内容摘要
2026最新!更贴合继续教育的降AI率网站,千笔·专业降AIGC智能体 VS speedai
Docker 是什么Docker 就是一个**“轻量级的虚拟机”**但它比虚拟机更聪明。
它把操作系统、代码库、依赖包全都打包在一起。
① 镜像 (Image) —— “游戏光盘”是什么这是一个只读的模板。
你的导师把配置好的环境Ubuntu ROS 2 Autoware 依赖打包成了一个文件这就叫镜像。
特点它是冰冻的怎么玩都不会坏。
你的操作就像你买了一张《黑神话悟空》的光盘所有人买到的光盘内容都是一模一样的。
② 容器 (Container) —— “游戏存档 / 运行中的游戏”是什么当你把“镜像”运行起来它就变成了“容器”。
这就是你现在终端里看到的root21f8611da6f8这个环境。
特点它是一次性的、临时的。
你在里面安装软件、编译代码都是在当前的“存档”里操作。
关键点如果你把容器删了docker rm你在里面装的软件、改的系统配置就全部消失了就像没保存游戏直接关机一样。
③ 挂载 (Volume) —— “连接现实世界的传送门” 作用因为容器里存不住东西我们需要把容器里的某个文件夹打通到你真实电脑WSL的硬盘上。
你的现状你的代码其实是在WSL真实世界里的。
Docker 只是负责提供一个编译环境编译器、ROS 工具。
它俩通过-v命令连在了一起。
图解你现在的套娃结构为了让你更清楚咱们再理一下这个层级从外到内Windows 11你的物理电脑房东。
WSL 2 (Ubuntu)寄生在 Windows 上的 Linux 系统你的出租屋。
你的代码文件存在这里Docker 引擎运行在 WSL 里的管家。
容器 (Autoware 环境)管家临时搭的一个帐篷。
你进去编译代码编译完你就出来了。
为什么要这样设计好处这种架构有巨大的优势统一标准不管你是用 Windows 还是 Mac只要跑这个 Docker 镜像大家的代码运行环境是像素级一致的。
不会出现“由于系统版本不同导致的 Bug”。
甚至车端一致你在电脑 Docker 里跑的代码最后部署到真实的自动驾驶汽车上时车上的电脑里跑的也是同一个 Docker 镜像。
这叫“端到端一致性”。
不怕搞坏如果你把 Docker 容器里的系统搞崩了比如误删了/usr/bin没关系。
exit退出docker rm删掉容器。
重新docker run瞬间又变回了一个全新的、干净的环境。
前提是你别把挂载的代码文件夹给删了
5.
总结实习生的 Docker 生存法则Docker 是你的“编译车间”你进去只是为了利用里面的工具gcc, colcon, ros2来干活。
代码在“外面”你的核心资产代码是通过挂载放进去的。
别太把容器当回事容器是消耗品坏了就换。
千万把挂载当回事那个连接内外的“传送门”文件夹是你的命根子。
误删容器了怎么办我们来拆解一下如果现在你的容器突然没了或者被你误删了会发生什么
需要重新下载几个 G 的系统吗不需要。
❌还记得我们说的“游戏光盘”镜像 Image吗Docker 镜像是存储在你的硬盘深处的删除容器存档并不会删除镜像光盘。
你重新敲一行启动命令docker run ...只需要1秒钟一个新的容器就会根据那个镜像立刻弹出来。
它不需要联网下载任何东西。
需要重新编译代码吗大概率不需要。
这得益于你的挂载Volume Mapping。
请回忆一下你编译生成的build和install文件夹在哪里它们是在~/work_space/lubo_auto_car目录下。
而这个目录是通过“传送门”直接连接到你的WSL一楼的。
结论容器虽然炸了但它死前编译好的build和install文件夹还安安全全地躺在你的 WSL 硬盘里。
恢复新容器启动后它再次连接到这个文件夹看到现成的install文件夹你只需要source install/setup.bash马上就能跑甚至不用重新编译。
那真正的“麻烦”在哪里你担心的“麻烦”主要来自这里——你在容器里的“临时装修”会丢失。
举个例子如果你在上一台容器里为了调试代码手动干了这些事apt install vim装了个编辑器pip install some-library装了个 Python 库export ROS_DOMAIN_ID30设了个环境变量且没写进配置文件一旦容器删了这些东西就真没了。
新启动的容器是一个**“恢复出厂设置”**的状态基于原始镜像。
你需要重新手动敲一遍这些安装命令。
总结两个灾难的对比灾难类型误删挂载的文件夹 (上次的事故)误删 Docker 容器 (你现在的担心)性质物理毁灭重启还原代码会丢吗会找不回就是永别不会代码在外面编译结果会丢吗会不会也在外面环境会丢吗不会会(临时装的软件要重装)恢复时间几小时 ~ 几天几分钟心情 (想离职) (啧真麻烦)⚡️ 给实习生的建议不要在容器里“偷偷”装软件。
如果你发现代码运行缺了一个库比如scipy不要只在终端里敲pip install scipy就算了。
一定要告诉你的导师让他把这个库加到Dockerfile镜像的配方表里去或者写在项目的依赖文档里。
这样下次大家启动新容器时环境就是自带这个库的了。
常用的Docker命令第一类镜像操作 这些命令是在操作那些只读的系统模板。
查看我有多少张光盘docker images作用列出本地下载好的所有镜像。
关注点REPOSITORY(名字),TAG(版本),IMAGE ID(身份证号),SIZE(大小)。
去公司网盘或者网上下载镜像docker pull 镜像名:版本号 # 例子docker pull osrf/ros:humble-desktop作用从网上下载镜像。
如果没写版本号默认下载最新版 (latest)。
删除镜像⚠️docker rmi 镜像ID 或 镜像名 # rmi remove image注意如果有容器存档正在使用这张光盘你是删不掉的。
你需要先删容器再删镜像。
第二类容器操作 (玩游戏/读档) 这是你每天工作频率最高的命令。
看看现在谁在运行docker ps作用列出所有正在运行的容器活着的。
重要信息CONTAINER ID(短ID),NAMES(你起的名字比如vigilant_newton)。
看看所有存档 (包括死掉的)docker ps -a作用非常重要很多时候你以为容器丢了其实它只是停止运行了Stopped。
加了-a(all) 才能看到它们。
启动/停止 容器docker start 容器名 # 启动一个停止的容器 docker stop 容器名 #以此停止一个运行的容器进入容器内部 这是你每天都要用的命令用来进入那个“黑框框”编译代码。
docker exec -it 容器名 bash拆解exec: 执行命令。
-it:interactive (交互式) tty (终端)。
人话给我一个能打字的终端。
bash: 我要用的具体程序Linux 的命令行外壳。
第三类创建与毁灭容器新建一个存档 (从镜像启动容器) 这是最长、最复杂但也最重要的命令。
docker run -it -d --name 起个名字 -v 宿主机路径:容器内路径 镜像名-d: 后台运行Detached。
不然你一关终端容器就挂了。
--name: 给容器起个好记的名字比如my_autoware不然它会随机叫happy_einstein之类的。
-v:挂载传送门也就是你之前栽跟头的地方。
把本地代码连进去。
例子docker run -it -d --name my_car -v ~/work_space:/root/work_space autoware/universe:latest删档 (删除容器)⚠️docker rm 容器名注意只能删停止状态的容器。
如果要强制删正在跑的加-f(force)docker rm -f 容器名。
再次提醒删了容器里面临时装的软件vim, ping就没了但挂载的代码WSL里不会丢。
案例解释
本地加载已有镜像 (Load Image)sudo docker load -i *.tar含义这是一个“离线安装”步骤。
作用如果你的公司内网不能随便下载 10GB 的镜像或者导师直接用 U 盘拷给你一个打包好的镜像文件.tar格式你就用这个命令把它解压并导入到你的本地 Docker 仓库里。
本地配置 (Display Configuration)这一大段全是为了一件事让 Docker 能“投屏”到你的屏幕上。
因为 Docker 本质上是一个没有屏幕的后台进程如果你想看 Rviz就必须打通它和宿主机你的电脑之间的图形显示通道。
xhost local:root这是一个“暴力”授权命令。
意思是允许本地的root用户也就是 Docker 容器里的默认用户访问我的屏幕。
XAUTH/tmp/.docker.xauth...xauth nlist ...这是更高级、更安全的做法。
它创建了一个“通行证”文件.docker.xauth。
它把你当前电脑的显示授权信息Magic Cookie复制到这个文件里。
目的稍后我们会把这个文件挂载进容器容器拿着这个“通行证”才被允许在你的屏幕上画图。
启动容器 (Run Container) ——最关键的一步这行命令非常长我们把它的参数拆开看每个都很重要Bashsudo docker run -it --gpus all \ --name autoware \ --envDISPLAY$DISPLAY \ --envQT_X11_NO_MITSHM1 \ --envXAUTHORITY/tmp/.docker.xauth \ -v /tmp/.X11-unix:/tmp/.X11-unix:rw \ -v /tmp/.docker.xauth:/tmp/.docker.xauth \ -v /etc/localtime:/etc/localtime:ro \ -v /home/y/work_space:/root/work_space \ # --- 重点关注这行 autoware_image:gpu--gpus all开启显卡加速。
没有这句你的深度学习模型跑不动Rviz 也会卡成 PPT。
--envDISPLAY$DISPLAY告诉容器“屏幕的地址在这里”。
--envQT_X11_NO_MITSHM1防闪退补丁。
这是为了解决 Qt 程序的共享内存 Bug不加这句Rviz 打开瞬间就会崩。
-v /tmp/.X11-unix:/tmp/.X11-unix:rw挂载图形接口。
这是物理上的显示插口必须挂载。
-v /tmp/.docker.xauth:/tmp/.docker.xauth挂载通行证。
把刚才第2步生成的“通行证”塞进容器。
-v /home/y/work_space:/root/work_space 高能预警这是你需要手动修改的地方/home/y/work_space是别人电脑上的路径。
你需要把它改成你自己的 WSL 路径比如~/autoware_ws/wordk_space。
如果不改Docker 启动后里面是空的或者直接报错路径不存在。
启动仿真 demoros2 launch autoware_launch planning_simulator.launch.xml ...含义这是容器启动成功并进入终端后运行的第一条命令。
作用启动 Autoware 的规划仿真器。
如果前面第
3 步配置正确此时你的屏幕上应该会弹出一个 Rviz 窗口显示出地图和小车。
总结这段脚本是“带显卡 带显示器”的 Docker 标准启动模板。
你需要注意的唯一修改点是仔细检查第 3 步里-v挂载代码的那一行确保冒号左边的路径是你自己电脑上真实的路径