加入收藏 | 设为首页 | 会员中心 | 我要投稿 济宁站长网 (https://www.0537zz.cn/)- 行业智能、边缘计算、专有云、AI硬件、5G!
当前位置: 首页 > 综合聚焦 > 移动互联 > 评测 > 正文

Docker底层原理及源码分析 Docker 架构

发布时间:2019-10-20 10:36:35 所属栏目:评测 来源:青峰科技
导读:前言 Docker 简介 Docker 是 Docker 公司开源的一个基于轻量级虚拟化技术的容器引擎项目, 整个项目基于 Go 语言开发,并遵从 Apache 2.0 协议。目前,Docker 可以在容器内部快速自动化部署应用,并可以通过内核虚拟化技术(namespaces 及 cgroups 等)来提供

正是由于 libcontainer 的存在,Docker 可以直接调用 libcontainer,而最终操纵容器的 namespace、cgroups、apparmor、网络设备以及防火墙规则等。这一系列操作的完成都不需要依赖 LXC 或者其他包。libcontainer 架构如图 4.7:

Docker底层原理及源码分析 Docker 架构

libcontainer 示意图

另外,libcontainer 提供了一整套标准的接口来满足上层对容器管理的需求。或者说,libcontainer 屏蔽了 Docker 上层对容器的直接管理。又由于 libcontainer 使用 Go 这种跨平台的语言开发实现,且本身又可以被上层多种不同的编程语言访问,因此很难说,未来的 Docker 就一定会紧紧地和 Linux 捆绑在一起。而于此同时,Microsoft 在其著名云计算平台 Azure 中,也添加了对 Docker 的支持,可见 Docker 的开放程度与业界的火热度。

暂不谈 Docker,由于 libcontainer 的功能以及其本身与系统的松耦合特性,很有可能会在其他以容器为原型的平台出现,同时也很有可能催生出云计算领域全新的项目。

4.7 Docker container

Docker container(Docker 容器)是 Docker 架构中服务交付的最终体现形式。

Docker 按照用户的需求与指令,订制相应的 Docker 容器:

用户通过指定容器镜像,使得 Docker 容器可以自定义 rootfs 等文件系统;

用户通过指定计算资源的配额,使得 Docker 容器使用指定的计算资源;

用户通过配置网络及其安全策略,使得 Docker 容器拥有独立且安全的网络环境;

用户通过指定运行的命令,使得 Docker 容器执行指定的工作。

Docker 容器示意图如图 4.8:

Docker底层原理及源码分析 Docker 架构

图 4.8 Docker 容器示意图

5 Docker 运行案例分析

上一章节着重于 Docker 架构中各个部分的介绍。本章的内容,将以串联 Docker 各模块来简要分析,分析原型为 Docker 中的 docker pull 与 docker run 两个命令。

5.1 docker pull

docker pull 命令的作用为:从 Docker Registry 中下载指定的容器镜像,并存储在本地的 Graph 中,以备后续创建 Docker 容器时的使用。docker pull 命令执行流程如图 5.1。

Docker底层原理及源码分析 Docker 架构

图 5.1 docker pull 命令执行流程示意图

如图,图中标记的红色箭头表示 docker pull 命令在发起后,Docker 所做的一系列运行。以下逐一分析这些步骤。

(1) Docker Client 接受 docker pull 命令,解析完请求以及收集完请求参数之后,发送一个 HTTP 请求给 Docker Server,HTTP 请求方法为 POST,请求 URL 为"/images/create? "+"xxx";

(2) Docker Server 接受以上 HTTP 请求,并交给 mux.Router,mux.Router 通过 URL 以及请求方法来确定执行该请求的具体 handler;

(3) mux.Router 将请求路由分发至相应的 handler,具体为 PostImagesCreate;

(4) 在 PostImageCreate 这个 handler 之中,一个名为"pull"的 job 被创建,并开始执行;

(5) 名为"pull"的 job 在执行过程中,执行 pullRepository 操作,即从 Docker Registry 中下载相应的一个或者多个 image;

(6) 名为"pull"的 job 将下载的 image 交给 graphdriver;

(7) graphdriver 负责将 image 进行存储,一方创建 graph 对象,另一方面在 GraphDB 中记录 image 之间的关系。

5.2 docker run

docker run 命令的作用是在一个全新的 Docker 容器内部运行一条指令。Docker 在执行这条命令的时候,所做工作可以分为两部分:第一,创建 Docker 容器所需的 rootfs;第二,创建容器的网络等运行环境,并真正运行用户指令。因此,在整个执行流程中,Docker Client 给 Docker Server 发送了两次 HTTP 请求,第二次请求的发起取决于第一次请求的返回状态。Docker run 命令执行流程如图 5.2。

Docker底层原理及源码分析 Docker 架构

图 5.2 docker run 命令执行流程示意图

如图,图中标记的红色箭头表示 docker run 命令在发起后,Docker 所做的一系列运行。以下逐一分析这些步骤。

(1) Docker Client 接受 docker run 命令,解析完请求以及收集完请求参数之后,发送一个 HTTP 请求给 Docker Server,HTTP 请求方法为 POST,请求 URL 为"/containers/create? "+"xxx";

(2) Docker Server 接受以上 HTTP 请求,并交给 mux.Router,mux.Router 通过 URL 以及请求方法来确定执行该请求的具体 handler;

(3) mux.Router 将请求路由分发至相应的 handler,具体为 PostContainersCreate;

(4) 在 PostImageCreate 这个 handler 之中,一个名为"create"的 job 被创建,并开始让该 job 运行;

(5) 名为"create"的 job 在运行过程中,执行 Container.Create 操作,该操作需要获取容器镜像来为 Docker 容器创建 rootfs,即调用 graphdriver;

(6) graphdriver 从 Graph 中获取创建 Docker 容器 rootfs 所需要的所有的镜像;

(7) graphdriver 将 rootfs 所有镜像,加载安装至 Docker 容器指定的文件目录下;

(编辑:济宁站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

推荐文章
    热点阅读