Docker的底层原理及分析
作者:三傻317
Docker底层原理
docker实际上类似于一种“进程隔离技术”,利用Linux系统的一些特性功能,将不同容器隔离开来,使其不受外界的影响。
docker使用的Linux特性功能主要有:
1、命名空间(Namespace):把不同容器的进程、网络、文件系统隔离开来
2、控制组(Cgroups):限制容器使用CPU、内存等资源
3、联合文件系统(UnionFS):支持镜像的分层构建
一、命名空间
命名空间可以将全局资源分为若干块,命名空间内部的进程无法看到其他命名空间的进程,利用这一特点,就可以做到容器的隔离。
命名空间有很多类型,docker主要使用的如下:
- 1、
PID命名空间:该命名空间的第一个进程的PID为1,其他的进程都挂在这个第一个进程下面,这样容器内部就无法看到宿主机进程 - 2、
NET命名空间:控制网络资源,每个容器都可以有独立的IP、路由表、端口号,然后由宿主机通过虚拟网卡把容器网络连到外面。值得注意的是,docker本身并没有硬件或者模拟硬件,docker与宿主机共用一个内核(特别地,docker容器中的网络协议栈是独立的,但是最终走宿主机的内核TCP/IP协议栈,网络并非完全共用) - 3、
IPC命名空间:控制进程间通信,如信号量等,以防与宿主机的IPC冲突 - 4、
UTS命名空间:控制主机名和域名,使每个容器都有自己的hostname - 5、
MNT命名空间:控制系统挂载点,容器内部能看到的根目录/实际上是宿主机的某个子目录 - 6、
USER命名空间:控制用户和权限,容器内的root用户可以映射为宿主机的普通用户
二、控制组
为了防止被隔离的容器吃光宿主机的资源,docker还利用了Linux提供的Cgroups来进行资源控制,如CPU,内存,磁盘I/O,网络等资源。
Cgroups实际上是一颗资源管理的层级树,每个Cgroup节点都能设置资源限制,进程加入某个Cgroup,就必须遵守对应的限制。
三、联合文件系统
UnionFS(Union File System,联合文件系统)是一种分层的文件系统。
它的特点是:
- 1、可以把多个目录(层)“联合”挂载在一起,对外呈现成一个目录。
- 2、上层可以覆盖下层的文件(像透明胶片叠加)。
- 3、支持写时复制(
Copy-On-Write,COW)。
为了保证docker拉取后镜像干净不被修改,镜像被拉取下来都是只读的层,运行容器时,会在镜像的最上层加上一层可写层,由于上层可以覆盖下层的特性,修改上层文件就能达到修改容器运行逻辑的目的,同时,保证了这个镜像内部不被修改;容器删除后,可写层会消失,镜像层保持不变 。
当需要修改可写层时,将需要修改的对应数据找到并复制到可写层,再进行修改,这就是写时复制。
四、数据卷挂载
通过学习联合文件系统我们知道,容器内部的文件系统是独立的,也是一次性的,每次容器重启后,原有的数据就会消失,对于需要数据持久化的程序,就需要使用数据卷技术。
数据卷实际上是容器与宿主机之间共享的一块目录/文件,它不受容器的生命周期影响,因此可以被用来持久化数据
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。
