Docker使用了传统的client-server架构模式,用户通过Docker client与Docker daemon建立通信,并将请求发送给后者。Docker的后端是松耦合结构,不同模块各司其职,有机组合,完成用户的请求。架构如下图:
Docker架构概览 - 图1

  1. Docker通过driver模块来实现对Docker容器执行环境的创建和管理。当
  2. 需要创建Docker容器时,可通过镜像管理(image management)部分的
  3. distributionregistry模块从Docker registry中下载镜像,并通过镜像
  4. 管理的imagereferencelayer存储镜像的元数据,通过镜像存储驱动
  5. graphdriver将镜像文件存储于具体的文件系统中;当需要为Docker容器创
  6. 建网络环境时,通过网络管理模块network调用libnetwork创建并配置
  7. Docker容器的网络环境;当需要为容器创建数据卷volume时,则通过
  8. volume模块调用某个具体的volumedriver,来创建一个数据卷并负责后续
  9. 的挂载操作;当需要限值Docker容器运行资源或执行用户指令等操作时,
  10. 则通过execdriver来完成。libcontainer是对cgroupsnamespace的二次
  11. 封装,execdriver是通过libcontainer来实现对容器的具体管理,包括
  12. 利用UTSIPCPIDNetworkMountUsernamespace实现容器之间的
  13. 资源隔离和利用cgrups实现对容器的资源限值。当运行容器的命令执行
  14. 完毕后,一个实际的容器就处于运行状态,该容器拥有独立的文件系统、
  15. 相对安全且相互隔离的运行环境。

一、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。