容器技术

以前的虚拟机技术,可以在一台物理机器上虚拟出多个机器,每个机器有自己的操作系统,所以在每个虚拟机上可以运行自己的程序,但软件技术慢慢发展,一个软件的component变得越来越多也越来越小,虚拟机技术就会使得对于硬件的资源过度浪费,并且加大系统管理员的工作量,所以发展出了容器技术。

容器技术允许你在同一台主机上运行多个service,而且每个service可以有不同的env,并且可以减少开销,且每个进程都是分离的,就像是这个进程是唯一运行在这个机器和这个操作系统上的进程。

因为每个虚拟机要运行它自己的系统进程,所以要消耗更多的计算资源,而容器技术就减小了这部分开销。虚拟机技术的唯一好处是每个vm可以run its own linux kernel。而容器技术是所有容器使用同一个kernel,这会暴露出安全风险。

容器技术_第1张图片容器技术_第2张图片

实现容器技术的进程分离是通过namespace和linux control groups,namespace使得每个进程只能看到它自己的系统(文件,进程,网络接口,主机名等),linux control groups可以限制进程所消费的系统资源(cpu,memory,网络带宽,等)。由于有多种namespace的存在,一个进程并不只属于一个namespace,而是属于每一种namespace中的一个。

namespace有如下几种:mount,process Id,network,inter-process communication,UTS,User ID.

每一种namespace用于分离一个确定的资源group,比如UTS namespace决定了一个进程运行在哪一个host name和domain name,通过给一对进程指定不同的UTS namespace,他们就可以看到不同的local hostnames,换言之,这两个进程会表现的像是运行在两个不同的机器上(只关注于主机名)。

linux kernel中用于限制进程(或者a group of processes)使用资源的feature叫做cgroups。

 

容器中可以使用镜像(可以将你的application和env打包进去的一个东西)来达到在不同的环境(任何linux环境或者是自己的开发环境)都能执行同一个程序的目的。容器中的镜像不同于vm中的,容器中的镜像由layers组成,且多个镜像可以共享重用同一个layers。docker 的工作原理如下:

容器技术_第3张图片

 

 

两个容器由两个镜像创建,若这两个镜像是基于同样的layers,就可以读取同样的文件,但其中一个重写了这些文件中的内容,另一个看不到这个改变,所以即使他们共享同样的文件,但他们都是isolated,这里的重写只会重写文件的副本。,容器的镜像是只读的。

 

若一个application对于linux kernel有特殊的要求,这个application可能不能在不同的机器中运行。对于机器的hardware architecture有要求的也一样(比如要x86的)。

 

docker并不提供进程isolation,容器之间的isolation是通过linux kernel level中的kernel features比如linux namespace和cgroups等实现的,docker只是让它的使用变得更简单。

 

 

 

你可能感兴趣的:(k8s知识点整理)