利用Docker分层构建优化镜像大小

合适docker镜像文件大小不仅影响容器启动效率,也影响资源占用效率。本文介绍如何利用分层方式构建docker镜像,采用多种方式避免镜像文件太大而影响性能。

Docker 镜像大小优化的重要性

  • 资源利用效率

    较小的镜像文件在存储和传输过程中占用更少的空间和带宽。例如,在将镜像从本地仓库推送到远程仓库或者在集群环境中分发镜像时,小镜像可以加快传输速度,减少网络资源的占用。

    当在主机上存储大量镜像时,较小的镜像可以节省磁盘空间,使得可以在有限的磁盘容量下存储更多的镜像,这对于容器编排系统(如 Kubernetes)管理大量不同的容器镜像非常重要。

  • 容器启动速度

    小镜像启动速度通常更快。因为在容器启动时,需要将镜像中的文件系统加载到容器的存储层,如果镜像文件较小,那么加载的时间和资源消耗会相应减少,从而提高容器的启动效率。

分层构建镜像的原理和优势

  • 原理

    Docker 镜像是由多层文件系统叠加而成的。每一层都代表了一次对文件系统的修改,例如安装软件包、添加配置文件等操作。当构建镜像时,Docker 会将这些操作按顺序记录下来,形成一个分层的结构。

    例如,基础镜像(如ubuntu:latest)是最底层,然后在其上添加新的层,如安装nginx软件包会形成一个新的层,修改nginx的配置文件又会形成另外一层。
    在这里插入图片描述

  • 优势对镜像大小的影响

    复用已有层:分层构建最大的优势之一是可以复用层。如果多个镜像都基于相同的基础镜像,并且在基础镜像之上的某些层是相同的(例如都安装了相同的系统库),那么这些相同的层在存储时只会保存一份。

    例如,有镜像 A 和镜像 B 都基于ubuntu:latest构建,并且都安装了python3 - pip包,那么这个python3 - pip安装层只会在存储中保存一次,多个镜像可以共享该层。这样可以大大减少镜像存储所需的空间总量。

    增量构建和更新:当需要更新镜像中的某一部分时,只需要更新对应的层。例如,如果只是更新了应用程序的代码而没有改变基础操作系统或其他依赖库,那么只有包含代码的层会被更新,其他层可以保持不变。这使得更新镜像时的数据传输量最小化,有助于保持镜像大小的合理性。

分层构建镜像的最佳实践

  1. 合理选择基础镜像

    基础镜像的大小对最终镜像大小有很大影响。尽量选择轻量级的基础镜像。例如,对于基于 Linux 的应用程序,如果不需要完整的 Ubuntu 或 CentOS 系统的所有功能,可以选择alpine作为基础镜像。alpine是一个轻量级的 Linux 发行版,其镜像大小通常只有几兆字节,相比完整的 Ubuntu 或 CentOS 镜像(可能几百兆字节)要小很多。

    例如,构建一个简单的 Python Web 应用容器,使用python:alpine作为基础镜像会比使用python:ubuntu产生更小的镜像。

  2. 合并多层操作(减少层数)

    虽然分层有很多优势,但过多的层也可能导致一些问题,如镜像存储和传输效率下降。在构建镜像过程中,可以将一些相关的操作合并到同一层中。

    例如,在安装多个软件包时,可以在一个RUN指令中完成,而不是为每个软件包安装使用一个单独的RUN指令。比如在Dockerfile中,不要这样写:

   RUN apt - get update
   RUN apt - get install - y package1
   RUN apt - get install - y package2

应该这样写:

   RUN apt - get update && apt - get install - y package1 package2

这样可以减少镜像的层数,因为每一个RUN指令都会产生一个新的层。

  1. 清理无用文件和缓存

在构建镜像过程中,安装软件包或编译程序等操作可能会产生一些临时文件和缓存。这些文件会增加镜像的大小,但在容器运行时可能并不需要。

例如,在apt - get安装软件包后,可以使用apt - get clean命令清理软件包缓存。在构建基于 Java 的应用程序镜像时,编译后的字节码文件可能不需要包含源代码文件,那么可以在构建过程中删除源代码文件。在Dockerfile中可以这样写:

   RUN apt - get update && apt - get install - y package && apt - get clean

或者在构建 Java 应用程序镜像时:

   # 假设编译后的代码在/target目录,源代码在/src目录
   COPY. /app
   WORKDIR /app
   RUN mvn clean install - DskipTests
   RUN rm - rf /app/src

通过分层构建镜像并结合上述最佳实践,可以有效地控制 Docker 镜像的大小,提高镜像的存储和使用效率。

  1. 多阶段构建

原理:多阶段构建允许将构建过程分为多个阶段,每个阶段可以使用不同的基础镜像和构建工具。在前面的阶段可以进行代码编译、测试等操作,在后面的阶段只复制运行时需要的文件,从而减少最终镜像的大小。

示例:以一个 Go 语言应用为例,第一阶段可以使用包含 Go 编译器的基础镜像来编译应用程序,第二阶段可以使用一个轻量级的alpine基础镜像来运行编译后的程序。

   # 第一阶段:构建应用
   FROM golang:1.18 - alpine AS builder
   COPY. /app
   WORKDIR /app
   RUN go build - o myapp

   # 第二阶段:运行应用
   FROM alpine:latest
   COPY -- from = builder /app/myapp /usr/local/bin/myapp
   CMD ["myapp"]

在这个例子中,第一阶段构建出了 Go 应用,第二阶段只复制了运行时需要的可执行文件myapp到一个轻量级的alpine镜像中,最终的镜像不包含 Go 编译器和其他构建过程中产生的不必要的文件,大大减小了镜像大小。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/935697.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

SpringBoot3整合SpringMVC

一、实现过程: (1).创建程序 (2).引入依赖: <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"…

【C++】闰年判断问题完整解析与代码优化

博客主页&#xff1a; [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: C 文章目录 &#x1f4af;前言&#x1f4af;题目描述&#x1f4af;我的解法分析 &#x1f4af;老师解法分析代码 1&#xff08;未优化版本&#xff09;分析 代码 2&#xff08;优化版本&#xff09;分析 &#x1f4af…

【深度学习】深刻理解ViT

ViT&#xff08;Vision Transformer&#xff09;是谷歌研究团队于2020年提出的一种新型图像识别模型&#xff0c;首次将Transformer架构成功应用于计算机视觉任务中。Transformer最初应用于自然语言处理&#xff08;如BERT和GPT&#xff09;&#xff0c;而ViT展示了其在视觉任务…

深度学习实验十四 循环神经网络(1)——测试简单循环网络的记忆能力和梯度爆炸实验

目录 一、数据集构建 1.1数据集的构建函数 1.2加载数据集并划分 1.3 构建Dataset类 二、模型构建 2.1嵌入层 2.2SRN层 2.3模型汇总 三、模型训练 3.1 训练指定长度的数字预测模型 3.2 损失曲线展示 四、模型评价 五、修改 附完整可运行代码 实验大体步骤&#x…

js:我要在template中v-for循环遍历这个centrerTopdata,我希望自循环前面三个就可以了怎么写

问&#xff1a; 我按在要在template中v-for循环遍历这个centrerTopdata&#xff0c;我希望自循环前面三个就可以了怎么写&#xff1f; 回答&#xff1a; 问&#xff1a; <div v-for"(item, index) in centrerTopdata.slice(0, 3)" :key"index"> d…

2、开发环境优化与创建第一个插件程序

一、创建测试用例二、vscode优化2.1 修改默认终端为普通cmd2.2 配置一键编译&&运行&&监视一、创建测试用例 使用命令yo code生成一个测试用例,选择或输入下面的内容。2. 命令的最后会提示是否使用vscode打开,选择打开就行。 3. 在当前目录下会产生helloworld…

element-ui实现table表格的嵌套(table表格嵌套)功能实现

最近在做电商类型的官网&#xff0c;希望实现的布局如下&#xff1a;有表头和表身&#xff0c;所以我首先想到的就是table表格组件。 表格组件中常见的就是&#xff1a;标题和内容一一对应&#xff1a; 像效果图中的效果&#xff0c;只用基础的表格布局是不行的&#xff0c;因…

华为TaurusDB与GaussDB:信创改造的“降本提效”之路

近年来&#xff0c;信创&#xff08;信息技术应用创新&#xff09;已成为中国国央企数字化转型的关键词。伴随这一浪潮&#xff0c;众多企业面临一个迫切问题&#xff1a;如何在兼顾性能与成本的前提下&#xff0c;完成核心系统的迁移改造&#xff1f;华为TaurusDB和GaussDB的加…

自然哲学的智能原理

一、自然哲学的智能原理 自然哲学的智能原理是一个跨学科的话题&#xff0c;它涉及哲学、自然科学、人工智能&#xff08;AI&#xff09;等多个领域的交集。自然哲学起源于古希腊&#xff0c;是探索自然界规律与现象的哲学分支&#xff0c;现代的“智能”概念则涉及到思维、学习…

硬件成本5元-USB串口采集电表数据完整方案-ThingsPanel快速入门

ThingsPanel开源物联网平台支持广泛的协议&#xff0c;灵活自由&#xff0c;本文介绍ThingsPanel通过串口来采集电表数据&#xff0c;简单易行&#xff0c;成本低廉&#xff0c;适合入门者学习试验&#xff0c;也适合一些特定的应用场景做数据采集。 适用场景&#xff1a; 降低…

在 Windows WSL 上部署 Ollama 和大语言模型:从镜像冗余问题看 Docker 最佳实践20241208

&#x1f6e0;️ 在 Windows WSL 上部署 Ollama 和大语言模型&#xff1a;从镜像冗余问题看 Docker 最佳实践 ⭐ 引言 随着大语言模型&#xff08;LLM&#xff09;和人工智能技术的迅猛发展&#xff0c;开发者们越来越多地尝试在本地环境中部署模型进行实验。 但部署过程中常…

数字化招聘系统如何帮助企业实现招聘效率翻倍提升?

众所周知&#xff0c;传统的招聘方式已经难以满足现代企业对人才的需求&#xff0c;而数字化招聘系统的出现&#xff0c;为企业提供了全新的解决方案。通过数字化招聘系统&#xff0c;企业可以自动化处理繁琐的招聘流程&#xff0c;快速筛选合适的候选人&#xff0c;从而大幅提…

【Email】基于SpringBoot3.4.x集成发送邮件功能

【Email】基于SpringBoot3.4.x集成发送邮件功能 摘要本地开发环境说明pom.xml启动类application.yaml写一个邮件模板定义模板引擎工具类定义一个邮件发送对象封装一个邮件发送器单元测试邮件模板单元测试发送邮件单元测试 邮件效果参考资料 摘要 在业务系统开发过程中&#xf…

如何在小米平板5上运行 deepin 23 ?

deepin 23 加入了 ARM64 支持&#xff0c;这里尝试将 deepin 系统刷入平板中&#xff0c;平常使用中&#xff0c;带个笔记本电脑有时候也会嫌比较麻烦&#xff0c;把 Linux 系统刷入平板中既满足了使用需要&#xff0c;又满足了轻便的需求。为什么不使用 Termux &#xff1f;虽…

java+springboot+mysql在线文件管理系统

项目介绍&#xff1a; 使用javaspringbootmysql开发的在线文件管理系统&#xff0c;系统包含管理员、使用员、监察员角色&#xff0c;功能如下&#xff1a; 管理员&#xff1a;使用员管理&#xff1b;监测员管理&#xff1b;留言管理&#xff08;回复&#xff09;&#xff1b…

网站多语言前端翻译translate.js 在vue项目中的使用方法

网站多语言前端翻译translate.js 在vue项目中的使用方法 需求 客户网站&#xff0c;想要多语言版本的&#xff0c;通常的解决办法有两种&#xff1a; 1、最直接的办法&#xff1a;编写两种&#xff0c;或者多种语言版本的网站&#xff0c;也就是一个网站有几种语言&#xff0…

《Django 5 By Example》阅读笔记:p493-p520

《Django 5 By Example》学习第 17 天&#xff0c;p493-p520 总结&#xff0c;总计 28 页。 一、技术总结 1.internationalization(国际化) vs localization(本地化) (1)18n&#xff0c;L10n&#xff0c;g11n 以前总觉得这两个缩写好难记&#xff0c;今天仔细看了下维基百科…

mycat2读写分离配置

逻辑库配置 登录mycat 创建逻辑库&#xff0c;配置数据源 mycat2安装和使用 create database mycar_db1;修改mycar_db1.schema.json配置文件 指定的数据’targetName’&#xff1a;‘prototype’&#xff0c;配置主机数据源 targetName的参数可以是数据源 也可以是集群 这儿…

.Net 多线程、异步、性能优化应用与心得

文章目录 概要多线程Thread方式创建线程:Task方式创建线程[C#5.0引入]&#xff08;推荐使用&#xff09;:线程池方式创建线程&#xff1a; 异步异步方法异步IO操作异步数据库操作异步Web请求取消异步ValueTask[C# 7.0引入]ValueTask<TResult> 和 Task 性能优化懒加载对象…

如何在项目中使用人大金仓替换mysql

文章目录 数据库连接配置调整驱动和连接字符串修改&#xff1a;用户名和密码&#xff1a; SQL 语法兼容性检查数据类型差异处理&#xff1a;函数差异&#xff1a;SQL语句客户端 SQL 交互工具 数据迁移数据库、用户移植数据迁移工具使用&#xff1a;迁移过程中的问题及解决方案 …