Docker核心原理——Docker架构


发布于 2016-06-12 / 16 阅读 / 0 评论 /
Docker采用传统的client-server架构模式。

Docker采用传统的client-server架构模式。用户通过Docker client与Docker daemon建立通信,并将请求发送给后者。Docker daemon是Docker架构中的主要用户接口,它提供了API Server用于接收来自Docker client的请求,其后根据不同的请求分发给Docker daemon的不同模块执行相应的工作。

1.Docker架构图

Docker完整架构图如下图所示:

Docker通过driver模块来实现对Docker容器执行环境的创建和管理。

需要创建容器时,通过镜像管理(image management)部分的distribute和registry模块从Docker registry中下载镜像,并通过镜像管理中的image、reference和layer存储镜像的元数据,通过镜像存储驱动graphdriver将镜像文件存储于具体文件系统中。

为容器创建网络环境时,通过网络管理模块调用libnetwork创建并配置Docker的网络环境。

当需要为容器数据卷volume时,通过volume模块调用某个具体的volumedriver,来创建一个数据卷并负责后续的挂载操作。

当需要限制Docker容器运行资源或执行用户指令等操作时,则通过execdriver来完成。

libcontainer是对cgroups和namespace的二次封装,execdriver是通过libcontainer来实现对容器的具体管理。

2.Docker命令

docker命令的源文件为docker/docker.go,有两种模式:client模式和daemon模式。

命令格式为:docker [OPTIONS] COMMAND [arg...]

如果子命令为daemon,Docker就会创建一个运行在宿主机的daemon进程(docker/daemon.go#mainDaemon),即执行daemon模式。其余子命令都会执行client模式。

3.daemon工作路径

默认为/var/lib/docker/,若目录不存在,则自动创建,权限为0700。

4.配置Docker容器所需的文件环境

Docker daemon会在Docker工作根目录/var/lib/docker/下面初始化一些重要的目录和文件。主要有:

(1)创建容器配置目录/var/lib/docker/containers/

(2)配置graphdriver目录

(3)配置镜像目录

(4)创建volume驱动目录,默认为/var/lib/docker/volumes/

(5)可信镜像所需的工作目录/var/lib/docker/trust/

5.Docker daemon进程启动

启动过程分为三步:

(1)启动一个API Server,它工作在用户通过-H指定的socket上面。

(2)Docker使用NewDaemon方法创建daemon对象来保存信息和处理业务逻辑。

(3)将API Server与daemon对象绑定,接收并处理client的请求。

6.libcontainer

OCI成立后,libcontainer进化为runC。

最主要内容是Process、Container以及Factory这三个逻辑实体的实现原理。使用Factory创建Container,启动逻辑容器Container,用逻辑容器创建物理容器。

7.Docker daemon与容器之间的通信方式

一般来说有以下四种方式:

(1)发送信号通知(signal):包含信息有限,需额外记录

(2)对内存轮询访问(poll memory):低效

(3)sockets通信(sockets):网络不通,不可行

(4)文件和文件描述符(file and file-descriptors):最终选择,通过pipe(int fd[2])系统调用创建管道,参数是包含两个整数的数组。调用完后,在fd[1]端写入数据,就可以在fd[0]端读取。通信完成的标识在于EOF信号的传递。