当前位置: 首页 > news >正文

云原生之深入解析减少Docker镜像大小的优化技巧

一、什么是 Docker?

  • Docker 是一种容器引擎,可以在容器内运行一段代码,Docker 镜像是在任何地方运行应用程序而无需担心应用程序依赖性的方式。
  • 要构建镜像,docker 使用一个名为 Dockerfile 的文件,Dockerfile 是一个包含许多指令(RUN、COPY、EXPOSE 等)的文件,成功执行这些命令后,docker 将创建一个镜像供我们在任何地方使用。
  • 为什么要减小 docker 镜像大小?
    • 安装不必要的软件包会增加攻击面,从而增加安全风险;
    • 镜像传输需要更多时间;
    • 部署大镜像需要更多时间;
  • 必须以某种方式创建 Dockerfile,以便从该 Dockerfile 构建的镜像在大小方面得到优化。

二、最小化镜像层

  • 可以减少 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 的大小:

在这里插入图片描述

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

  • Docker 在构建镜像时创建了很多层,压缩有助于在逻辑层中组织镜像,可以控制镜像的结构,而不是让镜像具有多个不必要的层。
  • 可以使用以下命令安装 docker-squash:
pip install docker-squash
  • 可以运行以下命令来减小镜像的大小:
docker-squash image:old -t image:new

在这里插入图片描述

四、使用较小的基础镜像

  • 减小 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。

五、使用多阶段构建来减小大小

  • 为了显着减小大小,可以使用 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 中运行。

六、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。

七、在 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:

在这里插入图片描述

八、使用 .dockerignore 文件

  • 如果不想将某些文件复制到 docker 镜像,那么使用 .dockerignore 文件可以节省一些空间。在构建上下文中有一些隐藏的文件/文件夹,可以使用 ADD 或 COPY 命令(如 .git 等)将其传输到镜像,包含一个 .dockerignore 文件以减小 docker 镜像大小是一个很好的做法。
  • .dockerignore 文件示例:
ignorethisfile.txt
logs/
ignorethisfolder/
.git
.cache
*.md

九、在 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 表现得更好。

十、安装后删除软件包

  • 如果需要在 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

十一、使用 Docker 镜像缩容工具

  • 有几个dockerfile 优化工具可以减少 docker 镜像的大小:
    • Dive:Dive 是一个开源工具,用于探索 Docker 镜像及其层内容,然后发现缩小 Docker/OCI 镜像大小的方法;Dive 的 Git 地址;
  • fromlatest.io:此工具将检查 Dockerfile 并检查可以执行的更多步骤以减小镜像大小,具体使用请参考:fromlatest.io;
  • Docker Slim:它让容器更好、更小、更安全,可以使用 dockerslim 来最小化容器镜像。

相关文章:

云原生之深入解析减少Docker镜像大小的优化技巧

一、什么是 Docker? Docker 是一种容器引擎,可以在容器内运行一段代码,Docker 镜像是在任何地方运行应用程序而无需担心应用程序依赖性的方式。要构建镜像,docker 使用一个名为 Dockerfile 的文件,Dockerfile 是一个包…...

记一次java for循环改造多线程的操作

背景 今天在开发质量平台时需要获取某些数据,要请求公司某个工程的OpenAPI接口A。此接口为返回通用数据的接口,且接口本身的RT都在2~3秒之间。使用该接口,需要进行两次循环获取,然后对返回数据进行处理组装&#xff0…...

Java面试整理-Java复制

Java复制 在Java中,复制对象或数据通常涉及不同的场景和方法。以下是几种常见的复制情况及其相关方法: 基本数据类型的复制:基本数据类型(如int, double, char等)在Java中是通过值传递的。当你将一个基本数据类型的值赋给另一个变量时,实际上是创建了一个新的值。 int a …...

wsl kafka的简单应用

安装并配置单机版kafka所需环境 wsl2 环境可用性较高,如下介绍在该环境中安装单机版本kafka的详细过程。 启动命令行工具启动wsl:wsl --user root --cd ~,(以root用户启动,进入wsl后当前路径为~“用户主目录”&#…...

2023年国赛高教杯数学建模D题圈养湖羊的空间利用率解题全过程文档及程序

2023年国赛高教杯数学建模 D题 圈养湖羊的空间利用率 原题再现 规模化的圈养养殖场通常根据牲畜的性别和生长阶段分群饲养,适应不同种类、不同阶段的牲畜对空间的不同要求,以保障牲畜安全和健康;与此同时,也要尽量减少空间闲置所…...

Flink系列之:Table API Connectors之Raw Format

Flink系列之:Table API Connectors之Raw Format 一、Raw Format二、示例三、Format 参数四、数据类型映射 一、Raw Format Raw format 允许读写原始(基于字节)值作为单个列。注意: 这种格式将 null 值编码成 byte[] 类型的 null。这样在 ups…...

社交网络分析3:社交网络隐私攻击、保护的基本概念和方法 + 去匿名化技术 + 推理攻击技术 + k-匿名 + 基于聚类的隐私保护算法

社交网络分析3:社交网络隐私攻击、保护的基本概念和方法 去匿名化技术 推理攻击技术 k-匿名 基于聚类的隐私保护算法 写在最前面社交网络隐私泄露用户数据暴露的途径复杂行为的隐私风险技术发展带来的隐私挑战经济利益与数据售卖防范措施 社交网络 用户数据隐私…...

2023大湾区汽车创新大会在深圳坪山开幕

12月15日,2023大湾区汽车创新大会在深圳坪山开幕。 本次大会是由广东省科学技术厅、深圳市发展和改革委员会、深圳市工业和信息化局、中共深圳市新能源和智能网联汽车产业链委员会、坪山区人民政府指导,北京理工大学深圳汽车研究院、广东省大湾区新能源汽…...

Graylog 中日志级别及其对应的数字

在 Graylog 中,日志级别 level 通常使用数字表示,数字越低表示日志级别越高。以下是常见的日志级别及其对应的数字表示: DEBUG(调试):对应数字 7。INFO(信息):对应数字 …...

智能手表上的音频(五):录音

上篇讲了语音通话,本篇讲录音。录音功能就是把录到的音频保存成文件。保存文件的格式支持两种:一是PCM(16K采样)的WAV格式,二是AMR-NB(8k采样)的AMR格式。WAV格式简单:44字节的文件头PCM 数据,示…...

2023.12.17 关于 Redis 的特性和应用场景

目录 引言 Redis 特性 内存中存储数据 可编程性 可扩展性 持久化 支持集群 高可用性 Redis 优势 Redis 用作数据库 Redis 相较于 MySQL 优势 Redis 相较于 MySQL 劣势 Redis 用作缓存 典型场景 Redis 存储 session 信息 Redis 用作消息队列 初心 消息队列的…...

智能优化算法应用:基于社会群体算法3D无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用:基于社会群体算法3D无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用:基于社会群体算法3D无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.社会群体算法4.实验参数设定5.算法结果6.…...

Kotlin 笔记 -- Kotlin 语言特性的理解(二)

都是编译成字节码,为什么 Kotlin 能支持 Java 中没有的特性? kotlin 有哪些 Java 中没有的特性: 类型推断、可变性、可空性自动拆装箱、泛型数组高阶函数、DSL顶层函数、扩展函数、内联函数伴生对象、数据类、密封类、单例类接口代理、inter…...

数据结构【1】:数组专题

一、定义 数组是编程中一种强大的数据结构,它允许您存储和操作相同类型元素的集合。在 Python 中,数组是通过数组模块创建的,该模块提供了一个简单的接口来创建、操作和处理数组。 二、创建数组 在 Python 中,可以使用内置的 a…...

【Spring】Spring 事务

Spring 事务 文章目录 Spring 事务1. 简介2. Spring事务管理器3. 基本使用4. 属性剖析5. 声明式事务问题场景5.1 事务不生效5.2 事务不回滚5.3 大事务问题 6. 编程式事务 1. 简介 编程式事务:指手动编写程序来管理事务,即通过编写代码的方式直接控制事务…...

Ubuntu 虚拟机环境,编译AOSP源码

环境 : VMware虚拟机 Ubuntu 20.04.3 LTS 搭建配置开发环境 sudo apt-get install git-core gnupg flex bison build-essential zip curl zlib1g-dev gcc-multilib g-multilib libc6-dev-i386 libncurses5 lib32ncurses5-dev x11proto-core-dev libx11-dev lib32z1-dev libgl…...

2023.12.18杂记

今天特地搜了一下国内不错的博客网站,本来想在掘金上写的,但是怕被人喷(,所以还是决定在csdn上写了哈哈哈。 这篇文章主要整理一下我今天写代码时遇到的疑惑以及记录一下思考过程吧。 第一个注意的地方,我们的get查询…...

智能优化算法应用:基于阿基米德优化算法3D无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用:基于阿基米德优化算法3D无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用:基于阿基米德优化算法3D无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.阿基米德优化算法4.实验参数设定…...

K8s内容器拓扑图工具

1.背景:随着线上容器越来越多,需要一个可视化的方式展示各个容器之间的拓扑图。 2.需求:轻量级,部署方便。 3.部署 helm repo add groundcover https://helm.groundcover.com/ helm repo update helm install caretta --namespa…...

掌握 Babel:让你的 JavaScript 与时俱进(上)

🤍 前端开发工程师(主业)、技术博主(副业)、已过CET6 🍨 阿珊和她的猫_CSDN个人主页 🕠 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 🍚 蓝桥云课签约作者、已在蓝桥云…...

大数据零基础学习day1之环境准备和大数据初步理解

学习大数据会使用到多台Linux服务器。 一、环境准备 1、VMware 基于VMware构建Linux虚拟机 是大数据从业者或者IT从业者的必备技能之一也是成本低廉的方案 所以VMware虚拟机方案是必须要学习的。 (1)设置网关 打开VMware虚拟机,点击编辑…...

系统设计 --- MongoDB亿级数据查询优化策略

系统设计 --- MongoDB亿级数据查询分表策略 背景Solution --- 分表 背景 使用audit log实现Audi Trail功能 Audit Trail范围: 六个月数据量: 每秒5-7条audi log,共计7千万 – 1亿条数据需要实现全文检索按照时间倒序因为license问题,不能使用ELK只能使用…...

对WWDC 2025 Keynote 内容的预测

借助我们以往对苹果公司发展路径的深入研究经验,以及大语言模型的分析能力,我们系统梳理了多年来苹果 WWDC 主题演讲的规律。在 WWDC 2025 即将揭幕之际,我们让 ChatGPT 对今年的 Keynote 内容进行了一个初步预测,聊作存档。等到明…...

C/C++ 中附加包含目录、附加库目录与附加依赖项详解

在 C/C 编程的编译和链接过程中,附加包含目录、附加库目录和附加依赖项是三个至关重要的设置,它们相互配合,确保程序能够正确引用外部资源并顺利构建。虽然在学习过程中,这些概念容易让人混淆,但深入理解它们的作用和联…...

在树莓派上添加音频输入设备的几种方法

在树莓派上添加音频输入设备可以通过以下步骤完成,具体方法取决于设备类型(如USB麦克风、3.5mm接口麦克风或HDMI音频输入)。以下是详细指南: 1. 连接音频输入设备 USB麦克风/声卡:直接插入树莓派的USB接口。3.5mm麦克…...

【SpringBoot自动化部署】

SpringBoot自动化部署方法 使用Jenkins进行持续集成与部署 Jenkins是最常用的自动化部署工具之一,能够实现代码拉取、构建、测试和部署的全流程自动化。 配置Jenkins任务时,需要添加Git仓库地址和凭证,设置构建触发器(如GitHub…...

认识CMake并使用CMake构建自己的第一个项目

1.CMake的作用和优势 跨平台支持:CMake支持多种操作系统和编译器,使用同一份构建配置可以在不同的环境中使用 简化配置:通过CMakeLists.txt文件,用户可以定义项目结构、依赖项、编译选项等,无需手动编写复杂的构建脚本…...

聚六亚甲基单胍盐酸盐市场深度解析:现状、挑战与机遇

根据 QYResearch 发布的市场报告显示,全球市场规模预计在 2031 年达到 9848 万美元,2025 - 2031 年期间年复合增长率(CAGR)为 3.7%。在竞争格局上,市场集中度较高,2024 年全球前十强厂商占据约 74.0% 的市场…...

ArcPy扩展模块的使用(3)

管理工程项目 arcpy.mp模块允许用户管理布局、地图、报表、文件夹连接、视图等工程项目。例如,可以更新、修复或替换图层数据源,修改图层的符号系统,甚至自动在线执行共享要托管在组织中的工程项。 以下代码展示了如何更新图层的数据源&…...

js 设置3秒后执行

如何在JavaScript中延迟3秒执行操作 在JavaScript中,要设置一个操作在指定延迟后(例如3秒)执行,可以使用 setTimeout 函数。setTimeout 是JavaScript的核心计时器方法,它接受两个参数: 要执行的函数&…...