Docker 常用命令速查与磁盘急救:从入门到清理 40GB 垃圾

Docker 的问题分两类:不会用命令,和磁盘被吃光。第二类是线上最常见的宕机原因之一,而且几乎没人一开始就配好清理策略。

一、结论先给:最常用的十条

docker ps -a                                  # 看所有容器(不加 -a 只看在跑的)
docker ps --format "table {{.Names}}\t{{.Status}}\t{{.Ports}}"
docker logs -f --tail 100 <容器>               # 跟日志
docker exec -it <容器> sh                      # 进容器
docker compose up -d                           # 起服务
docker compose logs -f <服务名>                 # 看某个服务的日志
docker compose down                            # 停并删容器(保留数据卷)
docker images                                  # 镜像列表
docker system df                               # Docker 占了多少磁盘
docker system prune -a --volumes               # 清理(危险,看清再跑)

二、容器:增删改查

# 启动
docker run -d --name nginx -p 80:80 nginx:1.27
docker run -d --name redis -p 6379:6379 -v redis-data:/data --restart unless-stopped redis:7

# 常用参数
#   -d 后台    -p 端口映射    -v 数据卷    --name 命名
#   -e MYSQL_ROOT_PASSWORD=xxx  环境变量
#   --restart unless-stopped     开机自启(生产必备)
#   --memory 1g --cpus 2         限制资源

docker start/stop/restart <容器>
docker rm -f <容器>                # 强制删除运行中的容器
docker rename <旧名> <新名>
docker update --restart=always <容器>    # 事后补上开机自启

--restart 一定要在第一次 run 时就加,事后补虽然能 update,但很多人忘了,重启服务器后服务没起来才发现。

进入容器:

docker exec -it <容器> sh          # 优先 sh,alpine 镜像没有 bash
docker exec -it <容器> bash        # ubuntu/centos 系镜像
docker exec -it -u root <容器> sh  # 以 root 进
docker exec <容器> env             # 看环境变量(不进容器)

拷贝文件:

docker cp <容器>:/etc/nginx/nginx.conf ./nginx.conf
docker cp ./app.jar <容器>:/app/app.jar

看资源占用:

docker stats                       # 实时
docker stats --no-stream           # 只看一次
docker stats --format "table {{.Name}}\t{{.CPUPerc}}\t{{.MemUsage}}"

三、镜像:拉、看、删

docker pull nginx:1.27
docker images
docker images --filter "dangling=true"    # 虚悬镜像(<none> 那些,就是可以删的)
docker rmi <镜像ID>
docker rmi $(docker images -f "dangling=true" -q)    # 批量删虚悬镜像
docker save nginx:1.27 -o nginx.tar       # 导出(离线环境用)
docker load -i nginx.tar                  # 导入
docker tag nginx:1.27 my-registry.com/nginx:1.27 && docker push my-registry.com/nginx:1.27

<none>:<none> 的镜像不是坏了,是重新构建后旧镜像失去了标签。它们就是磁盘垃圾的主要来源。

四、日志:定位问题的主战场

docker logs <容器>
docker logs -f --tail 200 <容器>           # 跟踪最后 200 行
docker logs --since 30m <容器>             # 最近 30 分钟
docker logs --since "2026-09-23T10:00:00" <容器>
docker logs -t <容器>                      # 带时间戳(排查必备)

Docker 默认日志不限制大小,一个跑一年的容器日志能到几十 GB。上线就该配:

// /etc/docker/daemon.json
{
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "50m",
    "max-file": "3"
  }
}
sudo systemctl restart docker      # 改完生效(注意:只对新容器生效)

单个容器清理日志(不停容器):

truncate -s 0 $(docker inspect --format='{{.LogPath}}' <容器>)

日志量大的服务,把日志贴进 日志分析工具 比肉眼 grep 快得多——它直接给你错误类型分布、异常 Top 和集中出事的时段。

五、docker compose:多容器项目的日常

docker compose up -d                        # 后台启动
docker compose up -d --build                # 改了 Dockerfile 重新构建
docker compose down                         # 停+删容器、网络(**保留数据卷**)
docker compose down -v                      # 连数据卷一起删(数据库会没!)
docker compose ps
docker compose logs -f
docker compose logs -f --tail 100 backend   # 只看某个服务
docker compose restart backend
docker compose exec backend sh
docker compose pull && docker compose up -d # 更新镜像
docker compose config                       # 校验 compose 文件写错没

down 和 down -v 的区别是救命级的:前者保留数据卷,后者把数据库数据一起删了。生产环境永远别带 -v。

compose 文件里数据卷一定要显式声明:

services:
  mysql:
    image: mysql:8.0
    volumes:
      - mysql-data:/var/lib/mysql     # 具名卷,down 不会删
volumes:
  mysql-data:

六、磁盘被 Docker 吃满:定位 + 清理

先看整体:

docker system df
# TYPE            TOTAL     ACTIVE    SIZE      RECLAIMABLE
# Images          28        6         12.4GB    8.2GB (66%)
# Containers      9         4         1.2GB     900MB (75%)
# Local Volumes   14        4         18.6GB    12GB (64%)
# Build Cache     156       0         9.8GB     9.8GB

再看宿主机真实占用在哪:

du -sh /var/lib/docker/* 2>/dev/null | sort -rh | head
# overlay2(镜像层)、containers(日志)、volumes(数据卷)是三个大头

分头清理(按风险从低到高):

# 1. 最安全:只删虚悬镜像和无用构建缓存
docker image prune
docker builder prune

# 2. 删掉所有没被容器使用的镜像(常用,但要确认没在用的离线镜像)
docker image prune -a

# 3. 删掉停止的容器、无用网络
docker container prune

# 4. 删掉没被引用的数据卷(**高危**:确认数据库卷还在用)
docker volume ls
docker volume prune

# 5. 一次全清(生产慎用)
docker system prune -a --volumes

顺序建议:先 container prune → 再 image prune -a → 最后才考虑 volume prune。数据卷是唯一删了会丢业务数据的,动手前 docker volume ls 逐个确认。

日志单独清(前面提过):

# 一次清掉所有容器日志
find /var/lib/docker/containers -name "*-json.log" -size +100M -exec truncate -s 0 {} \;

清完之后限制日志大小(见第四节),否则三个月后还得来一遍。

七、几条纪律

该做 别做
run 时加 --restart unless-stopped 靠手动 start 恢复服务
配置 max-size 日志轮转 让日志无限长
数据用具名卷 把数据只放在容器层里
down 不带 -v 生产跑 down -v
清理前 docker system df 看清楚 直接 system prune -a --volumes
镜像写明确 tag(nginx:1.27) 一律 latest

命令记不住没关系,Docker 命令速查 按场景列全了;算磁盘和分配空间可以用 磁盘容量计算。

八、小结

我想… 命令
看在跑什么 docker ps -a
看为什么挂了 docker logs --tail 100 <容器>
进容器 docker exec -it <容器> sh
起一整套服务 docker compose up -d
更新镜像 docker compose pull && docker compose up -d
磁盘满了 docker system df → image prune -a → 清日志
彻底清理 docker system prune -a --volumes(先确认数据卷)

Docker 上手简单,但"磁盘满"和"重启后服务没起来"这两个坑,十个团队里有八个踩过。装完 Docker 就配好日志轮转和 --restart,能省掉未来至少一次半夜救火。


相关工具:Docker 命令速查 · 磁盘容量计算 · Linux 命令速查

延伸阅读:Ubuntu 安装 Docker · Docker 安装 MySQL 8 · Ubuntu 服务器调优:上线前必须改的 12 个系统参数

还有 65 个免费在线工具

纯前端实现,不用注册,数据不上传服务器。

浏览全部工具