KEEL · 龙骨 · A CURRICULUM FOR THE AI ERA
04 · 常用命令,以及什么时候别用它 — keel 龙骨
前三章你已经会"跑起来"和"装进去"了。这一章收口到两件事: 日常真正会用到的命令,和一个更重要的问题——什么时候不该用 Docker。
前三章你已经会"跑起来"和"装进去"了。这一章收口到两件事:
日常真正会用到的命令,和一个更重要的问题——什么时候不该用 Docker。
后半件才是这一章的主体。因为一个技术用得对不对,往往不取决于你多会用它,
而取决于你知不知道它的边界。
一、什么时候不该用 Docker
1. 你自己机器上的一次性小任务
想跑一个几行的脚本、转一个文件格式、试一个库——直接跑就是了。
为了跑一次而先写 Dockerfile、再 build、再 run,你花的时间比任务本身还多。
判断句:这个程序需要交给另一台机器、或另一个人跑吗?
如果答案是"不需要",Docker 能给你的收益就已经很小了。
它解决的核心问题是**"在我机器上是好的"**——如果你根本不需要搬,那个问题不存在。
2. 有图形界面的桌面程序
容器擅长的是没有界面的、在后台跑的服务。
一个需要窗口、需要鼠标点击的桌面程序,塞进容器不会更省事——
它还要额外解决"图形界面怎么显示出来"这一整套问题,而收益近乎为零。
3. 需要动内核、或直接操作硬件的程序
第一章说过:容器共享你本机的内核。所以下面这些做不了,或者要做得很别扭:
- 装自己编译的内核驱动;
- 改内核参数(
sysctl那一类调优); - 直接操作某个硬件设备。
这不是"配置没写对",是模型本身的边界。 遇到这类需求,该用的是虚拟机或直接装在机器上。
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 <名字>能看它说了什么。其余用到时回来查。
三、读完你能做什么
走到这里,你已经完成了这门课的目标:
- 能跑起别人做好的镜像,也能把自己的程序装进去跑起来;
- 能看懂
docker run那一行每一段在做什么; - 能说清镜像和容器的区别;
- 能判断一个任务该不该用 Docker——这是这一章最想留给你的一句话。
下一步去哪
- 想知道"用对"是什么样:《Docker 应用课》。
它不讲"怎么跑起来"(你已经会了),讲的是顺序怎么排、边界怎么把、出事怎么查——
也就是把 Dockerfile 与编排文件写成别人机器上也不会坏的样子。 - 遇到某个名词卡住:《Docker 概念课》。
镜像、层、构建上下文各自一页,讲它的来历、是什么、长什么样。 - 要把东西发到服务器上:《构建打包与部署上线》。
镜像在那门课里是发布产物,管的是版本、回滚和供应链。
这门课到这里就结束了。它刻意不长——你已经知道它是什么、边界在哪,剩下的交给需要的时候再学。