首页 > 其他分享 >优化减小docker images 尺寸

优化减小docker images 尺寸

时间:2023-12-19 17:48:26浏览次数:25  
标签:减小 && -- apt install images 镜像 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 中的层数。

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 来最小化容器镜像。

标签:减小,&&,--,apt,install,images,镜像,docker
From: https://www.cnblogs.com/ruiy/p/17914313.html

相关文章

  • Docker部署QD
    一、简介QD是一个基于HAR编辑器和Tornado服务端的HTTP定时任务自动执行Web框架。二、安装QD绿联DX4600为例,首先我们打开Docker管理器,进入镜像管理,然后在镜像仓库中搜索a76yyyy/qiandao​​,选择latest​​版本并下载。​​​​下载完成后,我们在本地镜像中......
  • Docker部署MySQL
    1、拉取MySQL镜像dockerpullmysql:5.72、查看镜像dockerimages3、创建存储MySQL数据信息的目录在根目录下创建/data/docker/mysql目录,用于存储mysql的数据信息mkdir/data/docker/mysql-p4、宿主机创建MySQL配置文件4.1、创建conf目录在/data/docker/mysql目录下......
  • 《CLIP:Connecting text and images》论文学习
    一、Abstract尽管深度学习已经彻底改革了计算机视觉领域,但当前的深度学习视觉方案方法存在几个主要问题:高质量的视觉数据集,制作过程耗时且成本高昂,同时只包含了有限范围的视觉概念标准的深度学习视觉模型(例如ImageNet、ResNet)擅长完成单一任务,且只能完成一个任务,需要投入巨大......
  • Docker启动Nacos报错:Nacos Server did not start because dumpservice bean construct
    一、表象重启服务器之后Docker运行Nacos容器,启动成功,但是外网无法访问。查看了一下Nacos启动日志(dockerlogsnacos容器名)二、分析很明显是数据库配``置问题。。如果是数据库配置的问题,可以着重检查以下信息尤其是MySQL内网Host,查询方式见Docker安装Nacos三、解决我已......
  • 怎么使用docker搭建普罗米修斯监控
    普罗米修斯教程参考https://www.cnblogs.com/minseo/category/1688718.html本文介绍怎么使用docker搭建系统和软件版本#cat/etc/redhat-releaseCentOSLinuxrelease7.9.2009(Core)[root@CentOS7K8SHarbor061~]#uname-aLinuxCentOS7K8SHarbor0613.10.0-1160.102.......
  • docker安装openjdk并运行jar包的操作方法
    下载镜像dockerpullopenjdk创建数据卷创建一个java_app的数据卷dockervolumecreatejava_app将jar包上传到/var/lib/docker/volumes/java_app/_data/下,然后启动镜像启动镜像dockerrun--name=javaApp--restart=always--network=host\-vjava_app:/usr/src/m......
  • M1 Docker 部署rocketmq
    1、克隆镜像arm64镜像代码编译镜像,docker直接安装会报错所以选择编译gitclonehttps://github.com/apache/rocketmq-docker.git  cdrocketmq-docker #注意这里centos固定不要改镜像版本可以改shbuild-image.sh4.8.0centos 第二步:拉取mqconsole镜像: candice06......
  • A Deformable Attention Network for High-Resolution Remote Sensing Images Semanti
    ADeformableAttentionNetworkforHigh-ResolutionRemoteSensingImagesSemanticSegmentation*Authors:[[RenxiangZuo]],[[GuangyunZhang]],[[RongtingZhang]],[[XiupingJia]]DOI:10.1109/TGRS.2021.3119537初读印象comment::(MDANet)提出了可变形注意力,结......
  • .Net 8与硬件设备能碰撞出怎么样的火花(使用ImageSharp和Protobuf协议通过HidApi与设备
    前言本人最近在社区里说想做稚晖君的那个瀚文键盘来着,结果遇到两个老哥一个老哥送了我电路板,一个送了我焊接好元件的电路板,既然大家这么舍得,那我也就真的投入制作了这把客制化键盘,当然我为了省钱也是特意把外壳模型重新切割,用3D打印机打印了整个外壳,不得不说省了八九百的CNC费用......
  • 使用docker编译OpenHarmony e2000记录
    使用docker编译OpenHarmonye2000记录目录使用docker编译OpenHarmonye2000记录0、环境准备1、安装docker2、编译docker镜像3、创建docker容器4、docker编译系统5、镜像推送6、镜像拉取0、环境准备参考device_board_phytium/e2000/README.md·Phytium嵌入式软件/Phytium-Ope......