基本原理
Docker 的实现,主要归结于三大技术:
- 命名空间 ( Namespaces )
- 控制组 ( Control Groups )
- 联合文件系统 ( Union File System )
命名空间( Namespaces ) ,是linux核心在2.4版本后逐渐引入的一项用于运行隔离的模块,利用 PID Namespace,Docker 就实现了容器中隔离程序运行中进程隔离这一目标。
资源控制组( Control Groups ) ,是linux在2.6 版本后逐渐引入的一项对计算机资源控制的模块。顾名思义,资源控制组的作用就是控制计算机资源的,CGroups 主要做的是硬件资源的隔离。虚拟化除了制造出虚拟的环境隔离同一物理平台运行的不同程序之外,另一大作用就是控制硬件资源的分配,CGroups 的使用正是为了这样的目的。即隔离和分配两个作用。
联合文件系统 ( Union File System ),是一种能够同时挂载不同实际文件或文件夹到同一目录,形成一种联合文件结构的文件系统。联合文件系统本身与虚拟化并无太大的关系,但 Docker 却创新的将其引入到容器实现中,用它解决虚拟环境对文件系统占用过量,实现虚拟环境快速启停等问题。
Docker的核心组成分为四部分
- 镜像 ( Image )
- 容器 ( Container )
- 网络 ( Network )
- 数据卷 ( Volume )
镜像 ( Image ) ,可以理解为一个只读的文件包,包含了虚拟环境运行最原始文件系统的内容。镜像有不同的版本,但因为是分层结构,所以不同的镜像版本可以建立在公共的基础层上,即多个不同版本的镜像占用的空间小于这些镜像本身大小之和。
容器 ( Container ) 就更好理解了,在容器技术中,容器就是用来隔离虚拟环境的基础设施,而在 Docker 里,它也被引申为隔离出来的虚拟环境。镜像内存放的是不可变化的东西,当以它们为基础的容器启动后,容器内也就成为了一个“活”的空间。用更官方的定义,Docker 的容器应该有三项内容组成:
一个 Docker 镜像
一个程序运行环境
一个指令集合
网络 ( Network ) 在 Docker 中,实现了强大的网络功能,我们不但能够十分轻松的对每个容器的网络进行配置,还能在容器间建立虚拟网络,将数个容器包裹其中,同时与其他网络环境隔离。另外,利用一些技术,Docker 能够在容器中营造独立的域名解析环境,这使得我们可以在不修改代码和配置的前提下直接迁移容器,Docker 会为我们完成新环境的网络适配。对于这个功能,我们甚至能够在不同的物理服务器间实现,让处在两台物理机上的两个 Docker 所提供的容器,加入到同一个虚拟网络中,形成完全屏蔽硬件的效果。
数据卷 ( Volume ) 得益于 Docker 底层的 Union File System 技术,docker除了能够从宿主操作系统中挂载目录外,还能够建立独立的目录持久存放数据,或者在容器间共享。在 Docker 中,通过这几种方式进行数据共享或持久化的文件或目录,我们都称为数据卷 ( Volume )。
Docker Engine
Docker Engine,目前这款实现容器化的工具是由 Docker 官方进行维护的,Docker 官方将其命名为 Docker Engine,同时定义其为工业级的容器引擎 ( Industry-standard Container Engine )。在 Docker Engine 中,实现了 Docker 技术中最核心的部分,也就是容器引擎这一部分。
Docker Engine 是一款软件,但实实在在去深究的话,它其实算是由多个独立软件所组成的软件包。在这些程序中,最核心的就是
- docker daemon
- docker CLI
docker daemon 所有我们通常认为的 Docker 所能提供的容器管理、应用编排、镜像分发等功能,都集中在了 docker daemon 中,而我们之前所提到的镜像模块、容器模块、数据卷模块和网络模块也都实现在其中。在操作系统里,docker daemon 通常以服务的形式运行以便静默的提供这些功能,所以我们也通常称之为 Docker 服务。
在 docker daemon 管理容器等相关资源的同时,它也向外暴露了一套 RESTful API,我们能够通过这套接口对 docker daemon 进行操作。或者更确切的说,是通过这套 RESTful API 对 docker daemon 中运行的容器和其他资源进行管理。
那么问题来了,如果我们在控制台中编写一个 HTTP 请求以借助 docker daemon 提供的 RESTful API 来操控它,那显然是个费脑、费手又费时间的活儿。所以在 Docker Engine 里还直接附带了 docker CLI 这个控制台程序。
docker daemon 和 docker CLI 所组成的,正是一个标准 C/S ( Client-Server ) 结构的应用程序。衔接这两者的,正是 docker daemon 所提供的这套 RESTful API。
参考资料:
开发者必备的 Docker 实践指南