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学习总结(二)—— 镜像,容器的更多相关文章

  1. docker学习笔记2--对镜像/容器的命令操作

    Docker启动一个Centos镜像 我们下载完成一个Centos镜像之后,开始启动 docker run -d -i -t <imageID> /bin/bash 这样就能启动一个一直停 ...

  2. docker学习之二镜像创建

    继上一篇docker入门之后写一点使用的经验. 通过命令:docker run -it REPOSITORY或IMAGE ID   注:-it后面跟的字段可以通过下面指令获得 创建运行的容器,会进入一 ...

  3. Docker学习(二): 镜像的使用与构建

    特别声明: 博文主要是学习过程中的知识整理,以便之后的查阅回顾.部分内容来源于网络(如有摘录未标注请指出).内容如有差错,也欢迎指正! =============系列文章============= 1 ...

  4. docker学习笔记二:常用命令

    docker学习笔记二:常用命令 查看docker常用命令 docker --help 返回结果如下: 其中常用的命令如下: 1.image相关操作 展示所有的image: 删除image: rmi ...

  5. Docker学习笔记二(linux下安装Docker)

    Docker学习笔记二(linux下安装Docker) 1.在线安装linux Docker 这种方式首先要保证linux 环境下可以上网,当然,小编是在自己的电脑上安装了虚拟机,在虚拟机上安装了,l ...

  6. Docker学习(二)docker镜像操作

    上一篇:docker学习(一)在centos7上安装docker 列出所有docker镜像 docker images 拉取镜像 docker pull 镜像名 我这里一Tomact为例 首先在Doc ...

  7. Docker学习笔记之镜像与容器

    0x00 概述 镜像和容器作为 Docker 里最基础的概念,我们很有必要了解 Docker 对它们的很多定义以及其他与它们有关的知识.在这一小节里,我们就专门针对镜像与容器两个概念展开,细致的梳理与 ...

  8. Docker学习笔记二:Docker常用命令及提升拉取镜像的速度

    一.Docker命令: 1.docker images   //命令用来查看docker中所包含的镜像信息 2.docker ps -a    //命令用来查看docker中所包含所有容器信息(运行状 ...

  9. Docker学习笔记:镜像、容器、数据卷

    核心概念 镜像:一个只读的模板,类似虚拟机的镜像. 容器:可以理解为镜像的一个运行实例.运行时类似于沙箱,多个容器互相独立. 仓库:存放镜像文件的地方. 镜像 命令表格 命令 解释 选项 docker ...

  10. Docker学习(二)——Docker容器使用

    Docker容器使用 1.Docker客户端       命令docker可以查看到Docker客户端的所有命令选项.       命令docker command --help更深入的了解指定的Do ...

随机推荐

  1. defer async 区别

    链接 <script src="script.js"></script> 没有 defer 或 async,浏览器会立即加载并执行指定的脚本,“立即”指的是 ...

  2. iOS 阶段学习第三天笔记(运算符)

    iOS学习(C语言)知识点整理笔记 1.运算符 一.算术运算符 1)表达式由变量.常量.运算符构成,有确定的类型和值 2)算术运算符包括: +(加),-(减),*(乘),/(除),%(模) 3)算术运 ...

  3. React之组件

    鉴于个人的开发习惯,我将react默认的文件结构作了如下修改: 我们的项目是写在src目录下的. 那么,接下来,继续看react的组件式如何编写的吧. 一.react的组件 不同于vue的每个组件都是 ...

  4. 我也说说Emacs吧(3) - 文件基本操作

    Spacemacs文件基本操作 有了前两讲的积累,我们知道了: 1. 我们既要学习emacs的操作,也要学习vi的操作 2. emacs是一个可扩展的平台,我们并不是从头配置,而是使用一套成熟的集成方 ...

  5. java入门学习(3)—循环,选择,基础算法,API概念

    1.顺序结构:也就是顺着程序的前后关系,依次执行.2.选择分支:利用if..else , / switch(){case [ 这个必须是常量]:}; / if..else if….. ….else.. ...

  6. linux下利用inode删除指定文件文件

    本文主要介绍使用inode删除异常文件名的文件的方法,供大家参考: 在Linux中,有时候会遇到文件名是乱码或者是某些特殊中文的文件,这时候通过文件名就很难删除. 同时,对于linux中的任何一个文件 ...

  7. mysql安装优化

    安装centos7 安装mysql解决方案1 安装mariadb解决方案2 官网下载安装mysql-server时区批量配置编码远程连接my.cnf简版的参数说明核心配置参数升级版mysql存储引擎M ...

  8. enum枚举类型的定义

    enum枚举类型的定义方式与某种用法 #include <iostream> using namespace std; int main() { enum TOT{ zero, one, ...

  9. Redis 列表 List 主要操作函数

    /** * redis 列表 List Redis列表是简单的字符串列表,按照插入顺序排序.你可以添加一个元素导列表的头部(左边)或者尾部(右边) */ //lpush 新增一个列,多个列可以用空格隔 ...

  10. Python tarfile模块解压报错 invalid mode ('wb') or filename

    问题原因 在使用tarfile模块解压一份Linux服务器上的打包文件时, 出现了错误提示: IOError: [Errno 22] invalid mode ('wb') or filename. ...