本文章基于《docker源码分析》(孙宏亮)的做总结,用于学习:
从三个方面叙述:
- docker总统架构图
- docker架构内部各个模块功能实现和分析
- 通过docker pull,docker run的docker启动流程。解释dockerfile build一个镜像的原理
一、docker总体架构图
由上图可知、docker主要包括docker Client、docker daemon、Docker Registry、Graph、Driver、libcontainer以及Docker container模块。对用户而言, Docker Client 是与 Docker Daemon 建立通信的最佳途径。用户通过 Docker Client 发起容器的管理请求,请求最终发往 Docker Daemon。Docker Daemon 作为 Docker 架构中的主体部分,首先具备服务端的功能,有能力接收Docker Client 发起的请求;其次具备 Docker Client 请求的处理能力。 Docker Daemon 内部所有的任务均由 Engine 来完成,且每一项工作都以一个 Job 的形式存在。
Docker Daemon 需要完成的任务很多,因此 Job 的种类也很多。若用户需要下载容器镜像, Docker Daemon 则会创建一个名为" pull" Job ,运行时从 Docker Registry 中下载镜像,并通过镜像管理驱动 graphdriver 将下载的镜像存储在 graph 中;若用户需要为 Docker
容器创建网络环境, Docker Daemon 则会创建一个名 “allocate interface” Job ,通过网络驱动 networkdriver 分配网络接口的资源……
libcontainer 是一套独立的容器管理解决方案,这套解决方案涉及了大量 Linux 内核方面的特性,如: namespaces cgroups 以及 capabilities 等。 libcontainer 很好地抽象了 Linux 的内核特性,并提供完整、明确的接口给 Docker Daemon
当用户执行运行容器这个命令之后,一个 Docker 容器就处于运行状态,该容器拥有隔离的运行环境、独立的网络椅资源以及受限的资源等。
1、Docker client
Docker client是Docker架构中和Docker Daemon交互的客户端。在一台装有Docker的机器上,可以执行docker二进制文件作为Docker Client。发起多个docker容器的管理请求
Docker Client可以通过三种方式和Docker Daemon建立链接。
①tcp://host:port
②unix://path_to_socket
③fd://socketfd
Docker Client发送容器请求,请求由Docker Daemon接收后,Docker Client的生命周期结束。若需要继续发送请求,用户必须再次通过可执行文件docker创建Docker Client发送请求
2、Docker Daemon
Docker Daemon Docker 架构中一个常驻在后台的系统进程。所谓的"运行 Docker" ,
即代表运行 Docker Daemon 。总之, DockerDaemon 的作用主要有以下两方面:
- 接收并处理 Docker Client 发送的请求。
- 管理所有的 Docker 容器。
Docker Daemon 运行时,会在后台启动一个 Server Se er 负责接收 Docker Client 发送的请求;接收请求后, Server 通过路由与分发调度,找到相应的 Handler 来处理请求。
启动 Docker Daemon 所使用的可执行文件同样是 docker ,与 Docker Client 启动所使用的可执行文件 docker 相同。既然 D