理解 Docker

概述

Docker 是一個用於開發、部署和運行應用的開源平臺。它意在使你能更快地進行應用分發。docker

使用 Docker 能夠將應用系統和基礎設施分離,而且能夠用管理應用系統相似的方式對基礎設施進行管理。shell

Docker 使用了內核的容器功能 + 工做流程 + 工具來助咱們管理和部署應用。ubuntu

什麼是 Docker 平臺

Docker 內核能將應用安全地運行於一個個容器中。同時,它的容器是輕量級的,於是能夠在一臺主機上同時運行不少個容器。緩存

圍繞容器還提供了相關的工具和平臺:安全

  • 將應用(及其相關組件)放到一個 Docker 容器中
  • 將容器打包發送給團隊成員進行再一步的開發和測試
  • 將應用部署到生產環境中,不管部署到本地仍是雲中

什麼是 Docker 引擎

Docker 引擎是一個 CS 框架的應用程序,有下面幾個主要組件:bash

  • 服務端 server 是一個一直在後臺運行的進程
  • REST API 是客戶端及其它程序與服務端交互的接口
  • 一個命令行客戶端 CLI

Docker 主要組件

CLI 以腳本或直接命令的形式,利用 Docker REST API 和 Docker 後臺進程交互。而其它的 Docker 應用也會使用 REST API 和 CLI。服務器

後臺對 Docker 對象進行建立和管理。Docker 對象包括 images, containers, networks, data volumnes 等。網絡

Docker 的用途

更快分發

在本地,開發人員將應用代碼和運行所需的相關服務一塊兒放置在一個本地 Docker 容器中,並將其(包含代碼及全部開發堆棧)發送給同事。開發完成後,他們能夠將代碼及開發堆棧推送到一個測試環境中進行測試。在測試環境中,又能夠將 Docker images 推送到生產環境中進行部署。app

更加容易部署和擴展

其基於輕量級容器的特性使得它很是容易進行擴展。 Docker 容器能夠運行在開發者機器上,數據中心的物理或虛擬機上,或者雲上。框架

因爲容器與低層基礎設施分離,能夠實現實時的升配和降配。

實現高密度計算,承擔更多負荷

性能上相比虛擬機高效地多。

Docker 的體系結構

CS 框架。Docker 後臺進程負責建立、運行和發佈 Docker 容器。Docker 客戶端和後臺進程便可以運行在同一個機器上,也能夠運行在不一樣的機器上。Docker 客戶端經過 sockets 或 REST API 與後臺進程通信。

Docker 體系結構

Docker 後臺進行

運行於服務器上,用戶經過 Docker 客戶端與其交互。

Docker 客戶端

即二進制程序 docker,它接受用戶命令,將命令傳給 Docker 後臺進程,而後將命令結果返回給用戶。

Docker 的內部機制

要理解 Docker 的內部機理,要知道三種資源:

  • Docker images
  • Docker registers
  • Docker containers

Docker images (Docker 映像)

Docker image 是一個只讀模板。例如,一個 Docker image 能夠包含一個 Ubuntu 操做系統、Apache 及你安裝的程序。Image 用來建立 Docker 容器。Docker 能夠很是容易地建立新 image 或者更新現成的 image,或者你也能夠下載別人製做的 image。

Docker image 是 Docker 的 構建 組件。

Docker registries (Docker 登記中心)

Docker registries 保存 Docker images。它就是一個倉庫,即有私有的也有公共的,能夠從中上傳或下載 images。公共 Docker registry 是 Docker Hub。Docker registries 是 Docker 的 分發 組件。

Docker containers (Docker 容器)

Docker 容器相似目錄。一個容器包含所需運行程序的全部依賴。每一個容器都根據一個 Docker image 建立。Docker 容器能夠被運行、開啓、中止、移動或者刪除。每一個容器都是一個隔離地安全的應用平臺。Docker 容器是 Docker 的 運行 平臺。

Docker image 工做原理

每一個 image 包含一系列的層。Docker 利用 union file systems 將這些層合併到一個 image 中。UnionFS 容許不一樣文件系統(被稱做分支)的文件和目錄進行透明的層疊,從而造成一個單一的一致的文件系統。

採用層是 Docker 輕量級的一個緣由。例如,當你對應用進行了升級後,就會建立一個新的層,從而完成對 image 的修改。無需對整個 image 進行重建,只需添加或更新相關的層便可。在分發時,也只需分發更新了的層。

每一個 image 都開始於一個最基本的 image ,如 ubuntu,而後在些基礎上構建新的 image。

在基 image 以後,經過運行一組步驟(稱爲指令)來建立出新的 image。每一個指令在咱們的 image 上建立一個新的層。

指令動做包含:

  • 運行命令
  • 添加文件或目錄
  • 建立環境變量
  • 加載容器時運行哪一個進程

這些指令保存在 Dockerfile 文件中。Dockerfile 是一個腳本文件,包含了從基 image 建立所需 image 的全部指令和命令。

Docker registry 工做原理

Docker registry 是 Docker images 的倉庫。當建立了一個 Docker image 後,能夠將它 push 到公共 registry 上如 Docker Hub 中。

經過 Docker 客戶端,能夠搜索已發佈的 image, 而後將它 pull 到 Docker 主機上,最後根據它啓動容器。

容器工做原理

一個容器包含一個操做系統,用戶添加的文件及元數據。容器建立自一個 image。image 告訴 Docker 一個容器中都包含什麼內容,當容器加載時要運行哪一個進程,以及其它的配置數據。Docker image 是隻讀的。而當 Docker 根據一個 image 開啓了一個容器後,它將在 image 之上添加一個讀寫層,而咱們的應用就運行於其之上。

當運行一個容器時發生的事情

運行一個容器:

$ docker run -i -t ubuntu /bin/bash

上面的命令中:

  • 指定了從 ubuntu 這個 image 建立出一個窗口
  • 當加載容器後,在容器中運行 /bin/bash

運行該命令時 Docker 引擎依次執行了以下操做:

  • Pull ubuntu image: 若是該 image 沒有在本地緩存,則從 Docker Hub 上 pull 下來
  • 建立一個新的容器
  • 分配文件系統並添加一個讀寫層。容器在該文件系統中建立,並將一個讀寫層添加到該 image 上
  • 分配網絡/橋接接口:建立一個網絡接口使得容器能與本地主機通信
  • 設置 IP 地址:從池中查找並關聯一個 IP 地址
  • 執行指定的進程:如 /bin/bash
  • 獲取應用的輸出。

低層技術

使用 Go 編寫,並利用瞭如下幾個內核功能。

Namespaces

運行容器時,Docker 會爲該容器建立一組 namespaces,從而容器中的每一個部件都運行於獨立的 namespace 中,互不干擾。

Linux 上的 Docker 引擎用到的 namespaces:

  • pid namespace: 進程隔離
  • net namespace: 管理網絡接口
  • ipc namespace: 管理 IPC 資源訪問
  • mnt namespace: 管理掛載點
  • uts namespace: 隔離內核及版本標識(UTS:Unix Timesharing System)

Control Groups 或 cgroups

Docker 引擎利用它實現容器間的硬件資源共享,並設置限制和約束。例如限制某個容器的內存使用量。

Union file systems

Docker 引擎能夠使用幾個 ufs 的變種,如 AUFS, btrfs, vfs 和 DeviceMapper。

Container format

Docker 引擎將這些組件合併成一個封閉體叫一個 container format,默認的 container format 叫 libcontainer。

參考文獻: Undering docker
相關文章
相關標籤/搜索