过一遍前4章的docker,然后仔细看后面5章的docker原理。
需要达到基本了解docker的原理。
运行在进程的容器
每创建一个容器,相当于创建一个进程,使用Linux的Namespace机制来创建进程。这个进程拥有一个全新的进程空间,它在这个空间里面的进程ID是1,但是并不影响宿主机的真实进程ID,宿主机的真实进程ID还是原来的值并不是1,这样就产生了一个隔离环境。
与虚拟机相比
与传统虚拟机模式对比,容器少去了虚拟化和客户机两层,相对于虚拟机减少指令调用拦截处理过程,减少指令处理性能损耗。并且容器并不是运行在docker层上的,而是容器跟docker处于同一层的同层关系,因为容器是通过系统创建的一个特殊进程,而运行的docker也是一个进程。
共享客户机操作系统内核
但是由于容器只是一个通过Namespace创建的特殊进程,共用宿主机的操作系统内核,并不是虚拟出来的系统,因此会产生隔离不彻底的问题,某些在容器的操作将会同步影响宿主机系统。
同时因为是共享宿主机操作系统内核,将不能在低版本的Linux宿主机上运行高版本的Linux容器。
对容器做资源限制
由于容器是一个特殊进程,它跟宿主机其他进程处于平等关系,它们可以互相争夺系统资源,甚至有可能容器把系统资源都抢占完,因此需要对容器作出『限制』处理。
此时就需要引入Linux Cgroups(Linux Control Group)来对进程做资源限制。例如对CPU时间分配限制(100ms内只能使用20ms的CPU时间)。
拥有完整操作系统文件
每个容器都拥有着一个完整的操作系统的文件系统。挂载在容器根目录、为容器提供隔离后执行环境的文件系统就是『容器镜像』,把它称为rootfs(根文件系统)。拥有一个完整的操作系统的文件系统,可以让本地环境和服务器环境保持的一致性。
分层结构的容器镜像
使用增量的方法去修改、制作容器镜像,而不是每修改一次就生产出一个容器镜像。制作镜像的每一步操作都产生一个层(增量rootfs),这种理念叫做『联合文件系统(Union File System)』。
联合文件系统(Union File System)主要是将多个不同位置的目录联合挂载(union mount)到同一个目录下,如果有相同的文件名,其内容将被合并。
如果在挂载结果目录对文件作出修改,其修改也会在原始挂载目录生效。