【Docker】(2)---仓库、镜像、容器
学习Docker,我觉得首先要了解的是仓库、镜像、容器到底是什么,他们有什么区别。
一、通俗理解
1、Docker 镜像 (images)
容器运行时的只读模板,操作系统+软件运行环境+用户程序
。
例如:一个镜像可以完全包含了Ubuntu操作系统环境,可以把它称作一个Ubuntu镜像。镜像也可以安装了Apache应用程序(或其他软件),可以把它称为一个Apache镜像。
我们可以大致的把镜像比喻成一个java类:
class User{
private String name;
private int age;
}
2、Docker 容器 (containers)
容器是从镜像创建的应用运行实例,可以将其启动、开始、停止、删除,而这些容器都是相互隔离、互不可见的
。Docker利用容器来运行和隔离应用。
我们可以大致理解容器是类实例出的对象:
User user = new User()
3、Docker 仓库(registeries)
Docker仓库(Repository)用来保存镜像,类似与代码仓库,是Docker集中存放镜像文件的场所
。
Docker 仓库有公有和私有仓库,好比Maven的中央仓库和本地私服。
总结
镜像、容器、仓库这三部分组成了Docker的整个生命周期,如下图所示,容器是由镜像实例化而来的,这和我们学习的面向对象的概念十分相似,我们可以把镜像想象成类,把容器想象成类经过实例化后的对象,这样就非常好理解镜像和容器的关系。
二、深层次理解
要点:容器的定义和镜像几乎一模一样,也是一堆层的统一视角,唯一区别在于容器的最上面那一层是可读可写的
。
要点:容器 = 镜像 + 读写层
。并且容器的定义并没有提及是否要运行容器。
1、镜像
镜像就是一堆只读层(read-only layer)的统一视角
,也许这个定义有些难以理解,下面的这张图能够帮助读者理解镜像的定义。
从左边我们看到了多个只读层,它们重叠在一起。除了最下面一层,其它层都会有一个指针指向下一层。这些层是Docker内部的实现细节,并且能够在主机(译者注:运行Docker的机器)的文件系统上访问到。统一文件系统(union file system)技术能够将不同的层整合成一个文件系统,为这些层提供了一个统一的视角,这样就隐藏了多层的存在,在用户的角度看来,只存在一个文件系统。
2、容器
容器(container)的定义和镜像(image)几乎一模一样,也是一堆层的统一视角,唯一区别在于容器的最上面那一层是可读可写的。
需要注意:容器的定义并没有提及容器是否在运行
。
3、运行态容器
一个运行态容器被定义为一个可读写的统一文件系统加上隔离的进程空间和包含其中的进程
。下面这张图片展示了一个运行中的容器。
一个容器中的进程可能会对文件进行修改、删除、创建,这些改变都将作用于可读写层(read-write layer)。下面这张图展示了这个行为。
参考
如果一个人充满快乐,正面的思想,那么好的人事物就会和他共鸣,而且被他吸引过来。同样,一个人老带悲伤,倒霉的事情也会跟过来。
——在自己心情低落的时候,告诫自己不要把负能量带给别人。(大校4)