Docker基础原理

docker是什么?

粗糙点说Docker是容器的一种

精确点说Docker是一种利用Linux中的核心分离机制(Cgroup,Namespace,Union FS)来创建容器的轻量级虚拟化技术。

 

基本原理

Docker利用Linux中的核心分离机制,例如Cgroups,以及linux的核心Namespace(名字空间)来创建独立的容器。一句话概括起来:Docker就是利用Namespace做资源隔离,用Cgroup做资源限制,利用Union FS做容器文件系统的轻量级虚拟化技术。Docker容器的本质还是一个直接运行在宿主主机上面的特殊进程,看到的文件系统是隔离后的,但是操作系统内核是共享宿主机OS,所以说Docker是轻量级的虚拟化技术。

Namespace

Linux Namespace是Linux提供的一种内核级别环境隔离的方法,使其中的进程好像拥有独立的操作系统环境。

Cgroup

上面已经讲过Docker容器运行起来是一个直接运行在宿主主机上面的进程,那么如何限定每个容器最多消耗多少CPU资源呢?如果一个容器疯狂的消耗资源岂不是会影响同一宿主机上面其他的容器?所以Docker就需要一个限制容器能够使用资源上限的机制,那就是Linux Cgroup技术。Linux Cgroup全称是Linux Control Group。它最主要的作用是限制一个进程组能够使用的资源上限,包括CPU,MEM,DISK,NET等。

Union FS

每个容器运行起来后都是一个独立的文件系统,例如Ubuntu镜像的容器能够看到Ubuntu的文件系统,Centos能够看到Centos的文件系统, 不是说容器是运行在宿主机上面的进程吗,为什么能够看到和宿主机不一样的文件系统呢?那就要归功于Union FS,全称是Union File System,联合文件系统。将多个不同位置的目录挂载到同一个目录,将相同的部分合并。Docker利用这种联合挂载能力,将容器里面的多层内容呈现为统一的rootfs(根文件系统),即root用户能够看到的根目录底下所有的目录文件。rootfs打包了整个操作系统的文件和目录,是应用运行时所需要的最完整的“依赖库”,也就是我们说的“镜像”。

镜像分为基础镜像只读层、init层、读写层

init层存放的是/etc/hostname, /etc/resolv.conf等,docker commit的时候不提交

读写层一开始的时候为空,用户如果修改了文件系统,比如说增删了文件,docker commit的时候就会提交这一层的信息。

 

Docker VS 虚拟机

 

 

 

 

从上面这幅图就可以看出,虚拟机是正儿八经存在的一层硬件虚拟层,模拟出了运行一个操作系统所需的各种硬件,例如CPU,MEM, IO等设备。然后在虚拟的硬件上安装了一个新的操作系统Guest OS。所以在Windows宿主机上面可以跑Linux主机。因为多了一层虚拟,所以虚拟机的性能消耗肯定会大些。

Docker容器是由Docker Deamon(Docker Deamon是运行在宿主机上面的一个后台进程,负责拉起和设置容器)拉起的一个个进程,通过Docker Deamon设置完Namespace和Cgroup之后,本质上就是一个运行在宿主主机上面的进程,因为没有一层Guest OS,所以Docker就轻量级很多。但是有利就有弊,由于Docker 容器直接运行在宿主机上面,安全性就相对较差些,另外也没有办法在Windows上面运行Linux的容器,如果容器里面的应用对特定系统内核有要求也不能运行在不满足要求的宿主机上面。

 

posted @ 2021-01-11 00:25  下山打老虎i  阅读(143)  评论(0)    收藏  举报