Docker清理缓存操作
- 在构建测试的过程中,由于是自家小服务器,资源紧张,发现磁盘一直爆满,删除一些大镜像还是会占满的情况,就想到是不是也是缓存问题。
经过查询确实是build过程中的缓存启发的占用问题。
因此引出以下知识点,如何清除docker的构建过程中的缓存
Docker 18.09 引入了 BuildKit ,提升了构建过程的性能、安全、存储管理等能力。
docker system df 命令,类似于 Linux上的 df 命令,用于查看 Docker 的磁盘使用情况:
TYPE 列出了 Docker 使用磁盘的 4 种类型:
类型 | 说明 |
---|---|
Images | 所有镜像占用的空间,包括拉取下来的镜像,和本地构建的。 |
Containers | 运行的容器占用的空间,表示每个容器的读写层的空间。 |
Local Volumes | 容器挂载本地数据卷的空间。 |
Build Cache | 镜像构建过程中产生的缓存空间(只有在使用 BuildKit 时才有,Docker 18.09 以后可用)。 |
TYPE | Docker 数据类型,包括镜像(Images)、容器(Containers)、本地卷(Local Volumes)等。 |
TOTAL | 每个数据类型的总大小。 |
ACTIVE | 获取的数据类型个数。 |
SIZE | 每个数据类型实际使用的大小。 |
USE% | 使用率,表示实际使用大小占总大小的百分比。 |
没清理前:
TYPE TOTAL ACTIVE SIZE RECLAIMABLE
Images 46 18 8.928GB 6.253GB (70%)
Containers 29 6 1.779GB 1.779GB (99%)
Local Volumes 5 5 759.8MB 0B (0%)
Build Cache 176 0 5.59GB 5.59GB
清理后:
TYPE TOTAL ACTIVE SIZE RECLAIMABLE
Images 46 18 8.928GB 6.253GB (70%)
Containers 29 6 1.779GB 1.779GB (99%)
Local Volumes 5 5 759.8MB 0B (0%)
Build Cache 111 0 0B 0B
获取完整的信息: docker system df -v
一键清理 Build Cache 缓存命令:
docker builder prune
如果你希望保留最近一定时间的缓存,删除时长更久的缓存,可以通过添加 --filter 参数实现,例如保留最近10天的缓存示例命令如下:
docker builder prune --filter 'until=240h'
另外,命令 docker system prune 可以用于清理磁盘,删除关闭的容器、无用的数据卷和网络,以及dangling镜像(即无tag的镜像)。
添加参数 docker system prune -a 清理得更加彻底,可以将没有容器使用Docker镜像都删掉。
清理无用的容器
docker container prune
清理无用的镜像
docker image prune
镜像瘦身
容器固然由于时间的堆叠,会存在数据及日志越来越多的情况,根本上我们在构建镜像的时候,首先考虑镜像的最小化;
比如docker的多段构建,利用docker的最小化的系统alpine等,参考:[每周一更]-(第64期):Dockerfile构造php定制化镜像
采取一些策略来瘦身,详细操作如下:
- 使用轻量的基础镜像:
- 选择基于 Alpine Linux 或其他小型 Linux 发行版的基础镜像。这些基础镜像通常包含较少的组件,从而减小了镜像的大小。
- 多阶段构建:
- 使用多阶段构建(Multi-stage builds),这样可以在一个 Dockerfile 中包含多个 FROM 指令,每个指令对应一个构建阶段。在最终的镜像中只包含构建过程中必要的文件,减小了镜像的体积。
dockerfileCopy code
FROM golang:1.16 AS build
WORKDIR /app
COPY . .
RUN go build -o myapp
FROM alpine:latest
WORKDIR /app
COPY --from=build /app/myapp .
CMD ["./myapp"]
- 只复制必要的文件:
- 通过使用
.dockerignore
文件来排除不需要的文件,确保只有构建应用程序所需的文件被复制到镜像中。
- 减少层的数量:
- 每个 Dockerfile 中的指令都会创建一个新的镜像层,因此尽量将相关的指令合并到一起,以减少层的数量。
- 清理不需要的文件:
- 在 Dockerfile 中,使用
RUN
指令清理不需要的中间文件,确保镜像中只包含最终需要的文件。
- 使用更高效的命令:
- 在 Dockerfile 中使用一些高效的命令,例如将多个
RUN
指令合并成一个,使用&&
连接多个命令。
- 避免不必要的依赖:
- 检查应用程序的依赖关系,避免安装不必要的软件包或库。
- 压缩文件:
- 在 Dockerfile 中使用
COPY
指令时,可以将文件压缩成 tar 归档,然后在容器内解压。这可以减少网络传输的数据量,同时也可以减小最终镜像的大小。
参考地址:
- docker builder prune
- docker system df