2.5 Graph 「Docker 内部数据库」
Graph 架构图
Repository
1 已下载镜像的保管者(包括下载的镜像和通过 Dockerfile 构建的镜像)。
2 一个 Repository 表示某类镜像的仓库(例如:Ubuntu),同一个 Repository 内的镜像用 Tag 来区分(表示同一类镜像的不同标签或版本)。一个 Registry 包含多个Repository,一个 Repository 包含同类型的多个 Image。
3 镜像的存储类型有 Aufs、Devicemapper、Btrfs、Vfs等。其中 CentOS 系统 7.x 以下版本使用 Devicemapper 的存储类型。
4 同时在 Graph 的本地目录中存储有关于每一个的容器镜像具体信息,包含有:该容器镜像的元数据、容器镜像的大小信息、以及该容器镜像所代表的具体 rootfs。
GraphDB
1 已下载容器镜像之间关系的记录者。
2 GraphDB 是一个构建在 SQLite 之上的小型数据库,实现了节点的命名以及节点之间关联关系的记录。
2.6 Driver 「执行部分」
Driver 是 Docker 架构中的驱动模块。通过 Driver 驱动,Docker 可以实现对 Docker 容器执行环境的定制。即 Graph 负责镜像的存储,Driver 负责容器的执行。
Graphdriver
Graphdriver 架构图
1 Graphdriver 主要用于完成容器镜像的管理,包括存储与获取。
2 存储:docker pull 下载的镜像由 Graphdriver 存储到本地的指定目录( Graph 中 )。
3 获取:docker run(create)用镜像来创建容器的时候由 Graphdriver 到本地 Graph中获取镜像。
Networkdriver
Networkdriver 架构图
Networkdriver 的用途是完成 Docker 容器网络环境的配置,其中包括:
- Docker 启动时为 Docker 环境创建网桥。
- Docker 容器创建时为其创建专属虚拟网卡设备。
- Docker 容器分配IP、端口并与宿主机做端口映射,设置容器防火墙策略等。
Execdriver
Execdriver 架构图
1 Execdriver 作为 Docker 容器的执行驱动,负责创建容器运行命名空间、容器资源使用的统计与限制、容器内部进程的真正运行等。
2 现在 Execdriver 默认使用 Native 驱动,不依赖于 LXC。
2.7 Libcontainer 「函数库」
Libcontainer 架构图
1 Libcontainer 是 Docker 架构中一个使用 Go 语言设计实现的库,设计初衷是希望该库可以不依靠任何依赖,直接访问内核中与容器相关的 API。
2 Docker 可以直接调用 Libcontainer 来操纵容器的 Namespace、Cgroups、Apparmor、网络设备以及防火墙规则等。
3 Libcontainer 提供了一整套标准的接口来满足上层对容器管理的需求。或者说 Libcontainer 屏蔽了 Docker 上层对容器的直接管理。
2.8 Docker Container 「服务交付的最终形式」
Docker Container 架构
1 Docker Container( Docker 容器 )是 Docker 架构中服务交付的最终体现形式。
2 Docker 按照用户的需求与指令,订制相应的 Docker 容器:
用户通过指定容器镜像,使得 Docker 容器可以自定义 rootfs 等文件系统。
用户通过指定计算资源的配额,使得 Docker 容器使用指定的计算资源。
用户通过配置网络及其安全策略,使得 Docker 容器拥有独立且安全的网络环境。
用户通过指定运行的命令,使得 Docker 容器执行指定的工作。
附:本文在《docker源码分析》基础上进行整理。





