Docker 命令速查

按排障顺序分组的 Docker 和 Compose 命令表。从「服务好像挂了」一路往下翻就能走完全程,会删数据的操作都单独标了风险。

显示 84 / 84 条命令

docker compose 和 docker-compose 的区别

Compose V2 把命令做成了 Docker CLI 的插件,写法是 docker compose(中间是空格);V1 是一个独立的 Python 程序,写法是 docker-compose(中间是连字符)。V1 从 2023 年起已经停止维护,新装的 Docker 只带 V2。两者配置文件基本兼容,但 version: 字段在 V2 里已经废弃,留着只会打印警告,可以直接删掉。

行为上有一处需要留神:V1 的 up 在配置没变时会复用现有容器,V2 对「配置变更」的判定更严格,有时会重建你不想重建的容器。想在改代码后强制走一遍干净流程,用 docker compose up -d --force-recreate 明确表达意图,比猜它会不会重建更省事。

为什么容器里访问不到其他容器

默认的 bridge 网络只提供 IP 互联,容器名不会被解析成 IP,所以 ping db 必然失败。要按服务名互访,必须自己 docker network create 建一个自定义网络,再把相关容器接进去——Docker 会为自定义网络内置 DNS。Compose 会自动建这样一个网络,所以 compose 里写服务名一直能通,这也解释了为什么单跑 docker run 时就突然不通了。

另一个常见现象是「宿主机的 localhost 连不上容器端口」。容器里的 localhost 指容器自己,宿主机上的 localhost 指宿主机;两者要靠 -p 映射打通。还有一类是映射写成了 127.0.0.1:8080:80,这只监听本机回环,外部访问不到——想对外提供服务要写 0.0.0.0:8080:80 或者干脆省略前面的地址。

8 条会删东西的命令

表里标了「注意」的 8 条里,真正不可逆的集中在卷和容器删除上。容器是可抛弃的,删了重建就行;卷不是,卷里装的是数据库文件和用户上传内容。docker compose down -v 和 docker volume prune -a 是两条最容易被顺手敲下去的删数据命令,前者常被当成「重来一遍」,后者常被当成「清一下磁盘」。

养成一个习惯就能避开绝大多数事故:执行任何 prune 或 down -v 之前,先跑 docker system df -v 和 docker volume ls 看一眼具体会删掉什么。另外,清理前最好把它挂到临时容器里导出一次,命令是 docker run --rm -v 卷名:/data -v "$PWD":/backup alpine tar czf /backup/卷名.tgz -C /data .,导完再删心里就有底了。

这份表的适用边界

命令以 Docker Engine 24 以后、Compose V2 为准。docker buildx bake 和 --cache-from type=registry 这类写法需要 BuildKit(现在默认开启,但老版本或某些发行版的包可能仍是旧构建器,用 docker buildx version 确认)。docker context 走 SSH 远程操作宿主机时,目标机器上的 Docker 版本不能太旧,否则部分子命令会缺失。

Compose 的部分同样以官方 Compose Specification 为准。老教程里常见的 docker-compose -f 文件 -p 项目名 参数在 V2 里改成了全局选项,位置必须在子命令之前写成 docker compose -f 文件 -p 项目名 ps,顺序写反会直接报错。