Docker学习总结(二)—— 镜像,容器
1.Docker镜像
1.1相关概念:registry :用于保存Docker镜像,包括镜像层次结构和镜像元数据,类似于git仓库之类的实体。
repository:某个Docker镜像所有迭代版本的构成的镜像组。registry是repository的合集,repository是镜像的合集。
manifest:存在于registry中作为Docker镜像的元数据文件。镜像被pull到宿主机时,自动转化为本地的镜像配置文件。
image / layer:docker内部的image概念是用来存储一组镜像相关的元数据,包括镜像架构,默认配置等,包含所有镜像层信息的rootfs。layer是Docker用来管理镜像层的中间概念,因为单个镜像层可能被多个镜像使用,所以docker把layer和image的概念分开,layer存放了镜像层的diff_id,size,parent_id等内容。
Dockerfile:构建镜像时用到的定义文件。
1.2相关操作:build / pull / push / save / export / load
1.3镜像存储管理:Docker镜像设计上将镜像元数据和镜像文件的存储完全分开,Docker在管理镜像层元数据时采用的是从上至下repository,image,layer三个层次。因为docker以分层的形式存储镜像,因此repository和image这两类元数据没有物理上的镜像文件与之对应,而layer则存在物理上的镜像文件与之对应。
repository元数据:位置->/var/lib/docker/image/aufs(graph_driver)/repositories.json,存储了所有repository的名字,tag和对应的镜像ID

image元数据:位置->/var/lib/docker/image/aufs/imagedb/content/sha256/镜像ID,各种镜像相关信息

layer元数据: 位置->/var/lib/docker/image/aufs/layerdb/sha256,包括diff_id,parent,size等信息,其中diffid是通过镜像层内容用sha256算法计算得来。layerdb目录下还有一个mount目录,用于存储容器可读写层的相关信息。

1.4镜像实际文件存放:
docker的镜像管理和存储是完全隔离的,以aufs为例,进入/var/lib/docker下有三个文件夹,分别为diff/,layers/,mnt/。其中mnt为aufs的挂载目录,diff为实际的数据来源,包括只读层和可读写层,layers存放层依赖有关的层描述文件。mnt和layers最初都是空目录,文件数据在diff下,但随后创建容器时mnt和layers目录会慢慢更新。
容器创建过程中的层存储变化:容器创建时会随机生成容器读写层的mountID,并保存在image/aufs/layerdb/mounts/容器id/目录下 ->
在mnt和diff目录下创建以该容器层的mountID同名的子文件夹 ->
在layers目录下创建文件来记录该层依赖的其他镜像层 ->
GraphDriver将diff中容器依赖的所有镜像层目录挂载到mnt目录下,并会生成一个对应当前容器的以mountID-init格式命名的文件夹作为容器的最后一个只读层 ->
diff目录下的mountID命名的子目录作为容器的可读写层,也挂载到mnt目录下。
docker容器设计了mountID-init这一层来记录容器启动时根据系统环境和用户配置自动生成的内容,一般情况下,容器commit操作保存的镜像不会包含这一层内容。严格意义上来讲容器的文件系统有三层:可读写层 / init层 / 只读层。
docker ps -a即可看到容器短id,然后根据这个短id去 var/lib/docker/image/aufs/layerdb/mounts/短id.../ 这个路径下可以查看当前容器的init-id mount-id等。容器未启动时,在对应的mnt目录下的mountID文件夹(/var/lib/docker/aufs/mnt/[mountID]/)是空的,容器启动后,可以看到这个文件夹下挂载了对应的系统文件(/bin /home /proc等等)。如果用户在容器中对容器进行一些操作,这些操作都会被记录在这个文件夹中,当容器被停止时,mnt下对应的mountID目录被卸载,但diff下对应的mountID文件夹还存在,但只限于宿主机。因此如果我们用docker commit把容器提交成镜像时其实就是在diff目录下生成一个新的cacheID命名的文件夹存放最新的差异变化,这样一个新的镜像层就产生了,而原来的diff下以mountID为名的文件夹在容器被删除时也会对应的被删除。
Docker学习总结(二)—— 镜像,容器的更多相关文章
- docker学习笔记2--对镜像/容器的命令操作
		Docker启动一个Centos镜像 我们下载完成一个Centos镜像之后,开始启动 docker run -d -i -t <imageID> /bin/bash 这样就能启动一个一直停 ... 
- docker学习之二镜像创建
		继上一篇docker入门之后写一点使用的经验. 通过命令:docker run -it REPOSITORY或IMAGE ID 注:-it后面跟的字段可以通过下面指令获得 创建运行的容器,会进入一 ... 
- Docker学习(二): 镜像的使用与构建
		特别声明: 博文主要是学习过程中的知识整理,以便之后的查阅回顾.部分内容来源于网络(如有摘录未标注请指出).内容如有差错,也欢迎指正! =============系列文章============= 1 ... 
- docker学习笔记二:常用命令
		docker学习笔记二:常用命令 查看docker常用命令 docker --help 返回结果如下: 其中常用的命令如下: 1.image相关操作 展示所有的image: 删除image: rmi ... 
- Docker学习笔记二(linux下安装Docker)
		Docker学习笔记二(linux下安装Docker) 1.在线安装linux Docker 这种方式首先要保证linux 环境下可以上网,当然,小编是在自己的电脑上安装了虚拟机,在虚拟机上安装了,l ... 
- Docker学习(二)docker镜像操作
		上一篇:docker学习(一)在centos7上安装docker 列出所有docker镜像 docker images 拉取镜像 docker pull 镜像名 我这里一Tomact为例 首先在Doc ... 
- Docker学习笔记之镜像与容器
		0x00 概述 镜像和容器作为 Docker 里最基础的概念,我们很有必要了解 Docker 对它们的很多定义以及其他与它们有关的知识.在这一小节里,我们就专门针对镜像与容器两个概念展开,细致的梳理与 ... 
- Docker学习笔记二:Docker常用命令及提升拉取镜像的速度
		一.Docker命令: 1.docker images //命令用来查看docker中所包含的镜像信息 2.docker ps -a //命令用来查看docker中所包含所有容器信息(运行状 ... 
- Docker学习笔记:镜像、容器、数据卷
		核心概念 镜像:一个只读的模板,类似虚拟机的镜像. 容器:可以理解为镜像的一个运行实例.运行时类似于沙箱,多个容器互相独立. 仓库:存放镜像文件的地方. 镜像 命令表格 命令 解释 选项 docker ... 
- Docker学习(二)——Docker容器使用
		Docker容器使用 1.Docker客户端 命令docker可以查看到Docker客户端的所有命令选项. 命令docker command --help更深入的了解指定的Do ... 
随机推荐
- DOM 踩踩踩
			1.如果是想给一个DOM元素添加一个伪类,可以转换为 为这个元素添加一个类名,这个类名上面绑定一个伪类. 2.append一个元素,删除掉原来的元素再进行添加. 
- JVM运行时数据区和垃圾回收机制
			最近参考各种资料,尤其是<深入理解Java虚拟机 JVM高级特性和最佳实践>,大牛之作.把最近学习的Java虚拟机组成和垃圾回收机制总结一下. 你不会的都是新知识,学无止境,每天进步一点点 ... 
- Postfix邮件黑名单和白名单
			本文主要介绍如何用Postfix添加域名黑名单和白名单,用以处理垃圾邮件. 1.修改postfix主配置文件,增加限制语句 vim /etc/postfix/main.cf # 文末添加一行,限制往本 ... 
- 機器學習基石 机器学习基石(Machine Learning Foundations) 作业2      第10题  解答
			由于前面分享的几篇博客已经把其他题的解决方法给出了链接,而这道题并没有,于是这里分享一下: 原题: 这题说白了就是求一个二维平面上的数据用决策树来分开,这就是说平面上的点只能画横竖两个线就要把所有的点 ... 
- GitHub https链接中输入账户和密码
			/********************************************************************** * GitHub https链接中输入账户和密码 * 说 ... 
- Android:LinearLayout布局中Layout_weight的深刻理解
			首先看一下LinearLayout布局中Layout_weight属性的作用:它是用来分配属于空间的一个属性,你可以设置他的权重.很多人不知道剩余空间是个什么概念,下面我先来说说剩余空间. 看下面代码 ... 
- BZOJ1510 POI2006 Kra-The Disks 【模拟】
			BZOJ1510 POI2006 Kra-The Disks LINK 还是粘题面吧,但是图就算了 Description Johnny 在生日时收到了一件特殊的礼物,这件礼物由一个奇形怪状的管子和一 ... 
- IOS UIView 放大缩小
			/创建缩小了的视图myWeiBoImageVC = [[UIViewController alloc] init];myWeiBoImageVC.view.clipsToBounds = YES;my ... 
- flask第十九篇——模板【3】
			请关注微信公众号:自动化测试实战 今天我们继续模板的知识,现在我们增加字典的复杂度,这个时候在render_template第二个参数可以传**title,以后我们会用**context代替原来的ti ... 
- css animation动画
			css 动画: 动画是CSS3中具有颠覆性的特征之一,可通过设置多个节点来精确控制一个或一组动画,常用来实现复杂的动画效果. 必要元素: a.通过@keyframes指定动画序列:自动补间动画,确定两 ... 
