本节摘要:Docker 命令行是"对象 + 动词 + 参数"的层级结构,不是零散命令的堆积。本节教你读结构、认参数、查手册——把几百条子命令压缩成一张可推导的地图。
上一节让引擎有了回音,本节解决"对讲机怎么用"。很多教程按字母序列几十条命令让人背,这是把地图拆成碎片让你硬记。码头调度员培训不这么干:先教无线电的通话格式,再教几个高频手势,剩下对着手册查。Docker 命令行完全同理——它的结构本身会替你记忆。
先亲手把结构问出来。不带参数执行主命令,它会把所有对象列给你:
# 查看顶层命令分组(输出节选) docker --help # 常用管理命令: # builder 管理镜像构建 # compose 管理 Compose 编队(第 6 章) # container 管理容器 # image 管理镜像 # network 管理网络(第 5 章) # volume 管理数据卷(第 5 章)
一眼就能看出端倪:Docker 把世界分成了几个管理对象——container、image、network、volume、builder、compose。每个对象下面挂一组动词。验证一下:
# 对象 container 下的动词列表(输出节选) docker container --help # Commands: # ls 列出容器 # run 从镜像创建并启动容器 # start 启动已停止的容器 # stop 停止运行中的容器 # restart 重启容器 # rm 删除容器 # inspect 查看对象的底层信息 # logs 拉取容器日志 # exec 在运行中的容器里执行命令 # stats 实时资源占用
规律已经浮出水面:docker 对象 动词 参数。这套结构意味着你不需要"背命令",只需要记住不到十个对象、十来个动词,剩下的组合现推现用。
你可能见过 docker ps 也见过 docker container ls——它们是同一条命令。前者是历史遗留的短写法(早期版本只有零散命令),后者是标准化后的完整写法。日常高频命令有短写,冷门操作只有长写。本教程混用两种并注明,你在真实工作里遇到任何一种都能对上。
参数是命令行真正的暗语,几个高频参数值得现在就吃透:
# -d:后台运行(detached),不占用当前终端 docker run -d --name web01 nginx # --name:给容器起名,之后用名字操作它(否则引擎随机分配代号) docker stop web01 # -p:端口映射 宿主端口:容器端口(泊位分配,第 5 章详解) docker run -d -p 8080:80 --name web02 nginx # -e:注入环境变量 docker run -d -e TZ=Asia/Shanghai --name web03 nginx # -v:挂载数据卷(堆场寄存,第 5 章详解) docker run -d -v webdata:/usr/share/nginx/html --name web04 nginx
这些参数相当于作业指令:-d 是"吊上去就不用盯着",--name 是"给箱子挂牌",-p 是"分配靠泊位",-v 是"贵重物品寄存到堆场仓库"。往后每一章都会反复用到它们,此处混个脸熟即可。
命令地图全貌如下,建议对照它把 2.4 节的实操跑一遍:

图里那句"三板斧"值得单独强调:ls、inspect、rm 三个动词在所有对象上语义一致——列表、查详情、删除。学会一个对象的三板斧,等于学会了全部对象的。
真实工作里最常见的姿势不是"想起来",而是"查出来"。三层查询法:
# 第一层:主命令求助——不知道有哪些对象时 docker --help # 第二层:对象求助——不知道该对象有哪些动词时 docker network --help # 第三层:命令求助——不知道参数含义时 docker run --help | less # 重点看 Options 段;斜杠开头的一行表示该参数可用简写或分组
再给两个提升效率的习惯。其一,inspect 的输出是 JSON,配合格式化参数只提取你要的字段:
# 只看容器的 IP 地址,免得在几百行 JSON 里找 docker inspect web01 --format "容器IP: {{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}" # 输出示例:容器IP: 172.17.0.2
format 这套模板不只属于 inspect,ps 也吃同样的语法:
# 巡场速览:一行一只箱子,只留关心的三列 docker ps --format "{{.Names}}\t{{.Status}}\t{{.Ports}}" # web01 Up 2 minutes 0.0.0.0:8080->80/tcp # web03 Up 40 seconds
值班巡场时这比裸 ps 干净得多,写进脚本也更好解析。把 inspect 与 ps 的格式化取数合起来,"从输出里快速拿到要的字段"这门手艺就算入门了——后面每一章的实验都会反复用它。
其二,系统自带补全:bash 与 zsh 装好补全脚本后,连按两次 Tab 能列出所有子命令与参数——这是把"地图"装进手指的最低成本方式。
还有一条新手保护性习惯:先 dry-run 观察再落地。Docker 的多数命令没有"撤销",起错了箱子删掉便是,但删除类命令(rmi、system prune)没有回收站。给删除动作加一道"先查后删"的手续,成本极低收益极高:
# 危险动作前先看清目标:prune 类命令先模拟清单 docker images --filter dangling=true --format "{{.ID}} {{.Repository}}:{{.Tag}}" # 确认清单里没有要保留的货,再执行 docker image prune
docker ps 与 docker container ls 等价:短写是历史遗留,长写是标准结构。规程背熟,正式上工——下一节去堆场提你人生第一票正式的货。