减少Docker镜像大小的10个优化技巧

 更新时间:2024年01月05日 08:18:34   作者:狂野小青年  
当使用Docker时,镜像大小是一个很大的问题,下面这篇文章主要给大家介绍了关于减少Docker镜像大小的10个优化技巧,文中通过代码介绍的非常详细,需要的朋友可以参考下

什么是 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 中的层数。

FROM
ubuntu:latest
RUN
apt update - y
RUN
apt install unzip - y
RUN
apt install curl - y
RUN
apt install python3 - y

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

FROM
ubuntu:latest
RUN
apt update -y && \
apt install unzip -y && \
apt install curl -y && \
apt install python3 -y

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

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

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

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

pip install docker-squash

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

docker-squash image:old -t image:new

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

# Official docker build image, Using node:14.17-alpine3.14 image for stage-1.
# Stage-1
FROM
node:
14.17
-alpine3.
14
as build
# Copy Required files
COPY
public /home/app/public/
COPY
src /home/app/src/
# dockerfile install multiple packages
RUN
apk add g++ make python2
RUN
npm install --silent
# Create Build
RUN
npm run build
RUN
apk --purge del python2
#Run the build by copying the files form previous stage.
# Stage-2
FROM
nginx:stable-alpine
COPY
nginx.conf /etc/nginx/conf.d/default.conf
COPY
--from=build /home/app/build /usr/share/nginx/html
EXPOSE
80
CMD
["nginx", "-g", "daemon off;"]

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

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

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

FROM
ubuntu:latest
RUN
apt update -y && \
apt install unzip -y --no-install-recommends && \
apt install curl --no-install-recommends -y && \
apt install python3 -y --no-install-recommends

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

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

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

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

FROM
ubuntu:latest
RUN
apt update -y && \
apt install unzip -y --no-install-recommends && \
apt install curl --no-install-recommends -y && \
apt install python3 -y --no-install-recommends && \
rm -rf /var/lib/apt/lists/*

从上图中可以看出,我们已将 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
FROM
ubuntu:latest
RUN
apt update -y && \
apt install unzip -y --no-install-recommends && \
apt install curl --no-install-recommends -y && \
apt install python3 -y --no-install-recommends && \
rm -rf /var/lib/apt/lists/*
COPY
file /home/ubuntu
#Dockerfile-2
FROM
ubuntu:latest
COPY
file /home/ubuntu
RUN
apt update -y && \
apt install unzip -y --no-install-recommends && \
apt install curl --no-install-recommends -y && \
apt install python3 -y --no-install-recommends && \
rm -rf /var/lib/apt/lists/*

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

9、安装后删除软件包

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

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

FROM
ubuntu:latest
RUN
curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip" && \
unzip awscliv2.zip && \
sudo ./aws/install && \
rm awscliv2.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 来最小化容器镜像。

总结

到此这篇关于减少Docker镜像大小的10个优化技巧的文章就介绍到这了,更多相关减少Docker镜像大小内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • docker-compose如何安装skywalking

    docker-compose如何安装skywalking

    这篇文章主要介绍了docker-compose如何安装skywalking问题,
    2024-01-01
  • 详解Docker中的nacos集群部署方式

    详解Docker中的nacos集群部署方式

    在 Docker 中使用 Nacos,你可以通过拉取官方提供的 Docker 镜像并运行容器的方式来快速部署,这篇文章主要介绍了Docker中的nacos集群部署方式,感兴趣的朋友一起看看吧
    2024-01-01
  • Centos7安装Docker(2020最新亲测可用,直接复制粘贴即可)

    Centos7安装Docker(2020最新亲测可用,直接复制粘贴即可)

    这篇文章主要介绍了Centos7安装Docker(2020最新亲测可用,直接复制粘贴即可),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-01-01
  • 浅谈docker-compose网络设置之networks

    浅谈docker-compose网络设置之networks

    这篇文章主要介绍了浅谈docker-compose网络设置之networks,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-09-09
  • 谈谈我对docker的理解

    谈谈我对docker的理解

    作为一种新兴的虚拟化方式,Docker跟传统的虚拟化方式相比具有众多的优势。这篇文章给大家介绍了docker的优势及docker的三个基本概念,感兴趣的朋友一起看看吧
    2016-10-10
  • Docker能否成为下一个“Linux”?

    Docker能否成为下一个“Linux”?

    今天小编就为大家分享一篇关于Docker能否成为下一个“Linux”?,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2018-12-12
  • 详解给Ocelot做一个Docker镜像

    详解给Ocelot做一个Docker镜像

    这篇文章主要介绍了详解给Ocelot做一个Docker镜像,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-04-04
  • Docker compose配置文件写法及命令使用示例

    Docker compose配置文件写法及命令使用示例

    这篇文章主要介绍了Docker compose配置文件写法及命令总结使用示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步早日升职加薪
    2022-03-03
  • docker中mysql初始化及启动失败问题解决方案

    docker中mysql初始化及启动失败问题解决方案

    这篇文章主要介绍了docker中mysql初始化及启动失败问题解决方案的相关资料,需要的朋友可以参考下
    2016-10-10
  • Docker 安装Jenkins全过程及踩坑指南

    Docker 安装Jenkins全过程及踩坑指南

    这篇文章主要介绍了Docker 安装Jenkins 踩坑全指南,本文通过图文示例相结合给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-02-02

最新评论