这是voidAlex原创的第十三篇博文。

镜像

Docker镜像(Image)是一个特殊的文件系统,里面包含了容器运行时所需要的程序、库、资源、配置等文件和一些为运行时准备的配置参数,如匿名卷、环境变量、用户等。之所以说他特殊是因为它不会包含任何动态数据,其内容在构建之后也不会被改变。镜像可以是一个完整是操作系统,可以是一个数据库,可以是一个服务器,甚至可以只是一个WEB应用。

Docker中的镜像并非是一个像ISO文件那样的打包文件,镜像只是一个虚拟的概念,实际体现并非由一个文件组成,而是由一组文件组成,或者说由多层文件联合组成。镜像在构建时,会一层一层构建,前一层是后一层的基础。每一层构建完就不会发生改变,后一层上的任何改变只是发生在自己这一层。分层存储的特征使得镜像的复用、定制变得更为容易。

容器

容器(Container)的实质是进程,它是一个轻量级的沙箱,来隔离和运行应用。与直接在宿主机上执行的进程不同,容器的进程运行于自己独立的命名空间中。因此它可以拥有自己的进程空间、文件系统、网络空间、用户权限。容器内的进程运行在一个沙箱中,使用起来就好像一个独立于宿主的操作系统下操作一样。这种特性使得容器封装的应用运行更加安全。

容器也使用分层存储。每个容器运行时都会以镜像为基础层,在其上创建一个当前容器的存储层。存储层的生命周期和容器一样,容器消亡时,容器存储层也会消亡。

可以用面向对象程序设计中类和实例的关系来理解镜像和容器的关系。类和镜像都是静态的定义,容器和实例是运行时的实体,它们都可以被创建、删除,删除时,它们的数据也会随之消亡。

容器所有的文件写入操作,都应该使用数据卷或者绑定宿主目录。数据卷的生命周期独立于容器,容器消亡,数据卷不会消亡。

仓库

仓库(Repository)类似于代码仓库,用来集中存储、分发镜像。根据所存储的镜像公开分享与否,仓库可以分为公开仓库和私有仓库。