Container
即容器,一般讲的都是Linux容器。容器的本质,一句话解释,就是一组受到资源限制,彼此间相互隔离的进程。实现起来也并不复杂,隔离所用到的技术都是由linux内核本身提供的(所以说目前绝大部分的容器都是必须要跑在linux里面的)。其中namespace用来做访问隔离,cgroups用来做资源限制。总的来说容器就是一种基于操作系统能力的隔离技术,这和基于hypervisor的虚拟化技术(能完整模拟出虚拟硬件和客户机操作系统)复杂度不可同日而语。这边是一个对比图区别:
- 容器是没有自己的OS的,直接共享宿主机的内核,也没有hypervisor这一层进行资源隔离和限制,所有对于容器进程的限制都是基于操作系统本身的能力来进行的
对于虚拟机和容器的区别,刘超老师有一个很形象的比喻:虚拟机好比房子,容器好比衣服。衣服是跟着人的,人站起来了,衣服也跟着起来,人躺下了,衣服也躺下了,而房子永远在那里,不管人是躺着还是站着。所以说基于容器的技术原理,它天生对应用友好,轻量化,又具备了一定的隔离性,大火也就不奇怪了。
名词概念
-
OCI
Open Container Initiative,是由多家公司共同成立的项目,并由linux基金会进行管理,致力于container runtime的标准的制定和runc的开发等工作。所谓container runtime,主要负责的是容器的生命周期的管理。oci的runtime spec标准中对于容器的状态描述,以及对于容器的创建、删除、查看等操作进行了定义。 -
runC
是对于OCI标准的一个参考实现,是一个可以用于创建和运行容器的CLI(command-line interface)工具。runc直接与容器所依赖的cgroup/linux kernel等进行交互,负责为容器配置cgroup/namespace等启动容器所需的环境,创建启动容器的相关进程。runC基本上就是一个命令行小工具,它可以不用通过Docker引擎,直接就可以创建容器。这是一个独立的二进制文件,使用OCI容器就可以运行它。 -
containerd
containerd 是一个守护进程,它可以使用runC管理容器,并使用gRPC暴露容器的其他功能。相比较Docker引擎,使用 gRPC (gPRC详解),containerd暴露出针对容器的增删改查的接口,Docker engine调用这些接口完成对于容器的操作。
Docker架构
其中containerd-shim称之为垫片,它使用runC命令行工具完成容器的启动、停止以及容器运行状态的监控。containerd-shim进程由containerd进程拉起,并持续存在到容器实例进程退出为止(和容器进程同生命周期)。这种设计的优点是,只要是符合OCI规范的容器,都可以通过containerd-shim来进行调用(比如kata-runtime)