Docker是一种容器,什么叫容器?在软件开发中,我们经常碰到“这程序在我的电脑上明明没问题啊,怎么在客户的电脑上就有问题?”这是因为各个电脑的软件、硬件不一致。
有没有一种统一的、虚拟的软件硬件平台,在上面开发好软件后发给客户,客户就可以直接在这个平台上运行程序?有的,这就是容器。容器有很多种,Docker是其中比较好的。 跟VMware相比,Docker是一个轻量级的软件,运行速度快。
使用Docker前,需要了解2个概念:Image和container,即镜像、容器。镜像就是一个环境包,这个环境包可以移动到任意的Docker平台里运行。而容器就是镜像的实例,一个镜像可以启动多个容器。 简单地类比,映像就像一个Word软件,这是厂家发布的,你无法修改;容器就是你启动Word软件,可以启动多个Word软件,在每一个Word软件里编写不同的文档。
Docker的核心是“统一文件系统”(union file system),什么意思? 假设你有2个目录:lower和upper,它们可以合并成一个新目录merged,内容如下:
合并的原则是什么?upper目录优先级更高,可以覆盖lower目录,lower目录是只读的,upper目录是可读可写的。这个规则可以解析得更具体:
① 文件名及目录不相同,则 lower 及 upper 目录中的文件及目录按原结构都融入到 merged 目录中;
② 文件名相同,只显示 upper 层的文件: 如上图在 lower 和 upper 目录下及下层目录 dir_A 下都有 same.txt 文件,但在合并到 merged 目录时,则只显示 upper 的,而 lower 的隐藏。
③ 目录名相同, 对目录进行合并成一个目录: 如上图在 lower 及 upper 目录下都有 dir_A 目录,将目录及目录下的所有文件合并到 merged 的 dir_A 目录,目录内如有文件名相同,则同样只显示 upper 的,如上图中 dir_A 目录下的same.txt文件。
读文件时,upper目录中有该文件时就从upper目录读取;否则去lower目录读取。 新建、修改、删除文件时,只会影响到upper目录,lower目录是只读的不受影响。 在Docker中,镜像提供lower层的只读文件;容器提供upper层的可读可写文件,如下:
当我们启动一个容器时,就是在镜像提供的lower文件系统的基础上,创建一个可读可写的upper层文件系统。 我们可以启动多个容器,就是创建多个upper层文件系统,这些容器的upper层文件系统互不影响。