我们在上一章,讲了虚拟化,虚拟化是把硬件虚拟化,然后创建出来的虚拟机完全隔离,而Docker则是软件(内核)虚拟化,他的隔离性会低于虚拟机。我们将通过3-4周来讲解Docker相关内容,由于涉及到内容较多,就不一一列出来具体的细节,主要从以下几个方面来讲解:
Docker基本情况
Docker基本命令
Dockerfile
Docker镜像
Docker仓库
Docker原理(本小节属于)
Docker网络&存储&日志
Docker-Compose
Docker番外篇
我们前面讲解中,经常用一个镜像创建多个容器,他们之间的文件系统有什么关系呢?这个就是我们要讲的联合文件系统(UnionFS)。
联合文件系统,可以把多个目录(也叫分支)内容联合挂载到同一个目录下,而目录的物理位置是分开的。UnionFS允许只读和可读写目录并存,就是说可同时删除和增加内容。
把 ubuntu18.04 这个基础镜像的文件放在一个目录 ubuntu18.04/ 下,容器自己额外的程序文件 app_1_bin 放在 app_1/ 目录下。然后,我们把这两个目录挂载到 container_1/ 这个目录下,作为容器 1 看到的文件系统。
同样,对于容器 2,就可以把 ubuntu18.04/ 和 app_2/ 两个目录一起挂载到 container_2 的目录下。这个就是联系文件系统,其实和kvm的快照有点类似。
下面我们介绍几个Docker里面的概念。
Lowerdir(只读层)
被 mount 两层目录中底下的这层(lowerdir),就是上图ubuntu18.04,可以被多个容器使用,也就是镜像,他是只读的。
Uppder(可读写层)
它是被 mount 两层目录中上面的这层 (upperdir)。在 OverlayFS 中,如果有文件的创建,修改,删除操作,那么都会在这一层反映出来,它是可读可写的。就是上图的app_1。
Merged(表示层/用户看到的层)
它是挂载点(mount point)目录,也是用户看到的目录,用户的实际文件操作在这里进行。这里就是上图的container_1, 也就是容器内部看到的所有数据。
work
存放临时文件的目录,OverlayFS 中如果有文件修改,就会在中间过程中临时存放文件到这里。重点上前面3层,需要理解到。
思考一个问题,如果uppder里面的内容和lowerdir冲突的时候会出现什么情况呢?
实际显示的uppder目录下的内容。
这里的就是容器的所有挂载信息,但是每个容器还有3个特殊文件,并不包含在这里,或者说另外3个文件+以上文件系统就是一个完整的容器的rootfs。
/etc/resolv.conf
/etc/hostname
/etc/hosts
#我俗称的 dns,主机名,hosts
以上目录就是我们前面讲过的Docker-详细信息和目录介绍下面专门存储容器的对应的目录,当然这个目录下还有其他容器相关的信息。
当多个容器基于同一个镜像创建,那么他们的Lowerdir则是一样的,上图由于层数太多,不方便比对,下面这个层数较少可以比较明显的看出来。
其实这里在概念在实际运维中遇到的问题就是du统计使用量大于整个磁盘空间,比如du统计1.5T,但是整个磁盘才1T。这里出现的原因就是du在统计的时候Uppder和Merged这2个目录会被统计两次,如果Uppder内容比较大就会出现上面的问题,如果要规避这个问题就可以使用-x参数。
-x, --one-file-system skip directories on different file systems