Docker底层原理及源码分析 Docker 架构
副标题[/!--empirenews.page--]
前言 Docker 简介 Docker 是 Docker 公司开源的一个基于轻量级虚拟化技术的容器引擎项目, 整个项目基于 Go 语言开发,并遵从 Apache 2.0 协议。目前,Docker 可以在容器内部快速自动化部署应用,并可以通过内核虚拟化技术(namespaces 及 cgroups 等)来提供容器的资源隔离与安全保障等。由于 Docker 通过操作系统层的虚拟化实现隔离,所以 Docker 容器在运行时,不需要类似虚拟机(VM)额外的操作系统开销,提高资源利用率,并且提升诸如 IO 等方面的性能。 由于众多新颖的特性以及项目本身的开放性,Docker 在不到两年的时间里迅速获得诸多厂商的青睐,其中更是包括 Google、Microsoft、VMware 等业界行业领导者。 Google 在今年六月份推出了 Kubernetes ,提供 Docker 容器的调度服务,而今年 8 月 Microsoft 宣布 Azure 上支持 Kubernetes ,随后传统虚拟化巨头VMware 宣布与Docker 强强合作。今年9 月中旬, Docker 更是获得 4000 万美元的 C 轮融资,以推动分布式应用方面的发展。 从目前的形势来看,Docker 的前景一片大好。本系列文章从源码的角度出发,详细介绍 Docker 的架构、Docker 的运行以及 Docker 的卓越特性。本文是 Docker 源码分析系列的第一篇——Docker 架构篇。 Docker 版本 本文关于 Docker 架构的分析都是基于 Docker 的源码与 Docker 相应版本的运行结果,其中 Docker 为最新的 1.2 版本。 Docker 架构分析内容目录 本文的目的是:在理解 Docker 源代码的基础上,分析 Docker 架构。分析过程中主要按照以下三个步骤进行:
Docker 总架构图 学习 Docker 的源码并不是一个枯燥的过程,反而可以从中理解 Docker 架构的设计原理。Docker 对使用者来讲是一个 C/S 模式的架构,而 Docker 的后端是一个非常松耦合的架构,模块各司其职,并有机组合,支撑 Docker 的运行。 在此,先附上 Docker 总架构,如图 Docker 总架构图 不难看出,用户是使用 Docker Client 与 Docker Daemon 建立通信,并发送请求给后者。 而 Docker Daemon 作为 Docker 架构中的主体部分,首先提供 Server 的功能使其可以接受 Docker Client 的请求;而后 Engine 执行 Docker 内部的一系列工作,每一项工作都是以一个 Job 的形式的存在。 Job 的运行过程中,当需要容器镜像时,则从 Docker Registry 中下载镜像,并通过镜像管理驱动 graphdriver 将下载镜像以 Graph 的形式存储;当需要为 Docker 创建网络环境时,通过网络管理驱动 networkdriver 创建并配置 Docker 容器网络环境;当需要限制 Docker 容器运行资源或执行用户指令等操作时,则通过 execdriver 来完成。 而 libcontainer 是一项独立的容器管理包,networkdriver 以及 execdriver 都是通过 libcontainer 来实现具体对容器进行的操作。 当执行完运行容器的命令后,一个实际的 Docker 容器就处于运行状态,该容器拥有独立的文件系统,独立并且安全的运行环境等。 Docker 架构内各模块的功能与实现分析 接下来,我们将从 Docker 总架构图入手,抽离出架构内各个模块,并对各个模块进行更为细化的架构分析与功能阐述。主要的模块有:Docker Client、Docker Daemon、Docker Registry、Graph、Driver、libcontainer 以及 Docker container。 Docker Client Docker Client 是 Docker 架构中用户用来和 Docker Daemon 建立通信的客户端。用户使用的可执行文件为 docker,通过 docker 命令行工具可以发起众多管理 container 的请求。 Docker Client 可以通过以下三种方式和 Docker Daemon 建立通信:tcp://host:port,unix://path_to_socket 和 fd://socketfd。为了简单起见,本文一律使用第一种方式作为讲述两者通信的原型。与此同时,与 Docker Daemon 建立连接并传输请求的时候,Docker Client 可以通过设置命令行 flag 参数的形式设置安全传输层协议 (TLS) 的有关参数,保证传输的安全性。 Docker Client 发送容器管理请求后,由 Docker Daemon 接受并处理请求,当 Docker Client 接收到返回的请求相应并简单处理后,Docker Client 一次完整的生命周期就结束了。当需要继续发送容器管理请求时,用户必须再次通过 docker 可执行文件创建 Docker Client。 Docker Daemon Docker Daemon 是 Docker 架构中一个常驻在后台的系统进程,功能是:接受并处理 Docker Client 发送的请求。该守护进程在后台启动了一个 Server,Server 负责接受 Docker Client 发送的请求;接受请求后,Server 通过路由与分发调度,找到相应的 Handler 来执行请求。 Docker Daemon 启动所使用的可执行文件也为 docker,与 Docker Client 启动所使用的可执行文件 docker 相同。在 docker 命令执行时,通过传入的参数来判别 Docker Daemon 与 Docker Client。 Docker Daemon 的架构,大致可以分为以下三部分:Docker Server、Engine 和 Job。Daemon 架构。 图Docker Daemon 架构示意图 Docker Server 在 Docker 架构中是专门服务于 Docker Client 的 server。该 server 的功能是:接受并调度分发 Docker Client 发送的请求。Docker Server 的架构如图 4.2。 图 4.2 Docker Server 架构示意图 (编辑:南平站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |