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”。