0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

减少docker镜像大小的方法

马哥Linux运维 来源:马哥Linux运维 2023-05-15 11:13 次阅读

在本文中,我们将看到减少 docker 镜像大小的方法。

什么是 docker?

Docker 是一种容器引擎,可以在容器内运行一段代码。Docker 镜像是在任何地方运行您的应用程序而无需担心应用程序依赖性的方式。

要构建镜像,docker 使用一个名为 Dockerfile 的文件。Dockerfile 是一个包含许多指令(RUN、COPY、EXPOSE 等)的文件。成功执行这些命令后,docker 将创建一个镜像供我们在任何地方使用。

为什么要减小 docker 镜像大小?

安装不必要的软件包会增加攻击面,从而增加安全风险。

镜像传输需要更多时间。

部署大镜像需要更多时间。

我们必须以某种方式创建我们的 Dockerfile,以便从该 Dockerfile 构建的镜像在大小方面得到优化。

在本文中,我们将讨论 10 种减少 docker 镜像大小的有效方法。

1:最小化镜像层

我们可以减少 Dockerfile 中的层数。

dockerfile 中的每个 FROM、RUN、COPY 命令都会创建一个单独的层,并增加镜像的整体大小和构建时间。

要减小 docker 镜像大小,请在单个 RUN 或 COPY 指令中执行多个命令来最小化 Dockerfile 中的层数。

FROMubuntu:latest
RUNaptupdate-y
RUNaptinstallunzip-y
RUNaptinstallcurl-y
RUNaptinstallpython3-y

与其对每个命令使用单独的指令,不如将它们组合起来:

FROMubuntu:latest
RUNaptupdate-y&&
aptinstallunzip-y&&
aptinstallcurl-y&&
aptinstallpython3-y

从下图中可以看出,通过减少层数,可以减少一些 MB 的大小。

a068d052-f18e-11ed-90ce-dac502259ad0.png

2:使用 Docker Squash 减小镜像大小

Docker 在构建镜像时创建了很多层。压缩有助于在逻辑层中组织镜像。我们可以控制镜像的结构,而不是让镜像具有多个不必要的层。

您可以使用以下命令安装 docker-squash。

pipinstalldocker-squash

您可以运行以下命令来减小镜像的大小。

docker-squashimage:old-timage:new
a090fcbc-f18e-11ed-90ce-dac502259ad0.png

3:使用较小的基础镜像

减小 docker 镜像大小最明显的方法是使用较小的基础镜像。

如果希望为 python 应用程序创建镜像,请考虑使用 python:3.9-slim 镜像而不是 python:3.9。

python:3.9 的大小约为 1.3 GB,而 python:3.9-slim 的大小仅为 1 GB 左右。

您可以使用 alpine 版本进一步减少镜像。alpine 镜像是专门为作为容器运行而设计的,而且体积非常小。python:3.9-alpine 镜像只有 49 MB。

4:使用多阶段构建来减小大小

为了显着减小大小,我们可以使用 docker 多阶段构建的概念。这里我们使用不同的 images/Dockerfile 来构建和打包应用代码。

它将 Dockerfile 分成多个阶段,并将所需的工件从一个阶段传递到另一个阶段,然后在最后一个阶段交付缩小镜像大小的最终镜像。它显着减小镜像尺寸。

#Officialdockerbuildimage,Usingnode:14.17-alpine3.14imageforstage-1.
#Stage-1
FROMnode:14.17-alpine3.14asbuild
#CopyRequiredfiles
COPYpublic/home/app/public/
COPYsrc/home/app/src/
#dockerfileinstallmultiplepackages
RUNapkaddg++makepython2
RUNnpminstall--silent
#CreateBuild
RUNnpmrunbuild
RUNapk--purgedelpython2
#Runthebuildbycopyingthefilesformpreviousstage.
#Stage-2
FROMnginx:stable-alpine
COPYnginx.conf/etc/nginx/conf.d/default.conf
COPY--from=build/home/app/build/usr/share/nginx/html
EXPOSE80
CMD["nginx","-g","daemonoff;"]

这里我们使用两个阶段从 docker 文件创建镜像。在 Stage-1 中,我们复制代码并构建它,在 stage-2 中,我们使用在 stage-1 中构建的代码在 Nginx 中运行。

5:apt 安装中使用 --no-install-recommends 标志

当我们运行 apt install 命令来安装某些包时,它会安装一些不需要的推荐包。使用 --no-install-recommends 标志可以显着减小镜像大小。

FROMubuntu:latest
RUNaptupdate-y&&
aptinstallunzip-y--no-install-recommends&&
aptinstallcurl--no-install-recommends-y&&
aptinstallpython3-y--no-install-recommends

如下图所示,带有 new 标签的镜像由于添加了此标志而减少了 5MB。当我们要安装多个包时,这将非常有帮助。a0b1eb3e-f18e-11ed-90ce-dac502259ad0.png

您可以在 apk add 命令中添加 --no-cache。

6:在 apt install 命令后添加 rm -rf /var/lib/apt/lists/*

我们可以在 apt install 之后添加这个命令来减少 docker 镜像的大小。

FROMubuntu:latest
RUNaptupdate-y&&
aptinstallunzip-y--no-install-recommends&&
aptinstallcurl--no-install-recommends-y&&
aptinstallpython3-y--no-install-recommends&&
rm-rf/var/lib/apt/lists/*
a0c5339c-f18e-11ed-90ce-dac502259ad0.png

从上图中可以看出,我们已将 docker 镜像的大小减少了约 41 MB。

7:使用 .dockerignore 文件

如果您不想将某些文件复制到 docker 镜像,那么使用 .dockerignore 文件可以为您节省一些空间。

在构建上下文中有一些隐藏的文件/文件夹,您可以使用 ADD 或 COPY 命令(如 .git 等)将其传输到镜像。包含一个 .dockerignore 文件以减小 docker 镜像大小是一个很好的做法。

.dockerignore文件示例。

ignorethisfile.txt
logs/
ignorethisfolder/
.git
.cache
*.md

8:在 RUN 之后放置 COPY

在某些情况下,您对代码进行了细微的更改,并且需要反复从 dockerfile 构建镜像。
在这种情况下,将 COPY 命令放在 RUN 命令之后将有助于减小镜像大小,因为在这种情况下 docker 将能够更好地使用缓存功能。

它将为安装了依赖项的镜像创建缓存,每次更改代码时,docker 都会使用该缓存并创建镜像。它还将减少 docker 构建时间。

#Dockerfile-1
FROMubuntu:latest
RUNaptupdate-y&&
aptinstallunzip-y--no-install-recommends&&
aptinstallcurl--no-install-recommends-y&&
aptinstallpython3-y--no-install-recommends&&
rm-rf/var/lib/apt/lists/*
COPYfile/home/ubuntu
#Dockerfile-2
FROMubuntu:latest
COPYfile/home/ubuntu
RUNaptupdate-y&&
aptinstallunzip-y--no-install-recommends&&
aptinstallcurl--no-install-recommends-y&&
aptinstallpython3-y--no-install-recommends&&
rm-rf/var/lib/apt/lists/*

在上述情况下,dockerfile-1 将能够比 dockerfile-2 表现得更好。

9:安装后删除软件包

如果您需要在 docker 镜像中安装一些包,并且您是从外部下载它们,那么最好在安装后删除这些包。

例如,如果您希望从 zip 文件安装 AWS CLI V2,那么在成功安装后请记住也删除该 zip 文件。

FROMubuntu:latest
RUNcurl"https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip"-o"awscliv2.zip"&&
unzipawscliv2.zip&&
sudo./aws/install&&
rmawscliv2.zip

10:使用 Docker 镜像缩容工具

有几个dockerfile 优化工具可以帮助你减少 docker 镜像的大小。下面列出了其中一些。

Dive:Dive 是一个开源工具,用于探索 Docker 镜像及其层内容,然后发现缩小 Docker/OCI 镜像大小的方法。

https://github.com/wagoodman/dive

fromlatest.io:此工具将检查您的 Dockerfile 并检查可以执行的更多步骤以减小镜像大小。

https://www.fromlatest.io/

Docker Slim:它让你的容器更好、更小、更安全。您可以使用dockerslim 来最小化容器镜像

审核编辑:彭静
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 应用程序
    +关注

    关注

    37

    文章

    3240

    浏览量

    57594
  • 镜像
    +关注

    关注

    0

    文章

    162

    浏览量

    10697
  • Docker
    +关注

    关注

    0

    文章

    454

    浏览量

    11807

原文标题:10 个优化技巧,减少 Docker 镜像大小

文章出处:【微信号:magedu-Linux,微信公众号:马哥Linux运维】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    怎么构建docker镜像仓库软件

    Docker Registry】用docker registry 镜像搭建私有测试仓库
    发表于 08-13 11:03

    如何判断是否在docker镜像中?

    实战中首先需要判断服务器是否为docker环境。常用的判断方法有两种。 1、通过执行 ls -alh /.dockerenv是否存在.dockerenv文件 docker环境下存在该文件 非
    发表于 09-20 07:42

    Docker上的Alpine Linux镜像建立

    如何建立你自己的Docker镜像2016-03-18 14:33 Alpine Linux的什么是Docker社区所钟爱?轻量级容器意味着更多的计算资源。Alpine Linux的确是轻型
    发表于 10-12 11:52 0次下载

    浅析Docker镜像本地存储机制及容器启动原理

    镜像各层内容及对应大小,每层对应着 Dockerfile 中的一条指令。Docker 镜像默认存储在 /var/lib/docker/《st
    发表于 10-19 14:17 2507次阅读

    国内Docker CE 镜像源的配置

    阿里云官方镜像站: https://developer.aliyun.com/mirror/?utm_content=g_1000303593   Docker CE 是免费的 Docker 产品
    的头像 发表于 11-09 09:16 3629次阅读

    Docker—简介与镜像用法

    阿里云官方镜像站: ​​https://developer.aliyun.com/mirror/?utm_content=g_1000303593​​ ​ 一、容器简介 Docker是管理容器的引擎
    发表于 11-25 16:28 506次阅读
    <b class='flag-5'>Docker</b>—简介与<b class='flag-5'>镜像</b>用法

    go项目怎么让docker镜像体积减小

    【导读】go 项目怎么让 docker 镜像体积减小?本文做了详细介绍。
    的头像 发表于 06-12 15:07 1386次阅读

    go项目怎么让docker镜像体积减小

    go 项目怎么让 docker 镜像体积减小?本文做了详细介绍。
    的头像 发表于 06-23 10:49 1160次阅读

    Docker镜像的详细讲解

    本文是对 Docker 镜像的详细讲解,讲解了如何安装 Docker、配置 Docker 镜像加速以及操作
    的头像 发表于 08-02 10:00 2135次阅读

    从零开始学习制作、以及使用Tina的Docker编译镜像

    学习制作、以及使用Tina的Docker编译镜像
    的头像 发表于 08-28 11:45 2265次阅读
    从零开始学习制作、以及使用Tina的<b class='flag-5'>Docker</b>编译<b class='flag-5'>镜像</b>

    docker 搜索镜像,docker查看镜像详细信息(docker下载镜像命令)

    Docker Hub是集中管理的Docker镜像注册中心。通过Docker 用户可以在注册中心搜索、下载和使用CLI命令行工具中的镜像。以下
    的头像 发表于 07-19 09:46 1767次阅读

    Dockerfile定义Docker镜像的构建过程

    了解Dockerfile Dockerfile 是一个文本文件,用于定义 Docker 镜像的构建过程。它以指令的形式描述了如何构建镜像,从基础镜像开始逐步添加配置、文件和依赖,最终形
    的头像 发表于 09-30 10:22 2500次阅读

    Docker镜像国内加速的几种方法

    在国内,拉取 Docker 镜像速度慢/时不时断线/无账号导致限流等,比较痛苦. 这里提供加速/优化的几种方法
    的头像 发表于 10-19 10:02 1w次阅读
    <b class='flag-5'>Docker</b><b class='flag-5'>镜像</b>国内加速的几种<b class='flag-5'>方法</b>

    构建docker镜像应该遵循哪些原则

    构建 Docker 镜像时,应遵循以下原则: 单一职责:每个镜像应只包含一个应用或服务,避免将多个应用或服务放在同一个镜像中。这样可以确保镜像
    的头像 发表于 11-23 09:41 981次阅读

    手动构建Docker镜像方法

    不推荐使用docker commit命令,而应该使用更灵活、更强大的dockerfile来构建docker镜像
    的头像 发表于 08-05 15:30 444次阅读
    手动构建<b class='flag-5'>Docker</b><b class='flag-5'>镜像</b>的<b class='flag-5'>方法</b>