深入剖析kubernetes

05 白话容器基础(一):从进程说开去

  • 进程:程序运行起来后的计算机执行环境的总和
  • 容器技术的核心功能,就是通过约束和修改进程的动态表现,从而为其创造出一个”边界“
  • 对于Docker等大多数Linux容器来说,两大基础技术:
    • Cgroups技术,用来制造约束的主要手段
    • Namespace技术,用来修改进程视图的主要方法。对被隔离的应用的进程空间做手脚,使得这些进程只能看到重新计算过的进程编号
  • 除了 PID Namespace,Linux操作系统还提供了Mount,UTS,IPC,Network和User这些Namespace,用来对各种不同的进程上下文进行”障眼法“操作,这就是Linux容器最基本的实现原理
  • 所以说,容器,其实是一种特殊的进程而已

06 白话容器基础(二):隔离与限制

  • Namespace技术实际上修改了应用进程看待整个计算机”视图“,即它的”视线“被操作系统做了限制,只能”看到“某些指定的内容,但对于宿主机来说,这些被”隔离“了的进程跟其他进程并没有太大区别
  • Linux Cgroups就是Linux内核中用来为进程设置资源限制的一个主要功能
  • Linux Cgroups,Linux Control Group,最主要的作用,就是限制一个进程组能够使用的资源上限,包括CPU,内存,磁盘,网络带宽等等
  • 容器技术中非常重要的概念,即:容器是一个”单进程“模型
  • Namespace和Cgroups都有很多不完善的地方

07 白话容器基础(三):深入理解容器镜像

  • Mount Namespace修改的,是容器进程对文件“挂载点”的认知
  • Mount Namespace跟其他Namespace的使用略有不同的地方:它对容器进程视图的改变,一定是伴随着挂载操作(mount)才能生效
  • chroot,change root file system,改变进程的根目录到指定的位置
  • Mount Namespace正是基于对chroot的不断改良才被发明出来的,它也是Linux操作系统里的第一个Namespace
  • 挂载在容器根目录上,用来为容器进程提供隔离后执行环境的文件系统,就是所谓的“容器镜像”,它还有一个更为专业的名字,叫做,rootfs(根文件系统)
  • rootfs,只是一个操作系统所包含的文件,配置和目录,并不包括操作系统内核,在Linux操作系统中,这两部分是分开存放的,操作系统只有在开机启动时才会加载指定版本的内核镜像
  • 正是由于rootfs的存在,容器才有了一个被反复宣传至今的重要特性:一致性
  • 由于rootfs里打包的不只是应用,而是整个操作系统的文件和目录,也就意味着,应用以及它运行需要的所有依赖,都被封装在了一起
  • 对一个应用来说,操作系统本身才是它运行所需要的最完整的”依赖库“
  • 容器的rootfs由三部分组成:
    • 第一部分,只读层。这些层,都以增量的方式分别包含了操作系统的一部分
    • 第二部分,可读写层。
    • 第三部分,Init层。Docker项目单独生成的一个内部层,专门用来存放hosts,resolv.conf等信息

08 白话容器基础(四):重新认识Docker容器

  • 应用容器化的第一步,是制作容器镜像
  • Dockerfile中的每个原语执行后,都会生成一个对应的镜像层
  • Volumn机制,允许将宿主主机上指定的目录或者文件挂载到容器里面进行读取和修改操作