利用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 updateRUN apt - get install - y package1RUN 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. /appWORKDIR /appRUN mvn clean install - DskipTestsRUN rm - rf /app/src

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

  1. 多阶段构建

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

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

   # 第一阶段:构建应用FROM golang:1.18 - alpine AS builderCOPY. /appWORKDIR /appRUN go build - o myapp# 第二阶段:运行应用FROM alpine:latestCOPY -- from = builder /app/myapp /usr/local/bin/myappCMD ["myapp"]

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

深度学习面试相关-2024.12.15记录

深度学习 面试相关- 2024.12.15记录 目录 深度学习 面试相关- 2024.12.15记录整体常问问题1数学基础1.1 概率统计1.2 线代 2机器学习算法2.1 深度学习算法2.2 机器学习算法 整体常问问题 https://www.nowcoder.com/discuss/353154899112304640 1数学基础 1.1 概率统计 htt…

从零用java实现 小红书 springboot vue uniapp (2)主页优化

前言 移动端演示 http://8.146.211.120:8081/#/ 前面的文章我们基本完成了主页的布局 今天我们具体的去进行实现 并且分享我开发时遇到的问题 首先先看效果 java仿小红书主页 实现效果为 1.顶端全屏切换 2.上划加载更多 3.下拉当前页整体刷新 顶端全屏切换我们选择 gui-switch…

idea 配置 git .gitignore文件配置

.gitignore 内容 .idea/ *.iml target/ *.class *.log .iml在idea项目里面创建一个.gitignore名字的文件,然后把这个文件提交到git上。我一般是放到.idea同级目录。 我遇到了几种情况这个文件配置了但是不生效的情况 第一种 Git的缓存可能会导致配置不生效。尝试…

双指针---移动0

常见的双指针有两种形式,⼀种是对撞指针,⼀种是快慢指针。 这里写自定义目录标题 题目链接 [移动0](https://leetcode.cn/problems/move-zeroes/description/)问题分析代码解决 题目链接 移动0 问题分析 在本题中,我们可以⽤⼀个 cur 指针来…

人工智能的历史概况和脉络

人工智能( AI ) 的历史始于古代,当时有神话、故事和谣言称,人工生物被工匠大师赋予了智慧或意识。从古代到现在,对逻辑和形式推理的研究直接导致了20 世纪 40 年代可编程数字计算机的发明,这是一种基于抽象数学推理的机器。这种设…

基于Arduino的智能太阳能追光系统设计(论文+源码)

1系统方案设计 本次的设基于Arduino的智能太阳能追光系统的设计,整体结构如图2.1所示。整个系统包括Arduino开发板,按键模块,太阳能板,X轴电机,Y轴电机,电池充电模块,电源模块,四路光照检测模块…

AI+智慧海洋数据集

需要的同学私信联系,推荐关注上面图片 右下角订阅号平台 自取下载。 AI智慧海洋数据可以促进海洋科技领域人工智能新技术产、学、研、用协作,引领行业技术创新,助力AI智慧海洋高质量发展,进一步推广人工智能与海洋科技的融合创新…

56.合并区间

以数组 intervals 表示若干个区间的集合,其中单个区间为 intervals[i] [starti, endi] 。请你合并所有重叠的区间,并返回 一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区间 。 示例 1: 输入:intervals [[1,3]…

域名信息收集(小迪网络安全笔记~

附:完整笔记目录~ ps:本人小白,笔记均在个人理解基础上整理,若有错误欢迎指正! 2.1 域名信息收集 引子:上一章介绍了服务器的信息收集。本篇则介绍在面对存在Web资产企业时,其域名信息该如何收…

怎样使用Eclipse创建Maven的Java WEB 项目

文章目录 1、第一种方式(选择 archetype 方式) 1.1、第一步:创建项目1.2、第二步:配置jre1.3、第三步:配置tomcat1.4、第四步:设置为WEB3.11.5、第五步:配置Maven的编译级别 1.5.1、第一种方法…

细说STM32F407单片机SPI基础知识

目录 一、 SPI接口和通信协议 1、 SPI硬件接口 (1)MOSI(Master Output Slave Input) (2)MISO(Master Input Slave Output) (3)SCK 2、SPI传输协议 (1)CPHA0时的数据传输时序 …

C# OpenCvSharp DNN 实现百度网盘AI大赛-表格检测第2名方案第三部分-表格方向识别

目录 说明 效果 模型 项目 ​编辑 代码 参考 下载 其他 说明 百度网盘AI大赛-表格检测的第2名方案。 该算法包含表格边界框检测、表格分割和表格方向识别三个部分,首先,ppyoloe-plus-x 对边界框进行预测,并对置信度较高的表格边界…

Excel + Notepad + CMD 命令行批量修改文件名

注意:该方式为直接修改原文件的文件名,不会生成新文件 新建Excel文件 A列:固定为 renB列:原文件名称C列:修改后保存的名称B列、C列,需要带文件后缀,为txt文件就是.txt结尾,为png图片…

数据结构-排序(来自于王道)

排序的基本概念 插入排序 在这个算法中,除了输入的数组本身,没有使用额外的数据结构来存储数据,所有的操作都是在原数组上进行的。因此,无论输入数组的大小 n 是多少,算法执行过程中所占用的额外空间是固定的&#xff…

【编译器】传统编译器和AI/ML编译器总结

前言 本文总结了传统编译器和AI/ML编译器,可作为学习、研究、研发的参考资料。 1.编译器-GC Clang Clang是一个C、C、Objective-C和Objective-C编程语言的编译器前端。它采用了LLVM作为其后端,由LLVM2.6开始,一起发布新版本。它的目标是提供一…

spring boot框架优劣势分析

优势(Advantages): 1. 快速开发(Rapid Development): • Spring Boot通过提供大量的默认配置和自动配置功能,极大地减少了开发过程中的配置工作量,从而加快了开发速度。 2. 简化部署&#xff08…

QT:在线安装与离线安装

QT 学习系列 QT:在线安装与离线安装 QT 学习系列一、安装(一)离线安装windows系统Linux 系统Mac 系统 (二)在线安装 二、 环境变量配置三、验证总结 一、安装 (一)离线安装 windows系统 获取…

FFmpeg功能使用

步骤:1,安装FFmpeg Download FFmpeg 在这里点击->Windows builds from gyan.dev;如下图 会跳到另外的下载界面: 在里面下拉选择点击ffmpeg-7.1-essentials_build.zip: 即可下载到FFmpeg; 使用&#…

【Python网络爬虫笔记】11- Xpath精准定位元素

目录 一、Xpath 在 Python 网络爬虫中的作用(一)精准定位元素(二)应对动态网页(三)数据结构化提取 二、Xpath 的常用方法(一)节点选取(二)谓词筛选&#xff0…

【数字花园】个人知识库网站搭建:①netlify免费搭建数字花园

目录 [[数字花园]]的构建原理包括三个步骤:五个部署方案教程相关教程使用的平台 步骤信息管理 这里记录的自己搭建数字花园(在线个人知识库)的经历,首先尝试的是网上普遍使用的方法,也就是本篇文章介绍的。 后面会继续…