共计 2362 个字符,预计需要花费 6 分钟才能阅读完成。
外围概念
镜像
镜像是什么呢?艰深地讲,它是一个只读的文件和文件夹组合。它蕴含了容器运行时所须要的所有根底文件和配置信息,是容器启动的根底。所以你想启动一个容器,那首先必须要有一个镜像。镜像是 Docker 容器启动的先决条件。
容器
容器是 Docker 的另一个外围概念。艰深地讲,容器是镜像的运行实体。镜像是动态的只读文件,而容器带有运行时须要的可写文件层,并且容器中的过程属于运行状态。即容器运行着真正的利用过程。容器有创立、运行、进行、暂停和删除五种状态。
尽管容器的实质是主机上运行的一个过程,然而容器有本人独立的命名空间隔离和资源限度。 也就是说,在容器外部,无奈看到主机上的过程、环境变量、网络等信息,这是容器与间接运行在主机上过程的本质区别。
仓库
Docker 的镜像仓库相似于代码仓库,用来存储和散发 Docker 镜像。镜像仓库分为公共镜像仓库和公有镜像仓库。
目前,Docker Hub 是 Docker 官网的公开镜像仓库,它不仅有很多利用或者操作系统的官网镜像,还有很多组织或者集体开发的镜像供咱们收费寄存、下载、钻研和应用。除了公开镜像仓库,你也能够构建本人的公有镜像仓库。
架构
基于凋谢容器打算(OCI)相干规范的要求,Docker 引擎采纳了模块化的设计准则,其组件是可替换的。Docker 引擎由如下次要的组件形成:Docker 客户端(Docker Client)、Docker 守护过程(Docker daemon)、containerd 以及 runc。 它们独特负责容器的创立和运行。
目前 Docker 引擎的架构示意图如图所示:
Docker 客户端
Docker 客户端其实是一种泛称。其中 docker 命令是 Docker 用户与 Docker 服务端交互的次要形式。除了应用 docker 命令的形式,还能够应用间接申请 REST API 的形式与 Docker 服务端交互,甚至还能够应用各种语言的 SDK 与 Docker 服务端交互。
runc
runc 是 OCI 容器运行时标准的参考实现,本质上是一个轻量级的、针对 Libcontainer 进行了包装的命令行交互工具 (Libcontainer 取代了晚期 Docker 架构中的 LXC)。艰深地讲,runc 是一个用来运行容器的轻量级工具,是真正用来运行容器的。
containerd
containerd 是 Docker 服务端的一个外围组件,它是从 dockerd 中剥离进去的,它的次要工作是容器的生命周期治理——start | stop | pause | rm….。随着工夫的推移,它被赋予了更多的性能,比方镜像治理。
containerd 位于 dockerd 和 runc 所在的 OCI 层之间,通过 containerd-shim 启动并治理 runc。Kubernetes 也能够通过 cri-containerd 应用 containerd,在 Kubernetes 中,containerd 是一个很受欢迎的容器运行时。
shim
shim 是实现无 daemon 的容器(用于将运行中的容器与 containerd 解耦,以便进行 dockerd 降级等操作)不可或缺的工具。
containerd 通过指挥 runc 来创立新容器。事实上,每次创立容器时它都会 fork 一个新的 runc 实例。不过,一旦容器创立结束,对应的 runc 过程就会退出。因而,即便运行上百个容器,也毋庸放弃上百个运行中的 runc 实例。一旦容器过程的父过程 runc 退出,相关联的 containerd-shim 过程就会成为容器的父过程。
作为容器的父过程,shim 的局部职责如下:
- 放弃所有 STDIN 和 STDOUT 流是开启状态,从而当 dockerd 重启的时候,容器不会因为管道(pipe)的敞开而终止。
- 将容器的退出状态反馈给 dockerd。
延长浏览:从 docker 到 runC
各组件之间的关系
首先通过以下命令来启动一个 busybox 容器:
$ docker run -d busybox sleep 3600
容器启动后,通过以下命令查看一下 dockerd 的 PID:
$ sudo ps aux |grep dockerd
root 4147 0.3 0.2 1447892 83236 ? Ssl Jul09 245:59 /usr/bin/dockerd
通过下面的输入后果能够得悉 dockerd 的 PID 为 4147。为了 Docker 各组件之间的调用关系,上面应用 pstree 命令查看一下过程父子关系:
$ sudo pstree -l -a -A 4147
dockerd
|-containerd --config /var/run/docker/containerd/containerd.toml --log-level info
| |-containerd-shim -namespace moby -workdir /var/lib/docker/containerd/daemon/io.containerd.runtime.v1.linux/moby/d14d20507073e5743e607efd616571c834f1a914f903db6279b8de4b5ba3a45a -address /var/run/docker/containerd/containerd.sock -containerd-binary /usr/bin/containerd -runtime-root /var/run/docker/runtime-runc
| | |-sleep 3600
事实上,dockerd 启动的时候,containerd 就随之启动了,dockerd 与 containerd 始终存在。当执行 docker run 命令(通过 busybox 镜像创立并启动容器)时,containerd 会创立 containerd-shim 充当“垫片”过程,而后启动容器的真正过程 sleep 3600。这个过程和架构图是完全一致的。