Docker使容器隔离原理

157 阅读3分钟

「这是我参与11月更文挑战的第14天,活动详情查看:2021最后一次更文挑战

容器化技术现在应用的十分普遍,容器其实是一种沙盒技术,里面的东西是一个整体,我们不必在意里面是什么东西,哪里需要就放到哪里就好。容器化技术使我们脱身于繁琐的环境安装、配置等操作。

今天我们说一下容器化技术的代表之一Docker,它是如何使容器隔离的。

Docker 和虚拟机比较

大家应该都使用过虚拟机,我们想运行任何东西,首先都需要运行一个独立的操作系统,不管是Windows、还是Linux。使用系统的镜像安装好之后,才可以运行你需要程序。这样就可以和原系统隔离开。

但是如果你想运行多个程序,但是又要各自独立呢?就需要把上面的操作重复多次,在不考虑程序大小时,单个系统镜像占用的空间就很大,另外安装操作比较繁琐。

从表面上看,Docker的容器内的系统是独立的,安装的程序也是独立的。那么Docker也是每个容器内安装了单独的系统镜像吗?如果是的话,那么为什么Docker容器占用的空间很小呢?Docker只需要下载镜像,启动容器就能使用,操作上比虚拟机更容易呢?

Linux Namespace 技术

我们都知道运行一段程序,都需要新建一个进程,在这个进程里面,运行着计算各种数据,执行各种指令。

其实Docker在创建一个容器的时候,也是这样新建一个进程,和其他正常的进程没什么两样。只不过通过Namespace机制,在创建进程时通过一个可选参数,使进程内的信息发生变化。使容器的进程PID 为1,超级父进程,它可以管理其他的进程。在进程内,变成了一个完整独立的系统。在进程外,容器的进程和其他的进程是一样的,只不过它的进程PID不是 1。

Linux 通过使用Namespace机制,改变容器的进程空间,使其看起来是一个独立的系统,但实际上还是依托在原系统上。

所以Docker的每个容器内并不是安装了单独的系统镜像,容器只是原系统上的一个进程,所以空间并不会很大,并且只需要执行几个命令就可以运行起来。使用的系统资源也更少。

是不是很简单,容器内的程序是否知道自己被“欺骗”了呢。

Linux Cgroup 技术

虽然Docker通过Namespace机制使容器进程与其他进程隔离,但是容器本质上是原系统内的一个进程,所以就会使用和其他进程相同的系统内核,CPU,内存等,也会和其他进程发生竞争。我们需要避免这种情况发生。

我们需要规定每个容器使用的资源,Docker通过Linux Cgroup机制为每个容器的进程内创建一些文件,里面规定了该容器能够使用多少系统资源。在创建容器时,通过docker run 添加参数设置就可以。这样就避免了容器对系统资源的使用。

总结

Docker内容器其实是一个进程。Docker做到的是系统内进程隔离。