docker应用的缓存 docker缓存机制

Docker镜像用作Docker执行程序中的主映像。它们是容器的蓝图,提供了有关如何生成容器的说明。在本文中,我将介绍一些经常被忽视的概念,这些概念将有助于优化Docker镜像开发和构建过程。

让我们从Docker构建过程的简短描述开始。这是通过使用Docker CLI工具运行docker build命令触发的过程。
docker build命令根据Dockerfile的文件中指定的指令构建Docker镜像。Dockerfile是一个文本文档,其中包含用户在命令行上调用以组装映像的所有有序命令。

Docker镜像由只读层组成。每层代表一个Dockerfile指令。这些层是堆叠在一起的,每个层都是上一层的变化的增量。通常可以认为这些层是缓存的一种形式。仅对更改的层进行更新,而不是对每个更改进行更新。

下面的示例描述了Dockerfile的内容:

FROM registry.docker.com/baseimg/centos7-jdk8:latestMAINTAINER Luga "luga_sx@outofmemory.cn"RUN mkdir -p /tools/apps/{microserice}
RUN mkdir -p /tools/apps/{microserice}/cacheADD {microserice}.jar /tools/apps/{microserice}/{microserice}.jarEXPOSE 9999ENV TZ 'Asia/Shanghai'ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom -Djava.awt.headless=true -Denv=DEV -Dapollo.cluster=DEFAULT -Dspring.profiles.active=prm -Dfile.encoding=utf-8","-jar","/tools/apps/{microserice}/{microserice}.jar"]
  1. 该文件中的每条指令代表Docker镜像中的单独一层。以下是每条指令的简要说明:

     FROM:从JDK创建一个层Docker镜像,(此处的镜像非Docker Hub上面直接拉取,而是基于源码自定义制作)COPY:从Docker客户端的当前目录添加文件RUN:使用make构建您的应用程序CMD:指定在容器中运行什么命令基于上述命令行,在构建过程中执行上述命令时,将在Docker镜像中创建层,一个完整的Docker镜像将由此诞生。然而,在实际的项目活动中,我们需要从性能、稳定性、安全性等等方面对我们所创建的Docker镜像进行不断的调整、优化,以满足业务场景需求。针对Docker的构建过程,我想分享一些优化建议,以帮助有效地构建镜像:临时容器
    Dockerfile定义的镜像会生成短暂的容器。在这种情况下,临时容器是指可以停放并销毁,然后重建的容器,并使用绝对最小的设置和配置替换为新生成的容器。临时容器可以认为是一次性的。每个实例都是新的,并且与以前的容器实例无关。在开发Docker镜像时,我们应该利用尽可能多的临时模式。
    

    减少不必要的软件包
    尽量避免安装不必要的文件和软件包。Docker镜像应保持精简。这有助于提高可移植性,缩短构建时间,降低复杂性并减小文件大小。例如,在大多数情况下,不需要在容器上安装文本编辑器。不要安装任何非必需的应用程序或服务。

    实现.dockerignore文件
    .dockerignore文件排除与在其中声明的模式匹配的文件和目录。这有助于避免将不必要的大文件或敏感文件和目录发送到守护程序,并避免将它们添加到公共镜像。

    要在不重构源存储库的情况下排除与构建无关的文件,请使用.dockerignore文件。该文件支持类似于.gitignore文件的排除模式。

    排序多行参数
    尽可能通过字母数字排序多行参数来简化以后的更改。这有助于避免软件包重复,并使列表更易于更新。

    解耦应用
    依赖于其他应用程序的应用程序被视为“已耦合”。在某些情况下,它们托管在同一主机或计算节点上。这在非容器部署中很常见,但对于微服务,每个应用程序应存在于其自己的单独容器中。将应用程序解耦到多个容器中,可以更轻松地水平缩放和重用容器。例如,一个解耦的Web应用程序堆栈可能包含三个单独的容器,每个容器都有自己的唯一镜像:一个用于管理Web应用程序,一个用于管理数据库的容器以及一个用于内存中缓存的容器。将每个容器限制为一个进程是一个很好的经验法则。根据业务规则,使容器保持清洁和模块化。然后,如果容器相互依赖,则可以使用Docker容器网络来确保这些容器可以通信。

    最小化层数
    仅使用RUN、COPY和ADD等指令即可创建图层。其他指令仅仅是创建临时的中间镜像,并且最终不会增加构建的大小。在可能的情况下,我们可以在构建过程中包含其他工具或者调试信息,而无需增加最终镜像的大小。

    利用构建缓存
    在构建镜像时,Docker会逐步执行Dockerfile中的指令,并按顺序执行每个指令。在每条指令中,Docker都会在其缓存中搜索要使用的现有镜像,而不是创建新的重复镜像。

Docker镜像通常在构建的过程中遵循以下基本规则:

    1、从已在缓存中的父镜像开始,将下一条指令与从该基本镜像派生的所有子镜像进行比较,以查看是否其中一个是使用完全相同的指令构建的。如果不是,则高速缓存无效。在大多数情况下,仅将Dockerfile中的指令与子镜像之一进行比较就足够。2、对于ADD和COPY指令,将检查镜像中文件的内容,并为每个文件计算一个校验标识。在这些校验标识中通常不考虑文件的最后修改时间和最后访问时间。在缓存查找期间,将校验标识与现有镜像中的进行比较。如果文件中的任何内容(例如内容和元数据)发生了更改,则缓存将无效。3、除了ADD和COPY命令外,缓存检查不会查看容器中的文件来确定缓存是否匹配。例如,在处理RUN apt-get -y update命令时,不会检查容器中更新的文件以确定是否存在缓存命中。在这种情况下,命令字符串用于查找匹配项。4、缓存无效后,所有后续Dockerfile命令都会生成新镜像,并且不使用缓存。

在CI管道中优化Docker镜像构建
前面几节中提到的所有优化概念对于在CI管道中实施都是有效的。特别是缓存。如果Dockerfile发生了变化,那么利用缓存仍然是减少构建时间的最佳方法。作为CI管道的一部分,这是如何工作的?当使用Docker执行器作为构建作业的运行时,可以利用称为Docker层缓存(DLC)的功能来加快构建速度。

当构建Docker镜像是CI流程的常规部分时,DLC是一项很不错的功能。DLC将保存在作业中创建的镜像层。DLC会缓存在工作期间构建的任何Docker镜像的各个层,然后在后续的CircleCI运行中重用未更改的镜像层,而不是每次都重新构建整个镜像。

Dockerfile提交的次数越少,镜像构建步骤将运行得越快。DLC可以与机器执行程序和远程Docker环境(setup_remote_docker)一起使用。重要的是要注意,DLC仅在使用docker build,docker compose或类似的Docker命令创建自己的Docker镜像时有用,它不会减少所有构建启动初始环境所花费的时间。

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

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

相关文章

艺术字画雕刻经营配送商城小程序的作用是什么

一副传神且精致的绘画/雕塑品不仅具有很好的观赏性,更具备售卖属性,当然由于产品本身本身的局限性,无论开店还是线上朋友圈推广,都难有效果。 通过【雨科】平台搭建字画雕刻经营商城,将所有产品线上售卖,电…

“开启中文智能之旅:探秘超乎想象的 Llama2-Chinese 大模型世界”

“开启中文智能之旅:探秘超乎想象的 Llama2-Chinese 大模型世界” 1.国内Llama2最新下载地址 本仓库中的代码示例主要是基于Hugging Face版本参数进行调用,我们提供了脚本将Meta官网发布的模型参数转换为Hugging Face支持的格式,可以直接通过…

QT CmakeLists配置python

这是exe目录,要放到这里,要放到这里,要放到这里。 find_package(PythonLibs 3.6 REQUIRED) include_directories(${PYTHON_INCLUDE_DIRS})set(PY python/libs/) set(PY_LIBS ${PY}_tkinter ${PY}python3 ${PY}python36 ${PY}python36_d) targ…

排序算法——直接插入排序

一、介绍 插入排序就是将前两个元素排好,再将第三个元素通过与前边的元素比较后插入适当的位置,再将第四个元素插入,不断重复插入与前边元素比较的操作,直到将元素都排列好。 演示如下: 视频演示:…

2731. 移动机器人

2731. 移动机器人有一些机器人分布在一条无限长的数轴上,他们初始坐标用一个下标从 0 开始的整数数组 nums 表示。当你给机器人下达命令时,它们以每秒钟一单位的速度开始移动。 给你一个字符串 s ,每个字符按顺序分别表示每个机器人移动的方…

京东数据分析平台:9月中上旬白酒消费市场数据分析

9月份,围绕白酒的热点不断。9月5日,瑞幸咖啡官微发布消息称,瑞幸与贵州茅台跨界合作推出的酱香拿铁刷新单品纪录,首日销量突破542万杯,销售额破1亿元。9月14日,贵州茅台官微发布消息称与德芙推出联名产品“…

软件培训测试高级工程师多测师肖sir__html之作业11

html之作业 案例1&#xff1a; 截图&#xff1a; 代码&#xff1a; <!DOCTYPE html> <html><head><meta charset"UTF-8"><title>表单</title></head><body><table style"background-color:red" bo…

【C++】list基本接口+手撕 list(详解迭代器)

父母就像迭代器&#xff0c;封装了他们的脆弱...... 手撕list目录&#xff1a; 一、list的常用接口及其使用 1.1list 构造函数与增删查改 1.2list 特殊接口 1.3list 排序性能分析 二、list 迭代器实现&#xff08;重点难点&#xff09; 关于迭代器的引入知识&#xff1a…

redis 生成流水工具类

使用redis存储流水号&#xff0c;代码如下&#xff1a; import cn.hutool.core.date.DateUtil; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.stereotype.Component;Component public class RedisSerialUtil {private RedisTemplate…

1、网络编程常见协议

1、协议 ​ 传输数据之前需要指定好规则&#xff1a; #mermaid-svg-hfYOuEyyv6poU5a7 {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-hfYOuEyyv6poU5a7 .error-icon{fill:#552222;}#mermaid-svg-hfYOuEyyv6poU5a7 …

Mac mov转mp4,详细转换步骤

Mac mov转mp4怎么转&#xff1f;视频文件格式为.mov是由Apple公司所开发的特殊格式。因其只能在苹果设备上播放&#xff0c;与他人分享时就会变得困难。为此&#xff0c;我们通常会选择使用MP4这种最受欢迎的视频格式。在日常使用中&#xff0c;MP4成为了大家首选的视频格式。而…

onlyoffice历史版本功能实现

一&#xff1a;开启客户端配置 如果不开启&#xff0c;回调请求里面的history和changeUrl是空 二&#xff1a;客户端主要实现2个回调函数 1.实现onRequestHistory事件&#xff0c;该事件会在ui点击查看历史的时候发起,用于展示历史列表 关键在于获取到history的内容&#xff…

代理IP与Socks5代理在多领域的卓越应用

随着数字化时代的到来&#xff0c;网络工程师在跨界电商、爬虫、出海业务、网络安全和游戏等多个领域中扮演着至关重要的角色。在这些领域中&#xff0c;代理IP与Socks5代理技术已经成为网络工程师的得力助手&#xff0c;本文将深入探讨它们在技术世界中的卓越应用。 1. 跨界电…

写爬虫?前端er何必用python

前言 说起网络爬虫,很多人第一时间想到python,但爬虫并非只能用python实现,虽然网上大部分爬虫文章都在说python爬虫,但对于前端程序员来说,我觉得js才是最屌的(对于简单爬取任务来说,复杂的我暂时没碰到~),下面说说我的经验(是的,仅限本人经验),希望能给各位前…

RPA机器人在电商领域有哪些应用?

随着科技的不断发展&#xff0c;机器人流程自动化&#xff08;RPA&#xff09;已经成为许多领域的重要工具。在电商领域&#xff0c;RPA机器人也发挥了重要的作用。我将从两个方面探讨RPA机器人在电商领域的应用&#xff0c;以及它们如何提高电商运营的效率和效益。 一、RPA机…

Oracle修改数据之后提交事务如何回滚?

在 MySQL 和 Oracle 数据库中&#xff0c;事务提交后都无法回滚。 在 MySQL 中&#xff0c;恢复机制是通过回滚日志&#xff08;undo log&#xff09;实现的&#xff0c;所有事务进行的修改都会先记录到这个回滚日志中&#xff0c;然后在对数据库中的对应行进行写入。当事务已经…

kafka广播消费组停机后未删除优化

背景 kafka广播消息的时候为了保证groupId不重复&#xff0c;再创建的时间采用前缀时间戳的形式&#xff0c;这样可以保证每次启动的时候是创建的新的&#xff0c;但是 会出现一个问题&#xff1a;就是每次停机或者重启都会新建一个应用实例&#xff0c;关闭应用后并不会删除…

Bun v1.0.3 发布,Zig 编写的 JavaScript 运行时

导读Bun 发布了其最新版本 v1.0.3&#xff0c;这是一个集 JavaScript 运行时、打包器、转译器和包管理器于一体的工具。这次的更新不仅修复了众多已知的问题&#xff0c;还引入了一系列令人期待的新功能。 首先&#xff0c;Bun 在这个版本中增加了对 TypeScript 的 emitDecora…

Java架构师主流架构设计模式

目录 1 主流架构设计模式1.1 分层架构模式1.1.1 分层架构的一些常见原则1.1.2 分层的单向依赖原则1.1.3 无循环依赖的原则1.1.4 避免跨层通信的原则1.2 微服务架构模式1.3 基于事件的架构模式2 整洁架构3 六边形架构4 微内核架构模式5 基于空间的架构模式6 道过滤器模式和代理模…

31 数据分析(中)numpy介绍

文章目录 工具excelTableauPower Queryjupytermatplotlibnumpy安装导入包快速掌握&#xff08;bushi&#xff09;array和list的相互转化 np的range多维数组的属性array的改变形状array升降维度array内元素的类型数和array的运算array之间的加减法认识轴切片条件与逻辑修改值app…