Docker容器的系统架构

1. Docker的架构
Docker使用客户端/服务器(C/S)架构模式,使用远程API来管理和创建Docker容器。Docker客户端只需向Docker服务器或守护进程发出请求,服务器或守护进程将完成所有工作并返回结果。Docker提供了一个命令行工具docker以及一整套RESTful API进行通信,可以在同一台宿主机上运行Docker守护进程和客户端,也可以从本地的Docker客户端连接到运行在另一台宿主机上的远程Docker守护进程。如图7-2-2所示为Docker服务的架构图。
Docker容器的系统架构

图7-2-2 Docker的架构图

2. Docker的组件
一个完整的Docker服务包括Docker Daemon服务器、Docker Client客户端、Docker Image镜像、Docker Registry库和Docker Contrainer容器,如图7-2-3所示。
Docker容器的系统架构

图7-2-3 Docker的组件

(1)Docker镜像
Docker镜像是一个只读模板,用于创建Docker容器,由Dockerfile文本描述镜像的内容。构建一个镜像实际就是安装、配置和运行的过程。Docker镜像基于UnionFS把以上过程进行分层(Layer)存储,这样更新镜像可以只更新变化的层。
Docker镜像有多种生成方法:
① 可以从无到有开始创建镜像。
② 可以下载并使用别人创建好的现成的镜像。
③ 可以在现有镜像上创建新的镜像。
Docker Hub提供了很多镜像,但在实际工作中,Docker Hub中的镜像并不能满足工作的需要,往往需要构建自定义镜像。构建自定义镜像主要有两种方式:docker commit和Dockerfile,如图7-2-4所示。
Docker容器的系统架构

图 7-2-4 构建自定义镜像方式

可以将docker commit视为在以往版本控制系统里提交变更,然后进行变更的提交即可。docker commit、docker export和docker add类似都可以输出image,但是最好的生成image的方法还是使用Dockerfile。 Dockerfile是由一系列命令和参数构成的脚本,这些命令应用于基础镜像并最终创建一个新的镜像。它们简化了从头到尾的流程并极大地简化了部署工作。Dockerfile从FROM命令开始,紧接着跟随各种方法、命令和参数,其产出为一个新的可以用于创建容器的镜像。 **(2)Docker容器** Docker容器是一个镜像的运行实例。它可以被启动、开始、停止和删除。每个容器都是相互隔离的、保证安全的平台。Dcoker容器由应用程序本身和依赖两部分组成。容器在宿主机操作系统的用户空间中运行,与操作系统的其他进程隔离。这一点显著区别于的虚拟机。 **(3)Docker仓库** Docker仓库是Docker镜像库,是用来集中存放镜像文件的场所。Docker Registry也是一个容器,往往存放着多个仓库,每个仓库中又包含了多个镜像,每个镜像有不同的标签(tag)。Docker Hub是Docker公司提供的互联网公共镜像仓库,用户可以在上面找到需要的镜像,也可以把私有镜像推送上去。但是,在生产环境中,往往需要拥有一个私有的镜像仓库用于管理镜像,通过开源软件Registry可以实现这个目标。 Registry在Github上有两份代码:老代码库和新代码库。老代码是采用Python编写的,存在pull和push的性能问题,在0.9.1版本之后就标志为deprecated,意思为不再继续开发。从2.0版本开始,Registry就在新代码库进行开发,新代码库采用Go语言编写,修改了镜像id的生成算法、Registry上镜像的保存结构,大大优化了pull和push镜像的效率。