Docker使用了传统的client-server架构模式,用户通过Docker client与Docker daemon建立通信,并将请求发送给后者。Docker的后端是松耦合结构,不同模块各司其职,有机组合,完成用户的请求。架构如下图:
Docker通过driver模块来实现对Docker容器执行环境的创建和管理。当
需要创建Docker容器时,可通过镜像管理(image management)部分的
distribution和registry模块从Docker registry中下载镜像,并通过镜像
管理的image、reference和layer存储镜像的元数据,通过镜像存储驱动
graphdriver将镜像文件存储于具体的文件系统中;当需要为Docker容器创
建网络环境时,通过网络管理模块network调用libnetwork创建并配置
Docker容器的网络环境;当需要为容器创建数据卷volume时,则通过
volume模块调用某个具体的volumedriver,来创建一个数据卷并负责后续
的挂载操作;当需要限值Docker容器运行资源或执行用户指令等操作时,
则通过execdriver来完成。libcontainer是对cgroups和namespace的二次
封装,execdriver是通过libcontainer来实现对容器的具体管理,包括
利用UTS、IPC、PID、Network、Mount、User等namespace实现容器之间的
资源隔离和利用cgrups实现对容器的资源限值。当运行容器的命令执行
完毕后,一个实际的容器就处于运行状态,该容器拥有独立的文件系统、
相对安全且相互隔离的运行环境。
一、Docker daemon
Docker daemon是Docker最核心的后台进程,它负责响应来自Docker client的请求,然后将这些请求翻译成系统调用完成容器管理操作。该进程会在后台启动一个API Server,负责接收由Docker client发送的请求;接收到的请求将通过Docker daemon分发调度,再由具体的函数来执行请求;
二、Docker client
三、镜像管理
Docker通过distribution、registry、layer、image、reference等模块实现了对Docker镜像的管理;
distribution:负责与Docker registry交互,上传下载镜像以及存储于v2 registry有关的元数据;
registry:负责与Docker registry有关的身份验证、镜像查找、镜像验证以及管理registry mirror等交互操作;
images:负责与镜像元数据有关的存储、查找,镜像层的索引、查找以及镜像tar包有关的导入、导出等操作;
reference:负责存储本地所有镜像的repository和tag名,并维护与镜像ID之间的映射关系;
layer:负责与镜像层和容器层元数据有关的增删改查,并负责将镜像层的增删改查操作映射到实际存储镜像层文件系统的graphdriver模块;
四、execdriver、volumedriver、graphdriver
Docker daemon负责将用户请求转译成系统调用,进而创建和管理容器;而在具体实现过程汇总,为了将这些系统调用抽象成为统一的操作接口方便调用者使用,Docker把这些操作分成了容器执行驱动、volume存储驱动、镜像存储驱动3种,分别对应execdriver、volumedriver和graphdriver。