1. 选择合适的存储驱动
存储驱动是Docker管理镜像与容器存储的核心组件,直接影响性能与存储效率。对于Linux系统,overlay2是官方推荐的默认驱动(适用于CentOS、Ubuntu等主流发行版),其基于Linux内核的OverlayFS文件系统,支持分层叠加与写时复制(CoW)机制,能有效减少重复数据存储,提升I/O性能。需通过修改/etc/docker/daemon.json文件(添加{"storage-driver": "overlay2"})并重启Docker服务生效。若系统内核版本较低(如低于3.18),可选择devicemapper(需配置为direct-lvm模式以提升性能),但overlay2仍是现代Linux环境的最优选择。
2. 优化镜像分层设计
镜像的分层结构决定了存储效率与构建速度。减少层数:合并多个RUN指令(如将RUN apt-get update && apt-get install -y curl合并为一条),避免单条指令创建多个小层(每层约1MB元数据开销);调整层顺序:将高频变更的操作(如COPY代码)放在Dockerfile末尾,基础依赖(如apt-get install)尽量靠前,这样变更时仅需重新构建末尾层,减少重复工作。例如,优化前的Dockerfile(4层):
FROM ubuntu:20.04
RUN apt-get update && apt-get install -y python3
COPY . /app
CMD ["python3", "/app/main.py"]
优化后(1层):
FROM ubuntu:20.04
RUN apt-get update && apt-get install -y python3 && apt-get clean && rm -rf /var/lib/apt/lists/*
COPY . /app
CMD ["python3", "/app/main.py"]
通过docker image history命令可查看层信息,验证优化效果。
3. 使用多阶段构建减小镜像体积
多阶段构建(Multi-stage Builds)通过定义多个构建阶段,仅将最终需要的artifacts(如编译后的二进制文件)复制到最终镜像,剔除构建工具与中间文件(如gcc、node_modules),显著减小镜像大小(最高可达60%以上)。例如,构建一个Node.js应用的Dockerfile:
# 构建阶段(使用大体积基础镜像)
FROM node:18 AS builder
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
RUN npm run build
# 最终阶段(使用小体积基础镜像)
FROM node:18-alpine
WORKDIR /app
COPY --from=builder /app/dist /app
CMD ["node", "/app/index.js"]
最终镜像仅包含dist目录与alpine基础镜像(约几MB),而非包含所有构建工具的几百MB镜像。
4. 定期清理未使用的存储资源
未使用的镜像、容器、卷和网络会持续占用磁盘空间,需定期清理:
docker image prune删除悬空镜像(无标签且未被任何容器引用的镜像),docker image prune -a删除所有未使用的镜像(包括未被容器引用的已命名镜像);docker container prune删除已停止的容器;docker volume prune删除未被任何容器引用的卷(卷中的数据需提前备份);docker network prune删除未使用的网络。docker system prune -a一次性清理所有未使用的资源(谨慎使用,避免误删正在使用的资源)。5. 优化日志管理
容器日志无限制增长是磁盘空间占用的常见原因,需通过以下方式控制日志大小:
docker run命令中添加--log-opt max-size=10m(单个日志文件最大10MB)和--log-opt max-file=3(保留3个日志文件),例如:docker run --log-driver=json-file --log-opt max-size=10m --log-opt max-file=3 my-image
/etc/docker/daemon.json文件,添加以下内容(全局生效):{
"log-driver": "json-file",
"log-opts": {
"max-size": "10m",
"max-file": "3"
}
}
重启Docker服务使配置生效。此外,可设置日志驱动为syslog或journald,将日志发送到远程日志服务器集中管理。6. 使用数据卷(Volume)管理持久化数据
容器的可写层(Container Layer)是临时的,容器删除后数据会丢失。对于需要持久化的数据(如数据库文件、应用配置),应使用数据卷(Volume)或绑定挂载(Bind Mount):
docker volume create命令创建,数据存储在Docker管理的专用目录(如/var/lib/docker/volumes),支持多容器共享,且数据在容器删除后仍保留;docker run -v /宿主机/目录:/容器/目录命令,将宿主机目录挂载到容器内,数据直接存储在宿主机上,适用于需要直接访问宿主机文件的场景。docker cp命令或第三方工具),确保数据安全。7. 迁移Docker存储目录至高性能存储设备
默认情况下,Docker将镜像、容器数据存储在/var/lib/docker目录(通常位于系统盘,如SSD或HDD)。若系统盘空间有限或I/O性能不足,可将存储目录迁移至更大、更快的存储设备(如SSD):
sudo systemctl stop docker;sudo mv /var/lib/docker /new/storage/path/docker;sudo ln -s /new/storage/path/docker /var/lib/docker;/etc/fstab文件(可选):添加挂载配置(如/dev/sdb1 /new/storage/path ext4 defaults 0 2),确保系统重启后自动挂载。docker info | grep "Docker Root Dir"验证新路径是否生效。