开篇
容器的本质
容器技术,是一种沙盒技术, 这种技术就像集装箱一样,把你的应用装到里面去,因此应用与应用之间因为有了集装箱的存在,不会相互干扰。而且被装进集装箱的应用,也可以很方便地搬来搬去。
容器技术的核心功能,就是提供这么一个集装箱,一个被约束好边界和条件的进程。
容器,其实就是一种特殊的进程。
虚拟机(VM)和容器(Container)的区别
VM | Container |
---|---|
虚拟机的运行,需要Hypervisor为其创建虚拟硬件/固件,而且还需要搭建Guest OS才能运行用户的应用进程。这个虚拟机是真实存在的,无论用户的应用进程是否运行,都需要消耗和占用一定的资源来运行虚拟机。而且应用进程在虚拟机上面运行、调用资源的时候,无可避免地都要经过虚拟机的连接和处理,带来额外的性能损耗。
容器化后的用户应用,实际上还是一个进程,并不会有虚拟化带来的性能损耗。而且容器本身的隔离,是通过namespace
技术来实现的,资源的消耗和占用可以忽略不计。
容器的隔离和限制
对于Docker等大多数Linux容器来说,隔离是通过namespace技术来实现,而限制是通过cgroup技术来控制。
隔离
资源隔离。通过Linux namespace技术可以对全局系统资源进行封装和隔离,让容器内的进程只能看到自己namespace的相关资源,这样就和其他namespace的进程起到了隔离的作用。改变一个namespace里面的资源,只会影响同一个namespace里的进程,对其他namespace的进程没有影响。
在Linux namespace中,虽然能够隔离很多资源,包括性能资源、文件、设备、状态、配置等,但也有不能隔离的对象。最典型的是时间,当你修改容器里的时间时,同时会对宿主机的时间造成修改。
限制
Docker容器中的进程,虽然在Linux namespace技术的隔离下,各自之间的运行不受影响,但是 他们实际上还是宿主机上面的一个进程,消耗和占用着宿主机的资源。宿主机的资源是有限且公用的,如果不对这些进程进行资源的限制,这些进程可能会占用很多的系统资源,从而影响到其他进程的正常运行。
Linux cgroups技术是Linux内核中用来为进程限制资源调用的一个重要技术。Linux cgroups的全称是Linux Control Group, 它最主要的功能,就是限制一个进程能够使用的资源上限,包括内存、CPU、磁盘空间、网络带宽等。
容器的文件系统
为了让容器内部更像一个独立的系统,一般我们会把一整个操作系统的文件系统,挂载到容器的根目录/
下面,用来给容器内部的进程提供隔离后的执行环境。这个文件系统,就是容器镜像,也叫做rootfs.