https://xie.infoq.cn/article/19c98e8b15ff9f610a2ee26bd

一、镜像分层与容器层

在进行docker pull 下载镜像的时候,通过下图可以看到镜像是分层下载并解压的。如 nginx:1.20.2 的镜像,其镜像是分为 6 层。

当我们运行一个新的容器的时候,实际上是在镜像分层的基础上新添加了一层:container layer(容器层)。之后所有容器运行时对文件系统产生的修改实际都只影响这一层。并且针对这一层所作的修改(写操作),在容器重启之后会全部丢失。所以说在使用 docker 的过程中,在需要修改运行时容器文件数据的时候,尽量去重新构建镜像而不是直接修改容器内文件。如果重构镜像解决不了的问题,使用数据卷。

构建镜像的方法是通过 Dockerfile 定义,数据卷的使用详解,专栏后续文章笔者会详细介绍。

注意 :对于运行时的容器而言,镜像层只读的,容器层可读也可写。对于镜像层的只读文件,容器层如果想做修改,实际上是进行了写时复制操作。(下文介绍)。

二、为什么会产生分层?

通过上文的介绍,我们已经知道镜像是分层的,那么镜像分层的依据是什么?或者说构建镜像的时候究竟是什么动作产生了分层?我们来看下面的这张图,使用docker history查看镜像的构建历史。

注意上图中红色边框的部分,我们可以看到:在进行 ADD、COPY、执行 shell 脚本等操作的时候操作步骤对应的 SIZE 不等于 0,正好是 6 个操作,和我们上文中 nginx:1.20.2 镜像分层的数量是一样的。所以我们可以做一个大胆的猜想:在镜像构建过程中需要向镜像写入数据的时候会产生分层,一个写操作指令产生一个分层。 大家可以自己去观察更多的镜像去验证这个猜想。笔者要说的是:我读过 Dokcer 的源码,所以这是一个可以被信任的结论。

上面的这张图是 nginx:1.20.2 的 Dockerfile(镜像构建过程定义文档),也就是构建 nginx:1.20.2 镜像的构建步骤定义文档(官方)。其中 FROM(ADD)指令--添加基础镜像或文件、RUN 指令--执行命令行脚本、COPY 指令--文件复制,这些都是写操作命令,都会产生新的镜像分层。

三、什么是写时复制?

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

  • 一个授课老师写了一本练习册(原始镜像)。

  • 然后老师留作业了,练习册第 12 页。全班同学把练习册的第 12 页全都复印了一份,带回家做作业。

老师的练习册是原始文稿(正本)(原始文稿构建之后就只读不写,镜像层文件也是),同学们的练习册是在需要使用到的时候复印出来的,并在复印本(副本)上完成作业书写,不影响原来老师那本练习册(正本)的内容。这个就是典型的“写时复制”。对于容器而言,复制出来的文件在面向容器内的运行时软件时,会覆盖原始镜像文件(对于学生而言也只看自己复制出来那份--不要抬杠:抄作业的除外,不看老师的原始文件)。也就是说发生写时复制之后原始镜像文件被隐藏,容器读写操作都只认复制出来的副本文件。注意:该副本文件存在于容器层,容器重启之后容器层重新建立,上一次容器运行时对于文件的修改全部丢失!

[转帖]docker 镜像分层原理及容器写时复制的更多相关文章

  1. 计算机程序的思维逻辑 (73) - 并发容器 - 写时拷贝的List和Set

    本节以及接下来的几节,我们探讨Java并发包中的容器类.本节先介绍两个简单的类CopyOnWriteArrayList和CopyOnWriteArraySet,讨论它们的用法和实现原理.它们的用法比较 ...

  2. Java编程的逻辑 (73) - 并发容器 - 写时拷贝的List和Set

    ​本系列文章经补充和完善,已修订整理成书<Java编程的逻辑>,由机械工业出版社华章分社出版,于2018年1月上市热销,读者好评如潮!各大网店和书店有售,欢迎购买,京东自营链接:http: ...

  3. Java进阶知识点6:并发容器背后的设计理念 - 锁分段、写时复制和弱一致性

    一.背景 容器是Java编程中使用频率很高的组件,但Java默认提供的基本容器(ArrayList,HashMap等)均不是线程安全的.当容器和多线程并发编程相遇时,程序员又该何去何从呢? 通常有两种 ...

  4. 理解Docker镜像分层

    关于base镜像 base 镜像有两层含义: 不依赖其他镜像,从 scratch 构建. 其他镜像可以之为基础进行扩展. 所以,能称作 base 镜像的通常都是各种 Linux 发行版的 Docker ...

  5. Docker镜像分层技术

    Docker镜像管理 1.镜像分层技术 2.创建镜像 3.下载镜像到主机 4.删除镜像 5.上传镜像到registry docker镜像: 早在集装箱没有出现的时候,码头上还有许多搬运的工人在搬运货物 ...

  6. [Docker镜像] 关于阿里云容器镜像服务的使用(以天池比赛提交镜像为例)

    最近在参加天池比赛,由于比赛需要使用阿里云容器镜像服务完成线上预测任务,所以花费了3-4天的时间了解并使用Docker完成相关镜像操作,在此分享下我学习的内容,以下是本文的目录结构: 介绍 镜像 容器 ...

  7. Docker镜像构建原理解析(不装docker也能构建镜像)

    在devops流程里面 构建镜像是一个非常重要的过程,一般构建镜像是写dockerfile文件然后通过docker client来构建的image. docker client 会先检查本地有没有im ...

  8. 『现学现忘』Docker基础 — 26、Docker镜像分层的理解

    目录 1.分层的镜像 2.加深理解 3.特别说明 1.分层的镜像 我们可以去下载一个镜像,注意观察下载的日志输出,可以看到Docker的镜像是一层一层的在下载. 思考:为什么Docker镜像要采用这种 ...

  9. Docker:镜像构建与进入容器总结

    构建镜像总结 docker构建镜像有两种方法: 1.使用docker commit + 容器 docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]] ...

  10. docker 镜像仓库 Harbor 部署 以及 跨数据复制

    docker 镜像仓库 Harbor 部署 跨数据复制 Harbor 是 Vmwar 公司开源的 企业级的 Docker Registry 管理项目 它主要 提供 Dcoker Registry 管理 ...

随机推荐

  1. 华为云云原生视窗:一文回顾Q1精彩瞬间

    摘要:一文速览2023年Q1期间华为云云原生相关动态信息. 华为云云原生动态 华为云海外首发CCI Serverless容器服务 在MWC23 巴展期间,华为云海外首发CCI Serverless容器 ...

  2. CodeArts Repo:6大特性助力企业代码稳定可靠安全无忧

    摘要:华为云代码托管服务CodeArts Repo已于2月20日22:00正式上线,这是一款全栈自研.基于Git的云端代码托管服务,旨在保护企业核心代码资产安全,提升企业研发质量和效率. 本文分享自华 ...

  3. 3层结构+7大特点,带你认识华为云IoTEdge

    摘要:华为云IoTEdge三层架构联合打造的IoT边缘平台功能,持续为更多企业和开发者带来价值. 本文分享自华为云社区<[华为云IoTEdge学习笔记]华为云IoT边缘功能特点及价值>,作 ...

  4. MySQL 事务回滚。在执行删除、更新等操作时,防止误操作

    SQL Server 事务执行.回滚 MySQL 事务回滚.在执行删除.更新等操作时,防止误操作 SELECT * FROM TABLE_NAME I WHERE I.TRANS_NO='P-2019 ...

  5. tidevice中常用api 浅谈

    - 设备管理类API: - `pair(device: Device) -> bool`:配对一个iOS设备,返回是否成功. - `unpair(device: Device) -> bo ...

  6. IntelliJ IDEA项目导入时报错:The import javax.servlet.http.HttpServletRequest cannot be resolved

    IntelliJ IDEA项目导入时报错: The import javax.servlet.http.HttpServletRequest cannot be resolved 翻译一下错误信息是说 ...

  7. AtCoder ABC 165 D - Floor Function (Good, 手动模拟推出公式)

    题目链接:Here 题意: 给出正整数 \(A,B,N (1\le A\le 1e6,1\le B,N\le1e12)\) ,对于 \(x\in [0,N]\) 求出 \(\left\lfloor\f ...

  8. Codeforces Round #739 (Div. 3) 个人题解(A~F2)

    比赛链接:Here 1560A. Dislike of Threes Description 找出第 $k$ 大的不可被 $3$ 整除以及非 $3$ 结尾的整数 直接枚举出前 1000 个符合条件的数 ...

  9. 【每日一题】26.codeJan与旅行 (贪心)

    补题链接:Here 算法涉及:贪心 思路: 首先,我们处在p位置,显然要么向左走到相邻的城市,要么向右走走到相邻的城市. 有一个不会证明但观察到的结论,从这两个位置走的话,只有四种可能. 可能1:一直 ...

  10. 【每日一题】14.Accumulation Degree(树形DP + 二次扫描)

    补题链接:Here 一个树形水系,有 \(n\) 个结点,根结点称为源点,叶子结点称为汇点,每条边都有水量限制$C(x,y) \((\)x,y$ 为这条边的两个端点),源点单位时间流出的水量称为整个水 ...