Docker 常用命令:按「我要干什么」排,而不是按字母

Docker 的命令不算多,但按字母背是最低效的方式——真到用的时候,你想的是“这容器怎么进去”,不是“i 开头的命令有哪些”。

下面按场景排。每条都标了会改什么,不安全的单独拎出来说。

先看现在有什么

docker ps                    # 正在跑的
docker ps -a                 # 包括已经退出的
docker images                # 本地有哪些镜像
docker stats                 # 实时 CPU / 内存 / 网络(Ctrl+C 退出)
docker stats --no-stream     # 只取一次快照

docker ps -a 特别有用:容器起不来的时候,它至少会出现在列表里,状态栏写着 Exited (1)。

看某个容器的细节,别急着 inspect 一大坨 JSON:

docker inspect 容器名 --format '{{.State.Status}}'
docker inspect 容器名 --format '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}'

--format 用 Go 模板,只取你要的字段,输出干净得多。

跑起来

# 最常用:后台跑、给个名字、端口映射、重启策略
docker run -d --name web -p 8080:80 --restart unless-stopped nginx

# 带环境变量和挂载
docker run -d --name app \
  -e TZ=Asia/Shanghai \
  -e APP_PORT=3000 \
  -v /srv/app/data:/data \
  -p 3000:3000 \
  myapp:latest

几个参数值得记住:

参数作用注意
-d后台运行不加会占住终端
--name起名字不写就是一串随机词
-p 8080:80宿主机端口:容器端口写反了连不上
-v 宿主:容器挂载目录路径必须是绝对路径
--restart unless-stopped崩溃或重启机器后自动拉起手动 stop 的不会起
--network加入自定义网络同网络的容器能用名字互访

--restart always 和 unless-stopped 的区别:前者连你手动 docker stop 的容器,在 Docker 重启后也会拉起来;后者尊重你最后一次手动操作。日常用后者更符合直觉。

进去看看

docker exec -it 容器名 sh        # 大多数镜像有 sh
docker exec -it 容器名 bash      # 基于 Debian/Ubuntu 的才有 bash
docker exec 容器名 ls /data      # 只想执行一条命令,不需要 -it

-it 是 -i(保持 stdin)+ -t(分配终端)。忘了 -t 会得到一个没有提示符、不能按方向键的壳。

如果镜像里连 sh 都没有(scratch 或 distroless),只能靠日志和 docker cp:

docker cp 容器名:/app/config.yml ./config.yml
docker cp ./config.yml 容器名:/app/config.yml

查日志

docker logs -f --tail 100 容器名     # 跟最新的 100 行
docker logs --since 10m 容器名       # 最近十分钟
docker logs --since 2026-10-17T10:00:00 容器名

-f 会一直挂着,像 tail -f。排查启动问题时,先 docker logs 再看 docker ps -a 的状态码,八成能定位。

日志无限长会把磁盘吃满。要么在 daemon 层限制,要么用 --log-opt:

docker run -d --log-opt max-size=10m --log-opt max-file=3 nginx

清理磁盘

docker system df 先看账:

docker system df
docker system df -v      # 细到每个镜像、每个卷

然后按攻击性从小到大清:

docker container prune          # 删所有已停止的容器
docker image prune              # 删悬空镜像(没有标签的)
docker image prune -a           # 删所有没被容器使用的镜像
docker volume prune             # 删没被使用的卷
docker builder prune            # 清构建缓存
docker system prune -a --volumes  # 上面全来一遍,慎用

--volumes 一定要看清楚再敲。数据库容器的数据卷如果当前没有容器挂载,会被当成“没使用”删掉。

编排相关

docker compose up -d             # 起一整套
docker compose down              # 停并删容器(默认保留卷)
docker compose down -v           # 连卷一起删
docker compose logs -f 服务名
docker compose restart 服务名
docker compose pull && docker compose up -d   # 拉新镜像并重建

docker compose down -v 是另一个高危命令,和上面 --volumes 同理。

两个救命技巧

容器起不来,但它退得太快,exec 不进去。 覆盖入口,直接开个壳:

docker run -it --entrypoint sh 镜像名

改了配置要生效。 大多数容器只在启动时读配置:

docker restart 容器名

如果配置是构建进镜像的,那就得重建镜像,restart 没用。

最后一句:把 docker run 那一长串写进 compose.yml,别留在 shell 历史里。三个月后你只会记得“当时好像加了三个 -v”。