[每周一更]-(第72期):Docker容器瘦身方式

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定制化镜像

采取一些策略来瘦身,详细操作如下:

  1. 使用轻量的基础镜像
  • 选择基于 Alpine Linux 或其他小型 Linux 发行版的基础镜像。这些基础镜像通常包含较少的组件,从而减小了镜像的大小。
  1. 多阶段构建
  • 使用多阶段构建(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"]

  1. 只复制必要的文件
  • 通过使用 .dockerignore 文件来排除不需要的文件,确保只有构建应用程序所需的文件被复制到镜像中。
  1. 减少层的数量
  • 每个 Dockerfile 中的指令都会创建一个新的镜像层,因此尽量将相关的指令合并到一起,以减少层的数量。
  1. 清理不需要的文件
  • 在 Dockerfile 中,使用 RUN 指令清理不需要的中间文件,确保镜像中只包含最终需要的文件。
  1. 使用更高效的命令
  • 在 Dockerfile 中使用一些高效的命令,例如将多个 RUN 指令合并成一个,使用 && 连接多个命令。
  1. 避免不必要的依赖
  • 检查应用程序的依赖关系,避免安装不必要的软件包或库。
  1. 压缩文件
  • 在 Dockerfile 中使用 COPY 指令时,可以将文件压缩成 tar 归档,然后在容器内解压。这可以减少网络传输的数据量,同时也可以减小最终镜像的大小。

参考地址:

相关推荐
Daniel 大东17 分钟前
idea 解决缓存损坏问题
java·缓存·intellij-idea
wind瑞23 分钟前
IntelliJ IDEA插件开发-代码补全插件入门开发
java·ide·intellij-idea
HappyAcmen23 分钟前
IDEA部署AI代写插件
java·人工智能·intellij-idea
马剑威(威哥爱编程)29 分钟前
读写锁分离设计模式详解
java·设计模式·java-ee
鸽鸽程序猿29 分钟前
【算法】【优选算法】前缀和(上)
java·算法·前缀和
修道-032330 分钟前
【JAVA】二、设计模式之策略模式
java·设计模式·策略模式
九圣残炎35 分钟前
【从零开始的LeetCode-算法】2559. 统计范围内的元音字符串数
java·算法·leetcode
当归10241 小时前
若依项目-结构解读
java
hlsd#1 小时前
关于 SpringBoot 时间处理的总结
java·spring boot·后端
iiiiiankor1 小时前
C/C++内存管理 | new的机制 | 重载自己的operator new
java·c语言·c++