
一、先理清存储现状
1. 查看磁盘占用
# 整体docker磁盘占用
docker system df
# 详细分层大小
docker history 镜像名
# 查看本地镜像
docker images
2. 存储目录位置
默认:/var/lib/docker
修改存储路径(迁移):
1. 停止 docker
2. 拷贝原目录到新盘
3. 修改 /etc/docker/daemon.json
{"data-root":"/data/docker"}
4. 重启 docker
二、日常清理(最常用)
1. 一键清理无用资源
# 清理停止容器、无用网络、悬空镜像
docker system prune
# 连未使用镜像一起删(慎用)
docker system prune -a
# 清理构建缓存
docker builder prune
2. 精准删除
# 删除指定镜像
docker rmi 镜像ID
# 删除悬空镜像 <none>
docker images -f "dangling=true" -q | xargs docker rmi
# 删除停止的所有容器
docker container prune
三、镜像构建层面优化(治本)
1. 选用轻量基础镜像
优先顺序:
alpine > slim > debian > ubuntu
示例:
# 别用大镜像
# FROM ubuntu:22.04
# 改用极小镜像
FROM python:3.11-alpine
2. 合并 RUN 指令,减少镜像层数
错误(多层冗余)
RUN apt update
RUN apt install git
RUN apt install curl
正确(合并成一层)
RUN apt update && \
apt install -y git curl && \
rm -rf /var/lib/apt/lists/*
安装完立刻删缓存,层内瘦身。
3. 合理使用 .dockerignore
排除无用文件,不打包进镜像
.git
node_modules
logs
tmp
.env
*.md
4. 多阶段构建(最强瘦身)
编译打包在第一阶段,只拷贝运行文件,抛弃编译环境
# 构建阶段
FROM golang:alpine AS builder
WORKDIR /app
COPY . .
RUN go build -o app
# 运行阶段(仅保留二进制)
FROM alpine
COPY --from=builder /app/app /usr/local/bin/
CMD ["app"]
最终镜像只有几十 MB。
5. 避免安装多余依赖
生产镜像不装:vim、net-tools、debug 工具
6. 统一时区、统一源,不重复写入
所有配置放同一 RUN 层
四、存储驱动优化
生产推荐 overlay2(默认主流)
修改daemon.json
{
"storage-driver": "overlay2"
}
优势:分层高效、读写快、磁盘占用低。
五、镜像生命周期管理
1. 镜像打版本标签
禁止只用 latest,统一版本:app:v1.0
2. 旧版本镜像定时清理
脚本自动删除 7 天前无用镜像
3. 私有仓库统一托管
本地只保留运行中镜像,其余推送 Harbor/Registry,本地不囤积
4. 镜像压缩导出
# 导出压缩镜像
docker save 镜像名 | gzip > app.tar.gz
# 导入
docker load < app.tar.gz
六、容器数据存储优化(避免磁盘爆满)
1. 禁止把业务数据存在容器读写层
容器删数据丢,还占宿主机空间
2. 优先使用数据卷 volume 持久化
docker run -v /宿主机目录:/容器目录
3. 日志限制(防止日志打爆磁盘)
daemon.json 全局限制容器日志大小
{
"log-driver":"json-file",
"log-opts":{
"max-size":"500m",
"max-file":"3"
}
}
七、线上运维最佳实践
1. 构建镜像:轻量基镜 + 多阶段 + 合并指令 + 清缓存
2. 日常维护:每周执行 docker system prune
3. 磁盘告警:监控 /var/lib/docker 使用率
4. 镜像策略:只保留正在运行镜像,历史镜像仓库归档
5. 批量构建统一缓存,加速构建并减少冗余层
总结
1. 清垃圾:prune 清理悬空镜像、停止容器、缓存
2. 缩体积:alpine 轻量镜像 + 多阶段构建 + 合并 RUN
3. 控层数:减少无用只读层,利用分层共享
4. 管数据:数据卷分离,限制容器日志大小
5. 统一管理:私有仓库归档,本地不囤旧镜像
需求留言: