php中文网 | cnphp.com

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 503|回复: 0

镜像分层原理及容器层写时复制

[复制链接]

2672

主题

2679

帖子

9503

积分

管理员

Rank: 9Rank: 9Rank: 9

UID
1
威望
0
积分
6709
贡献
0
注册时间
2021-4-14
最后登录
2024-5-19
在线时间
674 小时
QQ
发表于 2022-5-9 09:00:28 | 显示全部楼层 |阅读模式
一、镜像分层与容器层
在进行docker pull 下载镜像的时候,通过下图可以看到镜像是分层下载并解压的。如nginx:1.20.2的镜像,其镜像是分为6层。
image.png
当我们运行一个新的容器的时候,实际上是在镜像分层的基础上新添加了一层:container layer(容器层)。之后所有容器运行时对文件系统产生的修改实际都只影响这一层。并且针对这一层所作的修改(写操作),在容器重启之后会全部丢失。所以说在使用docker的过程中,在需要修改运行时容器文件数据的时候,尽量去重新构建镜像而不是直接修改容器内文件。如果重构镜像解决不了的问题,使用数据卷。

构建镜像的方法是通过Dockerfile定义,数据卷的使用详解,专栏后续文章笔者会详细介绍。
image.png
注意 :对于运行时的容器而言,镜像层只读的,容器层可读也可写。对于镜像层的只读文件,容器层如果想做修改,实际上是进行了写时复制操作。(下文介绍)。

二、为什么会产生分层?
通过上文的介绍,我们已经知道镜像是分层的,那么镜像分层的依据是什么?或者说构建镜像的时候究竟是什么动作产生了分层?我们来看下面的这张图,使用docker history查看镜像的构建历史。
image.png
注意上图中红色边框的部分,我们可以看到:在进行ADD、COPY、执行shell脚本等操作的时候操作步骤对应的SIZE不等于0,正好是6个操作,和我们上文中nginx:1.20.2镜像分层的数量是一样的。所以我们可以做一个大胆的猜想:在镜像构建过程中需要向镜像写入数据的时候会产生分层,一个写操作指令产生一个分层。 大家可以自己去观察更多的镜像去验证这个猜想。笔者要说的是:我读过Dokcer的源码,所以这是一个可以被信任的结论。
image.png
上面的这张图是nginx:1.20.2的Dockerfile(镜像构建过程定义文档),也就是构建nginx:1.20.2镜像的构建步骤定义文档(官方)。其中FROM(ADD)指令--添加基础镜像或文件、RUN指令--执行命令行脚本、COPY指令--文件复制,这些都是写操作命令,都会产生新的镜像分层。

三、什么是写时复制?
上文中我们提到了一个概念:写时复制。这个概念如果用专业名词的方式说明还是比较难以理解,所以我用白话的方式说明一下。举个例子:

一个授课老师写了一本练习册(原始镜像)。
然后老师留作业了,练习册第12页。全班同学把练习册的第12页全都复印了一份,带回家做作业。
image.png





上一篇:使用本地自签名证书为 React 项目启用 https 支持
下一篇:Solon 1.7.6 发布,轻量级的应用开发框架
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|php中文网 | cnphp.com ( 赣ICP备2021002321号-2 )

GMT+8, 2024-5-20 04:46 , Processed in 0.153988 second(s), 35 queries , Gzip On.

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2020, Tencent Cloud.

申明:本站所有资源皆搜集自网络,相关版权归版权持有人所有,如有侵权,请电邮(fiorkn@foxmail.com)告之,本站会尽快删除。

快速回复 返回顶部 返回列表