Docker 架構 - 基於 1.2 版本

標籤(空格分隔): 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 初始化

  • Docker 的主函數:docker.main()
  • 調用:mainDaemon()
  • 實例化引擎:eng := engine.New()
  • 內部註冊:built-­‐ins builtsin.Register(eng)
  • 實例化任務:job := eng.Job(「initserver」)
  • 爲任務設置變量
  • 運行任務: job.run()
  • 啓動接受的鏈接:eng.Job(「AcceptConnections」).run()
  • 內部註冊:socket

    nstantiate daemon(eng) 
    eng.Register("initserver", server.InitServer) 
    eng.Register(「init_networkdriver」, bridge.InitDriver)

    注:感受做者這裏凌亂了,處女座受不了啊。見圖
    此處輸入圖片的描述
    此處輸入圖片的描述
    此處輸入圖片的描述ide

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 調用
  • 支持如下實現

    • LXC
    • Native

此處輸入圖片的描述

驅動接口

  • 抽象接口與底層實現交互

此處輸入圖片的描述

驅動接口 - 網絡

  • 抽象接口與底層實現交互

此處輸入圖片的描述

libcontainer

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

此處輸入圖片的描述

原生的驅動實現

此處輸入圖片的描述

建立容器的步驟

  1. Engine -­‐> Daemon -­‐> ContainerCreate
  2. 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
  • 容器建立

此處輸入圖片的描述

相關文章
相關標籤/搜索