【Docker】容器镜像有哪些特性

首先解释一下什么是Docker镜像?

 

Docker镜像它其实是一个模板,拥有这个模板我们才能创建我们的Docker容器,镜像里含有启动 docker 容器所需的文件系统结构及其内容,因此是启动一个 docker 容器的基础。docker 镜像的文件内容以及一些运行 docker 容器的配置文件组成了 docker 容器的静态文件系统运行环境:rootfs。可以这么理解,docker 镜像是 docker 容器的静态视角,docker 容器是 docker 镜像的运行状态。我们可以通过下图来理解 docker daemon、docker 镜像以及 docker 容器三者的关系(此图来自互联网):

图片

从上图中我们可以看到,当由 ubuntu:14.04 镜像启动容器时,ubuntu:14.04 镜像的镜像层内容将作为容器的 rootfs;而 ubuntu:14.04 镜像的 json 文件,会由 docker daemon 解析,并提取出其中的容器执行入口 CMD 信息,以及容器进程的环境变量 ENV 信息,最终初始化容器进程。当然,容器进程的执行入口来源于镜像提供的 rootfs。

 

rootfs解释

rootfs 是 docker 容器在启动时内部进程可见的文件系统,即 docker 容器的根目录。rootfs 通常包含一个操作系统运行所需的文件系统,例如可能包含典型的类 Unix 操作系统中的目录系统,如 /dev、/proc、/bin、/etc、/lib、/usr、/tmp 及运行 docker 容器所需的配置文件、工具等。
在传统的 Linux 操作系统内核启动时,首先挂载一个只读的 rootfs,当系统检测其完整性之后,再将其切换为读写模式。而在 docker 架构中,当 docker daemon 为 docker 容器挂载 rootfs 时,沿用了 Linux 内核启动时的做法,即将 rootfs 设为只读模式。在挂载完毕之后,利用联合挂载(union mount)技术在已有的只读 rootfs 上再挂载一个读写层。这样,可读写的层处于 docker 容器文件系统的最顶层,其下可能联合挂载了多个只读的层,只有在 docker 容器运行过程中文件系统发生变化时,才会把变化的文件内容写到可读写层,并隐藏只读层中的旧版本文件。

Docker 镜像的主要特征

为了更好的理解 docker 镜像的结构,下面介绍一下 docker 镜像设计上的关键技术。

1、分层

docker 镜像是采用分层的方式构建的,每个镜像都由一系列的 "镜像层" 组成。分层结构是 docker 镜像如此轻量的重要原因。当需要修改容器镜像内的某个文件时,只对处于最上方的读写层进行变动,不覆写下层已有文件系统的内容,已有文件在只读层中的原始版本仍然存在,但会被读写层中的新版本所隐藏。当使用 docker commit 提交这个修改过的容器文件系统为一个新的镜像时,保存的内容仅为最上层读写文件系统中被更新过的文件。分层达到了在不的容器同镜像之间共享镜像层的效果。

图片

2、写时复制(copy-on-write)docker 镜像使用了写时复制(copy-on-write)的策略,在多个容器之间共享镜像,每个容器在启动的时候并不需要单独复制一份镜像文件,而是将所有镜像层以只读的方式挂载到一个挂载点,再在上面覆盖一个可读写的容器层。在未更改文件内容时,所有容器共享同一份数据,只有在 docker 容器运行过程中文件系统发生变化时,才会把变化的文件内容写到可读写层,并隐藏只读层中的老版本文件。写时复制配合分层机制减少了镜像对磁盘空间的占用和容器启动时间。

图片

3、内容寻址(content-addressable storage)

在 docker 1.10 版本后,docker 镜像改动较大,其中最重要的特性便是引入了内容寻址存储(content-addressable storage) 的机制,根据文件的内容来索引镜像和镜像层。与之前版本对每个镜像层随机生成一个 UUID 不同,新模型对镜像层的内容计算校验和,生成一个内容哈希值,并以此哈希值代替之前的 UUID 作为镜像层的唯一标识。该机制主要提高了镜像的安全性,并在 pull、push、load 和 save 操作后检测数据的完整性。另外,基于内容哈希来索引镜像层,在一定程度上减少了 ID 的冲突并且增强了镜像层的共享。对于来自不同构建的镜像层,主要拥有相同的内容哈希,也能被不同的镜像共享。

4、UnionFS联合挂载文件系统
联合挂载技术可以在一个挂载点同时挂载多个文件系统,将挂载点的原目录与被挂载内容进行整合,使得最终可见的文件系统将会包含整合之后的各层的文件和目录。实现这种联合挂载技术的文件系统通常被称为联合文件系统(union filesystem)。以下图所示的运行 Ubuntu:14.04 镜像后的容器中的 aufs 文件系统为例:

图片

由于初始挂载时读写层为空,所以从用户的角度看,该容器的文件系统与底层的 rootfs 没有差别;然而从内核的角度看,则是显式区分开来的两个层次。当需要修改镜像内的某个文件时,只对处于最上方的读写层进行了变动,不复写下层已有文件系统的内容,已有文件在只读层中的原始版本仍然存在,但会被读写层中的新版本文件所隐藏,当 docker commit 这个修改过的容器文件系统为一个新的镜像时,保存的内容仅为最上层读写文件系统中被更新过的文件。联合挂载是用于将多个镜像层的文件系统挂载到一个挂载点来实现一个统一文件系统视图的途径,是下层存储驱动(aufs、overlay等) 实现分层合并的方式。所以严格来说,联合挂载并不是 docker 镜像的必需技术,比如在使用 device mapper 存储驱动时,其实是使用了快照技术来达到分层的效果。

Docker 镜像的存储组织方式

综合考虑镜像的层级结构,以及 volume、init-layer、可读写层这些概念,一个完整的、在运行的容器的所有文件系统结构可以用下图来描述:

图片

从图中我们不难看到,除了 echo hello 进程所在的 cgroups 和 namespace 环境之外,容器文件系统其实是一个相对独立的组织。可读写部分(read-write layer 以及 volumes)、init-layer、只读层(read-only layer) 这 3 部分结构共同组成了一个容器所需的下层文件系统,它们通过联合挂载的方式巧妙地表现为一层,使得容器进程对这些层的存在一无所知。

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

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

相关文章

nginx中的location指令

1、location 介绍 location是Nginx中的块级指令(block directive),location指令的功能是用来匹配不同的url请求,进而对请求做不同的处理和响应,这其中较难理解的是多个location的匹配顺序,本文会作为重点来解释和说明。 开始之前…

容器底层实现技术Namespace/Cgroup

Docker容器实现原理 Docker容器在实现上是通过namespace技术来进行进程隔离,通过cgroup技术实现容器进程可用资源的限制,当docker启动一个容器时,实际是创建了多了namespace参数的进程。 Namespace Namespace:命名空间 作用&#…

身体原因 断更一周

由于众所周知的原因,博主最近具有发热、全身乏力、酸痛、干咳等症状,已严重影响日常的工作学习和博客编写,所以断更我将一周,由下周三(即2022年12月21日)恢复更新 更多往期内容可以参考:全网最…

异方差与多重共线性对回归问题的影响

异方差的检验 1.异方差的画图观察 2.异方差的假设检验,假设检验有两种,一般用怀特检验使用方法在ppt中,课程中也有实验,是一段代码。 异方差的解决办法 多重共线性 多重共线性可能带来的影响: 多重共线性的检验 多重…

如何修改Docker的镜像源

改或新增/etc/docker/daemon.json 文件 vi/etc/docker/daemon.json 添加需要修改的国内镜像源镜像源 { "registry-mirrors":["http://hub-mirror.c.163.com"] } 重启Docker服务 Systemctl restart docker.service 方法二 修改或新增 /etc/sysconfig…

nginx 的 rewrite 模块

ngxhttprewrite_module 模块用来使用正则表达式(PCRE)改变请求的 URI,返回重定向,并有条件地选择配置。 指令执行顺序 首先顺序执行 server 块中的 rewrite 模块指令,得到 rewrite 后的请求 URI 然后循环执行如下指令…

所有的Python库

库名称简介 Chardet字符编码探测器,可以自动检测文本、网页、xml的编码。 colorama主要用来给文本添加各种颜色,并且非常简单易用。 Prettytable主要用于在终端或浏览器端构建格式化的输出。 difflib,[Python]标准库,计算文本…

Oracle行转列语法总结大全

一、decode语法 SELECT deptno, nvl(SUM(decode(job, MANAGER, sal)), 0) s_MANAGER, nvl(SUM(decode(job, ANALYST, sal)), 0) s_ANALYST, nvl(SUM(decode(job, CLERK, sal)), 0) s_CLERK, nvl(SUM(decode(job, PRESIDENT, sal)), 0) s_PRESIDENT, …

Shell 各种符号 之 含义

#!&#xff1a;符号能够被内核识别成是一个脚本的开始&#xff0c;这一行必须位于脚本的首行 $0&#xff1a;当前脚本的名字 $#&#xff1a;输入<调用>参数(脚本或函数的位置参数) 的个数&#xff0c;如 NumArg$#&#xff1b;echo"\$#: $#;\$NumArg: $NumArg"…

Nginx的11个执行流程

1 Nginx简介 Web服务器市场份额 Nginx [engine x] 最初由 Lgor Sysoev 编写。根据 Netcraft 的数据&#xff0c;到2020年9月&#xff0c;Nginx 服务或代理了25.76&#xff05;站点&#xff0c;市场份额占到了约34.03&#xff05;。 Nginx 被广泛用作&#xff1a; HTTP服务器…

Nginx的执行阶段详解

在了解nginx的执行阶段前&#xff0c;先看一个例子 对echo不熟悉的&#xff0c;可以先看文章Nginx调试必备了解下echo扩展 回到上面这个例子&#xff0c;在server块中配置这样的location&#xff0c;你觉得输出是什么样子&#xff1f; 按照正常的逻辑&#xff0c;输出应该是32 …

Docker挂了,数据如何找回

docker在实际使用中&#xff0c;让运维人员诟病的&#xff0c;除了安全问题外&#xff0c;大概就是数据的问题了 很多人在初用docker的时候&#xff0c;很多时候都忘记或不知道docker中需要保留的数据需要挂载到宿主机文件夹到容器内部对应目录&#xff08;当然除了挂载宿主机目…

TCP总结

TCP这些东西&#xff0c;基本每个程序猿都或多或少是掌握的了。虽然感觉在实际开发中没有什么用武之处&#xff0c;但&#xff0c;面试他要问啊 而最近大家伙过完年&#xff0c;也都在准备春招&#xff0c;我也一样。阅读了一些okHttp源码之后&#xff0c;又屁颠屁颠地跑回来重…

Shell 中各种括号的作用

一、小括号&#xff0c;圆括号&#xff08;&#xff09; 1、单小括号 () ①命令组。括号中的命令将会新开一个子shell顺序执行&#xff0c;所以括号中的变量不能够被脚本余下的部分使用。括号中多个命令之间用分号隔开&#xff0c;最后一个命令可以没有分号&#xff0c;各命令和…

linux基线核查脚本

#!/bin/bash #version 2.0cat <<EOF ************************************************************************************* ***** linux基线检查脚本 ***** ************************************************************************************* *…

LDAP命令介绍---dsreplication

可以使用此实用程序来配置服务器之间的复制, 以使服务器数据保持同步。要正确进行复制, 必须先使用 enable 子命令启用复制, 然后再使用 initialize 子命令将一个服务器的内容初始化为另一个服务器的内容用法: dsreplication {子命令} {选项}可用子命令:disable对指定服务器中…

LDAP命令介绍---dsconfig

此实用程序可用于定义目录服务器的基本配置 用法: dsconfig {子命令} {选项} 获取子命令用法列表: --help-distribution 显示与 分发 相关的子命令 --help-general-configuration 显示与 一般配置 相关的子命令 --help-integration 显示与 集成 相关的子命令 --…

LDAP命令介绍---dsconfig子命令----help-distribution显示与分发相关的子命令

此实用程序可用于定义目录服务器的基本配置用法: dsconfig {子命令} {选项}可用子命令:create-distribution-algorithm创建分发算法create-distribution-partition创建分发分区create-workflow-element --type distribution创建分发工作流元素create-global-index创建全局索引…

LDAP命令介绍---ldappasswordmodify口令修改操作

此实用程序可用于在目录服务器中执行 LDAP 口令修改操作用法: ldappasswordmodify {选项}其中 {选项} 包括:-a, --authzID {authzID}应更改口令的用户条目的授权 ID -A, --provideDNForAuthzID将绑定 DN 用作口令修改操作的授权 ID -n, --newPassword {newPassword}为目标用户…

LDAP命令介绍---dstune

此实用程序可用于帮助您优化 OUD 目录服务器。 您可以选择自动或基于其他标准 (例如, 内存限制或服务器将包含的数据) 优化服务器用法: dstune {子命令} {选项}可用子命令:data-based使用描述目录服务器将包含的数据的信息优化服务器。使用 --ldifFile 可基于 LDIF 文件的内容…