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 个系统参数