Docker是最主流的容器运行时,即容器引擎。containerd是容器技术标准化之后的产物,为了能够兼容OCI 标准,独立负责容器运行时和生命周期(如创建、启动、停止、中止、信号处理、删除等),从daemon中剥离,向 docker engine提供运行容器的API,通过grpc通信;每创建一个容器,containerd都会创建一个shim进程,每个shim会调用runc(前身是libcontainer)进行实际的容器运行时管理,比如创建namespace的隔离。
涉及docker的关键概念有 镜像 ,即容器应用发布件,通过dockerfile描述,docker’会根据dockerfile构建镜像;有镜像仓库,及镜像存放的地方。容器,及容器应用运行的环境,通过容器的几个关键技术进行隔离。
Docker所应用的几个关键技术都不是docker发明的,而是linux早就成熟的技术,docker将这几个技术整合,形成了革命性的成果。Namespace负责运行环境的隔离,即每个容器都是一个独立进程,通过namespace技术进行隔离,每个容器互相不可见,包括进程隔离、网络隔离、文件隔离;Cgroup是负责运行资源的隔离或者说独占,可以为每个容器指定资源数量,互相不侵占;Union filesystem是解决应用运行的小型化统一标准, 容器镜像 提供了容器运行的基础,但容器镜像并不等于容器。容器镜像是通过存储驱动技术管理的一系列分层的只读文件,而当容器镜像运行为容器时,就会在镜像的最上层添加一个可写的层,也就是容器层,所有对于运行时容器的修改其实都是对这个容器读写层的修改,所有对容器的变化,比如写新的文件,修改已有文件和删除文件,都只会作用在这个容器层之中。