容器笔记:容器大事记

容器的历史进程:

第一阶段: AWS、 OpenStack 等虚拟机的 PaaS 用法,需要使用脚本或者手动命令操作的方式,将应用从本地部署到云端;

第一阶段产生的问题:云端虚拟机与本地环境不一致,需要在云端做繁琐且无章可循的操作,比如运行依赖环境的安装、配置的调整等,使得云端能够与本地环境一致,从而运行应用;

第二阶段:Cloud Foundry 的 PaaS 项目兴起,它提供了一套核心组件能够实现应用的打包和分发;由于需要在一个虚拟机上启动很多个来自不同用户的应用,Cloud Foundry 调用了操作系统的 Cgroups 和 Namespace 机制,为每个应用创建了一个单独的沙盒隔离环境,然后应用在沙盒中启动,这使得虚拟机中的应用互不干扰、且能够批量、自动运行;

而这个过程中,调用系统的 Cgroups 和 Namespace 机制,所创建的沙盒隔离环境,就是所谓的“容器”;

第二阶段产生的问题:虽然比第一阶段有所改善,但它需为每种环境、框架、应用维护一个包,且部署应用时可能还会有问题,需要做大量修改及调整配置;

第三阶段:Docker 容器和镜像的兴起,当时的 Docker 项目实际和 Cloud Foundry 类似,同样采用了系统的 Cgroups 和 Namespace 机制实现沙盒;但不同的是,Docker 创新的引入了镜像的概念,并根本性的解决的部署打包的问题;

Docker 镜像提供了一种非常便利的打包机制。这种机制直接打包了应用运行所需要的整个操作系统,从而保证了本地环境和云端环境的高度一致,避免了用户通过“试错”来匹配两种不同运行环境之间差异的痛苦过程。

第四阶段: PaaS 领域开源基础设施平台 Kubernetes 的兴起;它主要关注于“容器编排”


当程序被执行时,它就会从磁盘上的一个二进制文件,变成计算机内存中的数据、寄存器里的值、堆栈中的指令、被打开的文件,以及各种设备的状态信息的一个集合;
像这样一个程序运起来后的计算机执行环境的总和,即被称为“进程”;

  • 程序的静态表现,即磁盘上的二进制文件;
  • 程序的动态表现,即在运行时计算机中数据和状态的总和;

容器技术的核心功能,就是通过约束和修改进程的动态表现,从而为其创造一个“边界”;

对于 Docker 等大多数 Linux 容器来说,Cgroups 技术是用来制造约束的主要手段,而Namespace 技术则是用来修改进程视图的主要方法。

虚拟机技术与容器技术

虚拟机技术-优点:虚拟机与宿主机隔离彻底,环境高度独立,安全性高;
虚拟机技术-缺点:本身占用内存资源,与宿主机调用时会被虚拟化软件拦截并处理,此过程会对计算、网络、磁盘I/O产生性能消耗;

容器技术-优点:轻量化、节省资源、与宿主机调用无性能消耗;
容器技术-缺点:隔离不彻底,攻击面比虚拟机大,由于容器只是运行在宿主机上的特殊进程,故容器间使用的是同一个宿主机操作系统的内核,意味着低版本宿主机不能运行高版本容器,windows上不能运行linux容器(除非借助Linux虚拟机);此外,linux内核的很多资源及对象不能 Namespace 化,比如时间;


Linux Namespace 可以对操作系统中的 PID、Mount、UTS、IPC、Network、User 等的各种不同的进程上下文进行“障眼法”操作;

操作 Namespace 的方法是调用 linux 创建进程的函数 clone();

Linux Cgroups 就是 Linux 内核中用来为进程设置资源限制的一个重要功能,它主要的作用是可以限制一个进程组能够使用的资源上限,包括 CPU、内存、磁盘、网络带宽等;

操作 Cgroups 的方法既是在 /sys/fs/cgroup/ 目录下创建一个子系统目录,然后修改对应的资源限制文件;

容器是一个“单进程”模型。

容器与应用是同生命周期的,不会存在容器正常运行,但内部应用早已挂掉的情况;

Mount Namespace 用来隔离文件系统的挂载点,使得进程只能看到自己的 mount namespace 中的文件系统挂载点;
它对容器进程视图的改变,一定是伴随着挂载操作(mount)才能生效,若单单仅开启 Mount Namespace,则新创建的容器会直接继承宿主机的各个挂载点;

ROOTFS:
rootfs只是一个操作系统所包含的文件、配置和目录,并不包括操作系统内核。
由于rootfs里打包的并不只是应用,而是整个操作系统的文件和目录,这就意味着,应用及它运行所需的所有依赖都被封装在了一起;

对一个应用来说,操作系统本身才是它运行所有需要的完整“依赖库”;

Dockerfile

Dockerfile 中的每个原语执行后,都会生成一个对应的的镜像层;

https://time.geekbang.org/column/article/14653