概述

云计算的技术底座就是虚拟化,根据虚拟化的程度可以大致分为:

  • 全虚拟化:代表产品有vmware、virtualbox,这些种类的虚拟化,是在原有的操作系统之上通过软件完全模拟了cpu、内存、io这些硬件设备
  • 半虚拟化:代表技术为xen
  • 硬件辅助虚拟化:代表技术为kvm
  • 容器虚拟化:容器虚拟化采用了namespace做资源隔离(主要是cpu、内存、网络)、cgroup做资源的限制、联合文件系统来实现容器之间以及容器与宿主机之间的文件系统的隔离

详解

docker基本概念及架构

我们常说的docker是客户端的进程,docker是cs架构的应用程序,除了客户端和服务端之外,还有一个镜像仓库,下面是docker容器技术的整体架构:

如上图所示,容器的服务端运行着dockerd、containerd、container-shim、run的服务模块: dockerd:用于接受用户请求

下面我们介绍一下容器中的一些概念:

  • 镜像:镜像可以简单的认为是快照
  • 容器:容器是镜像的运行时
  • 仓库:仓库是用来存放镜像的服务器
  • docker:容器的客户端应用程序
  • dockerd:服务端用来接受客户端的请求,并返回响应到客户端的模块,可以将其认为是一个门面的功能,起到的主要是请求分发的作用
  • containerd:该模块是真正用来创建容器运行时环境的模块,并且会和仓库进行交互获取对应的镜像
  • container-shim:该模块的主要功能是提供了容器和containerd的垫片层,这样能够确保containerd在重启的过程中运行的容器不受任何影响
  • runc:容器的运行时环境
  • reopsitory:用来存放镜像的中央仓库,当然该仓库也可以自行搭建

核心实现技术原理

namespace

namespace是linux内核提供的能力,namespace对内核不同的资源进行分区,使不同的进程看到的是资源有所不同,这些资源包含进程ID、网络、存储等,docker基于namespace的技术实现了所有容器对宿主机内核的共享。当前linux提供了以下8种namespace,其中docker选择使用了前面6种namespace:

  • mount namespace:隔离不同的进程看到的挂载点,容器内(就是进程)只能够看到自己的挂载点,并且在容器内的挂载不会影响宿主机
  • pid namespace:该namespace使用来隔离进程的,在容器内部的主进程都是1号进程,不过容器进称在主机上则各有不同
  • UTS namespace:主要是用来隔离主机名称的,其允许不同的namespace使用不同的主机名
  • IPC namespace:ipc namespace是用来隔离进程间通信的,ipc namespace和pid namespace 结合可以实现同一个ipc namespace内不同pid的通信。可以使用ipcs命令进行验证
  • user namespace:是用来进行用户隔离的,通过该namespace的能力可以实现宿主机普通用户到该namespace的root用户的转换
  • net namespace:可以用来隔离网络信息,实现ip地址、端口号、网卡信息的隔离

当docker创建容器的时候,会创建以上6种namespace,并将docker进称加入到对应的namespace中,从而实现资源的隔离

以上namespace的能力都可以通过linux自带的工具unshare来模拟并实现出来。

cgroup

cgroup是linux提供的可以限制资源使用的能力,cgroup的实现依赖于subsyetem(子系统)、cgroup(控制组)、hierarchy(层级树)。

  • subsystem:子系统是一个内核组件,一个子系统代表了一类资源控制器,我们在容器中常见的子系统有内存子系统、cpu子系统,分别用于控制内存、cpu的分配
  • cgroup:代表了一组进程和带有参数的子系统之间的关联关系
  • hierarchy: 控制组的继承树,保证了控制组之间的继承关系,这样的好处是可以不需要重复定义资源的限制

可以使用mount -t cgroup查看linux操作系统下挂载的子系统的信息。

在cgroup下面创建一个文件夹,默认会初始化的创建一些文件,其中task限制了能够使用该资源的进程id: docker在创建容器的时候指定的资源,会在docker目录下创建对应的容器,并将资源的限制情况写入到文件,当容器启动的时候,会根据写入的资源限制文件设置对应的cgroup资源使用文件,从而达到对容器的资源的限制

联合文件系统

联合文件系统是docker使用的另外一项技术,联合文件系统是通过分层的叠加的方式实现的文件系统,其中每一层都是一个快照,对应的文件也是只读的,容器在运行时要操作某个文件是将只读的文件通过写时复制的方式拷贝到最上层,形成可读写层

容器编排技术

常见的容器的编排技术有docker compose、swarm、k8s。

总结

容器的监控、网络有时间再分析。