[每周一更]-(第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 归档,然后在容器内解压。这可以减少网络传输的数据量,同时也可以减小最终镜像的大小。

参考地址:

相关推荐
为美好的生活献上中指22 分钟前
java每日精进 5.14【参数校验】
java·开发语言·spring boot·tomcat
qq_124987075328 分钟前
原生小程序+springboot+vue+协同过滤算法的音乐推荐系统(源码+论文+讲解+安装+部署+调试)
java·spring boot·后端·小程序·毕业设计·课程设计·协同过滤
曾昭武39 分钟前
IDEA怎么汉化&idea中文改回英文版
java·intellij-idea·idea汉化·idea怎么汉化·idea转回英文
头疼的程序员43 分钟前
docker学习与使用(概念、镜像、容器、数据卷、dockerfile等)
学习·docker·容器
IT小郭.43 分钟前
使用 Docker Desktop 安装 Neo4j 知识图谱
windows·python·sql·docker·知识图谱·database·neo4j
淡水猫.43 分钟前
hbit资产收集工具Docker(笔记版)
运维·docker·容器
信徒_2 小时前
SpringBoot 自动装配流程
java·spring boot·后端
小薛博客3 小时前
4、前后端联调文生文、文生图事件
java·ai
愛~杦辷个訾4 小时前
芋道项目,商城模块数据表结构
java·sql·芋道·yudao-cloud·芋道商城
水淹萌龙6 小时前
k8s 中使用 Service 访问时NetworkPolicy不生效问题排查
云原生·容器·kubernetes