KEEL · 龙骨 · A CURRICULUM FOR THE AI ERA

04 · 常用命令,以及什么时候别用它 — keel 龙骨

前三章你已经会"跑起来"和"装进去"了。这一章收口到两件事: 日常真正会用到的命令,和一个更重要的问题——什么时候不该用 Docker。

前三章你已经会"跑起来"和"装进去"了。这一章收口到两件事:
日常真正会用到的命令,和一个更重要的问题——什么时候不该用 Docker。

后半件才是这一章的主体。因为一个技术用得对不对,往往不取决于你多会用它,
而取决于你知不知道它的边界。

一、什么时候不该用 Docker

1. 你自己机器上的一次性小任务

想跑一个几行的脚本、转一个文件格式、试一个库——直接跑就是了。
为了跑一次而先写 Dockerfile、再 build、再 run,你花的时间比任务本身还多。

判断句:这个程序需要交给另一台机器、或另一个人跑吗?
如果答案是"不需要",Docker 能给你的收益就已经很小了。
它解决的核心问题是**"在我机器上是好的"**——如果你根本不需要搬,那个问题不存在。

2. 有图形界面的桌面程序

容器擅长的是没有界面的、在后台跑的服务。
一个需要窗口、需要鼠标点击的桌面程序,塞进容器不会更省事——
它还要额外解决"图形界面怎么显示出来"这一整套问题,而收益近乎为零。

3. 需要动内核、或直接操作硬件的程序

第一章说过:容器共享你本机的内核。所以下面这些做不了,或者要做得很别扭:

这不是"配置没写对",是模型本身的边界。 遇到这类需求,该用的是虚拟机或直接装在机器上。

4. 你要的只是"环境隔离",但程序本来就没有依赖

如果你那个程序是一个不需要任何额外依赖的单文件(编译好的可执行文件、纯标准库脚本),
那么"打包运行环境"这件事对它没有意义——它本来就没有环境可打包。

这时候上 Docker,你得到的是一个额外的间接层:多一步 build,多一层排查时要穿透的东西,
换来的只是"和别的服务隔离开"。值不值,取决于这个隔离对你有多重要。

5. 团队里没有一个人真的会维护它

这是最容易被忽略、代价最大的一条。

Docker 不是"装上就完事"的东西:镜像要更新(安全补丁)、构建会随上游基础镜像变化而失效、
docker system prune 之前要想清楚删的是什么。如果团队里没人真的管这些,
那套东西会从"基础设施"慢慢变成"没人敢动的一坨"。

这种情况下更诚实的选择是:先不引入,或者只在一个很小的范围里用它、并且有人真管。

一条共同的判断线索

上面五条其实是同一句话的不同侧面:

Docker 的价值,来自"这份东西需要被搬到别的环境去跑"这个事实。
搬得越多、环境差异越大,价值越大;不需要搬,价值就接近零。

所以拿到一个任务时,先问的不是"怎么用 Docker 做",而是**"它需要被搬吗"**。

二、一张速查表(用的时候回来查)

镜像——那张"光盘":

命令 做什么
docker images 列出本地所有镜像
docker pull nginx 只下载镜像,不跑
docker build -t myapp . 用当前目录的 Dockerfile 造一个镜像
docker rmi myapp 删掉一个镜像(先删掉用它的容器)

容器——那张光盘"播放的那一次":

命令 做什么
docker run -d --name x -p 8080:80 <镜像> 跑起来。-d 后台、--name 起名、-p 端口映射
docker ps 看正在运行的容器
docker ps -a 看全部容器(包括已经停掉的)
docker logs x 看它打印的日志——排查问题的第一件工具
docker exec -it x sh 进到容器里面看看(exit 出来)
docker stop x 停下来(容器还在)
docker start x 把停掉的容器再跑起来
docker rm x 删掉容器(先 stop)

清理——占地方的时候用:

命令 做什么
docker system df 看镜像 / 容器 / 缓存各占了多少空间
docker system prune 清理没用的东西。⚠️ 先看清它准备删什么再回车,这个命令不可撤销

不要背这张表。记住两件事就够了:docker ps -a 能看到所有容器,
docker logs <名字> 能看它说了什么。其余用到时回来查。

三、读完你能做什么

走到这里,你已经完成了这门课的目标:

下一步去哪

这门课到这里就结束了。它刻意不长——你已经知道它是什么、边界在哪,剩下的交给需要的时候再学。

进入 keel 阅读