標籤(空格分隔): Docker 架構 Architecture CGroups Namespaces aufs vfs devmapper containerdocker
注:該文做者是 rajdeep,原文地址 Docker Architecture (v1.2)後端
注:該文是由一篇 slide 翻譯而來。服務器
在開始以前,咱們須要瞭解
什麼是容器?網絡
- 一組進程包含在隔離的環境
- 經過相似 cgroups 和 namespaces 的概念提供隔離
什麼是 Docker?數據結構
- 使用鏡像的概念實現一個輕便的容器
- 鏡像是輕便且可發佈的
CGroups
- 限制、記錄(account)和隔離一組進程的資源使用(CPU,內存,磁盤 I/O,等等。)
- 資源限制:組能夠被設置不超過一組內存限制 - 這也包括文件系統 cache。
- 優先級:一些組可能得到更大的 CPU 分配和磁盤 I/O 吞吐量
- 記錄(account):爲了測量某些系統使用了多少資源
- 控制:凍結組或檢查點和重起。

Namespace
- 分區必不可少的內核結構來建立虛擬環境
-
不一樣的 Namespaces架構
- pid(進程)
- net(網絡接口,路由。。。)
- ipc(System V IPC)
- mnt(掛載點,文件系統)
- uts(hostname)
-
user(UIDs)app

Docker
- 管理鏡像和運行期容器
- 後端支持多樣的文件系統
- 多個 Execdriver 容器實現
- 客戶端和服務器端組件 - 使用 HTTP 和 unix sockets 配合
Docker 運行期組件

Docker 引擎
- Docker 核心:容器存儲
- 使用任務管理容器(相似 unix 的任務)
- 容器處理封裝了任務的函數
- 全部的動做使用任務執行

Docker 初始化
Daemon
- 主入口點管理容器的全部請求
- 維護如下引用的數據結構:
- ImageGraph
- Volume Graph
- Engine
- ExecDriver
- Server
- ContainerStore
Daemon - Graph
- Graph 是一個存儲系統文件版本和鏡像關係的數據結構
- 爲每個容器實例化一個 Graph
- 引用一個 graphdriver.Driver
- 在一個 Graph 上的動做:
- 建立一個新的 Graph
- 從一個 Graph 中獲取鏡像
- 恢復一個 Graph
- 建立一個鏡像而且註冊進 Graph
- 在 Graph 上註冊一個預先存在的鏡像

在 Docker 中鏡像和容器的概念
- Docker 鏡像是文件系統中的一層
- 容器是兩層:

Graph Driver
- 被 Daemon 引用
- 用於抽象多種後端存儲
- 加載如下後端文件系統:
- aufs
- Device mapper(devmapper)
- vfs
- btrfs

容器存儲
- 持久化後端的容器數據
- 使用 SQLite 實現
- 從 Daemon 引用
- containGraph:graph
- 在 Daemon 恢復期間用於加載容器信息

Volume Graph
- 基於 Graph 的簡單 vfs,爲了與容器卷保持聯繫
- Volumes 使用在 Daemon 中的卷驅動器來建立和鏈接容器的卷
- 每一個容器被分配一個或多個卷

ExecDriver
- 對底層 Linux 控制的抽象
- 從 daemon 調用
- 支持如下實現

驅動接口

驅動接口 - 網絡

libcontainer
- 容器的底層原生實現
- 被原生的驅動使用
- Container.config - 一個容器數據的表示
- 包裝過的 cgroups 和 Namespaces

原生的驅動實現

建立容器的步驟
- Engine -‐> Daemon -‐> ContainerCreate
-
ContainerCrea函數
2.1 檢查定義在配置文件中的內存是比 512k 大仍是系統定義的限制小
2.2 檢查 SwapLimit
2.3 調用 Daemon -‐> Create
2.3.1 daemon.repositories.LookupImage -‐> tagStore.getImage()
2.3.2 daemon.newContainer()
2.3.2.1 NewContainerMonitor()
2.3.3 daemon.createRootFs()
2.3.3.1 daemon.container.driver.Create()[Graph Driver -‐ aufs, btrfs, devicemapper]
2.3.3.2 container.ToDisk()//持久化容器

總結
- Linux 控制原則
- Docker 架構組件
- 原生的驅動實現
- libcontainer
- 容器建立
