docker的缓存机制

docker文档

docker的缓存机制

镜像层缓存(Image Layer Cache)

Docker 镜像是分层构建的,每一个 Dockerfile 指令都会生成一个新的镜像层。
Docker 会缓存每一个镜像层,当构建新的镜像时,如果检测到某个层之前已经构建过,就会直接复用该层,而不需要重新构建。


FROM ubuntu:18.04
RUN apt-get update
RUN apt-get install -y nginx
COPY app/ /var/www/html/
CMD ["nginx", "-g", "daemon off;"]

在上面的 Dockerfile 中, 前两个 RUN 指令对应的镜像层会被缓存。当再次构建镜像时,如果这两个层没有变化,Docker 就会直接复用缓存,而不需要重新执行这两条命令,大大加快了构建速度。

容器层缓存(Container Layer Cache)

每个容器都有自己的可写容器层,位于镜像层之上,用于存储容器的动态数据。
Docker 也会缓存容器层,当重新启动容器时,Docker 会复用之前的容器层,避免重新创建。


# 创建并启动容器
docker run -d --name my-app my-app:v1# 停止并重启容器
docker stop my-app
docker start my-app

在上面的示例中,当我们停止并重启容器时,Docker 会复用之前的容器层,避免了重新创建容器的开销,使容器启动速度更快。

构建缓存(Build Cache)

Docker 还提供了一个专门的构建缓存机制,可以进一步优化镜像构建过程。
构建缓存会将之前构建过程中用到的中间层缓存起来,下次构建时如果检测到相同的指令,就会复用这些缓存层。
用户可以通过设置 --cache-from 参数来指定需要复用的缓存层。


# 构建镜像时启用构建缓存
docker build --cache-from my-app:v1 -t my-app:v2 .

在上面的示例中,我们指定了 --cache-from my-app:v1 参数,告诉 Docker 复用之前构建 my-app:v1 时使用的缓存层,这样可以进一步加快构建速度。

Registry 缓存

Docker Registry 也提供了缓存机制,可以缓存之前拉取的镜像层,下次拉取时直接从缓存中获取,提高拉取速度。
这种缓存机制对于分布式环境下的镜像分发非常有用,可以减轻 Registry 服务器的压力。

综上所述,Docker 的缓存机制涵盖了镜像层、容器层、构建过程以及 Registry 等多个方面,充分利用缓存可以大幅提升 Docker 的性能和效率。如果您还有其他问题,欢迎继续提出

docker的几种写法

指令顺序优化

  • Dockerfile 中指令的顺序非常重要,因为 Docker 是根据指令顺序来构建镜像层的。
  • 通常将较稳定不变的指令放在前面,易变的指令放在后面,这样可以最大限度地利用缓存。

例如:


# 不好的写法
RUN apt-get update
COPY . /app
RUN pip install -r requirements.txt# 更好的写法  
FROM python:3.9
WORKDIR /app
COPY requirements.txt .
RUN pip install -r requirements.txt
COPY . .

在第二个例子中,我们先复制 requirements.txt 并安装依赖包,这部分内容相对稳定,可以很好地利用缓存。而后面的 COPY . . 指令是最易变的,放在最后可以最大化利用缓存。

分层构建

  • 充分利用 Docker 的分层特性,把 Dockerfile 拆分成多个阶段,每个阶段构建一部分功能。
  • 这样可以确保稳定的基础层能够最大化利用缓存,而变更的部分只需重新构建对应层即可。

例如:


# 基础层
FROM ubuntu:18.04
RUN apt-get update && apt-get install -y nodejs npm# 应用层  
FROM base-image
COPY . /app
WORKDIR /app
RUN npm install
CMD ["node", "server.js"]

在这个例子中,我们将 Dockerfile 划分为两个阶段:基础层和应用层。基础层负责安装 Node.js 环境,这部分内容相对稳定,可以很好地利用缓存。应用层则负责复制源代码并安装依赖,这部分内容更容易变更。

多阶段构建

  • Docker 17.05 版本引入了多阶段构建的功能,可以进一步优化镜像大小和构建过程。
  • 通过在 Dockerfile 中定义多个 FROM 指令,可以实现将构建过程拆分为多个独立的阶段。

例如:


# 构建阶段
FROM golang:1.16 AS builder
WORKDIR /app
COPY . .
RUN go build -o myapp# 运行阶段 
FROM alpine:latest
COPY --from=builder /app/myapp /myapp
CMD ["/myapp"]

在这个例子中,我们先在 builder 阶段编译 Go 代码,然后在 runtime 阶段只复制编译好的二进制文件到最终镜像中。这种方式可以大幅减小最终镜像的体积,同时也能很好地利用缓存。

关于docker的builder阶段

在多阶段构建的场景中,即使在 builder 阶段复制了源代码,最终也只会把编译好的二进制文件复制到运行时容器中。这是因为 COPY --from=builder 指令会选择性地复制指定阶段的文件。

让我们更详细地解释一下:

  • 在 builder 阶段,我们将源代码复制到工作目录并执行编译命令go build。此时,容器中包含了源代码和编译好的二进制文件。
  • 在 runtime 阶段,我们使用 COPY --from=builder 指令从 builder 阶段复制二进制文件 /app/myapp 到当前容器的 /myapp 路径。
  • 这样做的好处是:
    1、 只将最终需要的二进制文件复制到运行时容器中,大大减小了镜像大小。
    2、builder 阶段的源代码和编译过程不会被带入到最终镜像中,从而避免了不必要的信息泄露。

在多阶段构建中,builder 阶段的源代码确实会被保存下来,但不会被包含在最终的容器镜像中。这里有几点需要说明:

Docker 缓存

  • Docker 在构建镜像时会利用缓存机制,加快后续镜像的构建过程。
  • 这意味着 builder 阶段产生的中间层镜像会被暂时保留在本地 Docker 环境中,以便后续构建时复用。

最终镜像

  • 通过 COPY --from=builder 指令,只有 builder 阶段产出的二进制文件会被复制到最终的运行时容器中。
  • 源代码和编译过程中产生的其他文件不会被包含在最终镜像中。

开发与部署分离

  • 多阶段构建的一个重要目的就是将开发和部署环境进行分离。
  • 开发阶段的源代码和构建过程保留在 builder 容器中,不会泄露到最终的部署容器中。

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

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

相关文章

DS知识点总结--线性表定义及顺序表示

数据结构知识点汇总(考研C版) 文章目录 数据结构知识点汇总(考研C版)二、线性表2.1 线性表的定义和操作2.1.1 线性表的定义2.1.2 线性表的基本操作 2.2 线性表的顺序表示2.2.1 顺序表的定义2.2.2 顺序表上的基本操作的实现 二、线性表 2.1 线性表的定义和操作 2.1.1 线性表的…

消防设施操作员(中级)题库

31.消防水带按内口径可分为( )类。 A.2 B.4 C.6 D.8 答案:D 解析:消防水带按内径可分为8类,分别是25mm、50mm、65mm,、80mm、100mm、125mm、150mm、300mm。(详见教材172页) 32.消防水带按&#xff0…

区块链会议投稿资讯CCF A--WINE 2024 截止7.15 附录用率 附录用的区块链文章

Conference:The Conference on Web and Internet Economics (WINE) CCF level:CCF A Categories:Cross-cutting/comprehensive/emerging Year:2024 Conference time: December 2-5, 2024 录用率: sele…

MSPM0G3507——PWM

在sysconfig中,左侧可以选择MCU的外设,我们找到并点击TIMER-PWM选项卡,在TIMER-PWM中点击ADD,就可以添加定时器下的PWM外设。 这里设置通道0为100Hz的频率,0%占空比的PWM,周期计数值为1000,比较…

信息检索(49):Learning Passage Impacts for Inverted Indexes

Learning Passage Impacts for Inverted Indexes 摘要1 引言2 深度影响框架3 实验结果结论 发布时间(2021) 标题:倒排索引对于段落学习的影响 摘要 1)语言模型 倒排索引 2)改进影响分数建模和词汇不匹配问题 3&…

我理解的文本表示模型

词袋模型与N-grams模型 1 词袋模型 (Bag of Words)1.1 one-hot 取值 (Binary)1.2 Term Frequency 取值 (TF)普通频数 r a w t f raw_{tf} rawtf​频率范数归一化对数频数 1.3 Inverse document frequency (IDF)1.4 TF-IDF scores 取值 N-Gram 最简单的文本建模场景&#xff1a…

HTML页面布局-使用div示例

<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Title</title> </head> <body><!--text-align:center 文字水平居中line-height&#xff1a;200px; 文字垂直居中,行高设置跟高…

点云处理中阶 Sample Consensus(一)

目录 一、什么是Sample Consensus (采样一致性) 二、推荐阅读 三、提供的示例 四、注意问题 一、什么是Sample Consensus (采样一致性) PCL(Point Cloud Library)中的 Sample Consensus 是一种用于点云数据的模型拟合方法。它的核心思想是通过迭代的方式,在点云数据…

聚类算法(2)--- ISODATA算法

本篇文章是博主在人工智能等领域学习时&#xff0c;用于个人学习、研究或者欣赏使用&#xff0c;并基于博主对人工智能等领域的一些理解而记录的学习摘录和笔记&#xff0c;若有不当和侵权之处&#xff0c;指出后将会立即改正&#xff0c;还望谅解。文章分类在AI学习笔记&#…

Vue02-第一个Vue程序

第一个Vue程序 1、什么是MVVM MVVM&#xff08;Model-View-ViewModel&#xff09;是一种软件设计模式&#xff0c;由微软WPF&#xff08;用于替代WinForm&#xff0c;以前就是用这个技术开发桌面应用程序的&#xff09;和Silverlight&#xff08;类似于Java Applet&#xff0…

安卓安装linux + .net环境

安装Termux 到下面地址获取apk安装包 https://github.com/termux/termux-app 安装ssh ~ $ pkg install openssl ~ $ pkg install openssh查看用户名 ~ $ whoami ssh u0_a390修改当前用户密码 passwd 启动ssh sshd 安装 proot-distro pkg install proot-distro 列出能装的lin…

新手(初学者)学R语言第一课,从学正确导入数据开始

初看题目好像我在教你怎么导入数据&#xff0c;不不不&#xff0c;我是在教你正确的导入数据&#xff0c;不是说数据导入R就叫正确导入数据了。本章为新手教程&#xff0c;老手可以跳过。 这个内容早就想写了&#xff0c;今天有点空和大家聊一下。为什么R语言对于新手而言不太友…

nginx启动之后任务管理器里面没有nginx进程

原因1&#xff1a;确保你的nginx文件夹里面只包含英文路径&#xff01;绝对不能有中文&#xff01; 原因2&#xff1a; 到conf\nginx.conf里面查看端口和IP地址是否正确设置&#xff0c;ip地址有无正确输入

SpringCloud-nacos基础

SpringCloud-nacos nacos在微服务种有两大作用&#xff1a; 配置中心服务注册中心 配置中心 维度管理 nacos配置中心可以在三个维度进行管理&#xff1a; spring.profiles.active dev/prod/test,通过这个属性可以配置不同环境下的配置文件。 配置的文件名应该为${spring…

【MATLAB】(高数)

参考文章 函数极限 导数与偏导 极值和最值 局部范围的最值 局部范围内的最值&#xff0c;相当于函数的极值 离散数据的最值 多元函数的极值 fminunc [x, fval] fminunc(fun, x0)fun为代求极值的函数&#xff1b;x0为起始点&#xff0c;即从这个点开始寻找极值&#xff0c;…

SpringCloud-OpenFeign基础

OpenFeign OpenFeign简介 OpenFeign是一个基于HTTP协议的RPC&#xff08;远程过程调用&#xff09;组件&#xff0c;用于简化HTTP请求和响应的处理。它通过声明式的方式定义REST API接口&#xff0c;并自动生成实现该接口的客户端代码&#xff0c;从而简化了RESTful服务的调用…

4、MFC:菜单栏、工具栏与状态栏

菜单栏、工具栏与状态栏 1、菜单栏1.1 简介1.2 创建属性设置菜单消息成员函数 1.3 实例 2、工具栏2.1 简介工具栏属性2.2 创建消息CToolBar类的主要成员函数 2.3 实例 3、状态栏3.1 简介3.2 创建CStatusBar类状态栏创建 3.3 实例 1、菜单栏 1.1 简介 菜单在界面设计中是经常使…

渗透测试-若依框架的杀猪交易所系统管理后台

前言 这次是带着摸鱼的情况下简单的写一篇文章&#xff0c;由于我喜欢探究黑灰产业&#xff0c;所以偶尔机遇下找到了一个加密H币的交易所S猪盘&#xff0c;我记得印象是上年的时候就打过这一个同样的站&#xff0c;然后我是通过指纹查找其它的一些站&#xff0c;那个站已经关…

海外短剧系统如何征服观众心

海外短剧系统要征服观众的心&#xff0c;需要综合考虑多个方面。 1、紧凑的剧情设计&#xff1a; 短小精悍&#xff1a;海外短剧通常每集时长不超过半小时&#xff0c;甚至有的仅有几分钟。这种紧凑的剧情设计让观众能够在短时间内迅速沉浸在故事中&#xff0c;无需花费大量时间…

OpenCV一文入门

OpenCV一文入门 官网地址 OpenCV 当前版本 opencv-python 4.9.0.80 python 包地址 https://pypi.org/project/opencv-python/ OpenCV&#xff08;Open Source Computer Vision Library&#xff09;是一个开源计算机视觉和机器学习软件库&#xff0c;由Intel最初开发&#xff0c…