Docker 是一個用於開發、部署和運行應用的開源平臺。它意在使你能更快地進行應用分發。docker
使用 Docker 能夠將應用系統和基礎設施分離,而且能夠用管理應用系統相似的方式對基礎設施進行管理。shell
Docker 使用了內核的容器功能 + 工做流程 + 工具來助咱們管理和部署應用。ubuntu
Docker 內核能將應用安全地運行於一個個容器中。同時,它的容器是輕量級的,於是能夠在一臺主機上同時運行不少個容器。緩存
圍繞容器還提供了相關的工具和平臺:安全
Docker 引擎是一個 CS 框架的應用程序,有下面幾個主要組件:bash
CLI 以腳本或直接命令的形式,利用 Docker REST API 和 Docker 後臺進程交互。而其它的 Docker 應用也會使用 REST API 和 CLI。服務器
後臺對 Docker 對象進行建立和管理。Docker 對象包括 images, containers, networks, data volumnes 等。網絡
在本地,開發人員將應用代碼和運行所需的相關服務一塊兒放置在一個本地 Docker 容器中,並將其(包含代碼及全部開發堆棧)發送給同事。開發完成後,他們能夠將代碼及開發堆棧推送到一個測試環境中進行測試。在測試環境中,又能夠將 Docker images 推送到生產環境中進行部署。app
其基於輕量級容器的特性使得它很是容易進行擴展。 Docker 容器能夠運行在開發者機器上,數據中心的物理或虛擬機上,或者雲上。框架
因爲容器與低層基礎設施分離,能夠實現實時的升配和降配。
性能上相比虛擬機高效地多。
CS 框架。Docker 後臺進程負責建立、運行和發佈 Docker 容器。Docker 客戶端和後臺進程便可以運行在同一個機器上,也能夠運行在不一樣的機器上。Docker 客戶端經過 sockets 或 REST API 與後臺進程通信。
運行於服務器上,用戶經過 Docker 客戶端與其交互。
即二進制程序 docker,它接受用戶命令,將命令傳給 Docker 後臺進程,而後將命令結果返回給用戶。
要理解 Docker 的內部機理,要知道三種資源:
Docker image 是一個只讀模板。例如,一個 Docker image 能夠包含一個 Ubuntu 操做系統、Apache 及你安裝的程序。Image 用來建立 Docker 容器。Docker 能夠很是容易地建立新 image 或者更新現成的 image,或者你也能夠下載別人製做的 image。
Docker image 是 Docker 的 構建 組件。
Docker registries 保存 Docker images。它就是一個倉庫,即有私有的也有公共的,能夠從中上傳或下載 images。公共 Docker registry 是 Docker Hub。Docker registries 是 Docker 的 分發 組件。
Docker 容器相似目錄。一個容器包含所需運行程序的全部依賴。每一個容器都根據一個 Docker image 建立。Docker 容器能夠被運行、開啓、中止、移動或者刪除。每一個容器都是一個隔離地安全的應用平臺。Docker 容器是 Docker 的 運行 平臺。
每一個 image 包含一系列的層。Docker 利用 union file systems 將這些層合併到一個 image 中。UnionFS 容許不一樣文件系統(被稱做分支)的文件和目錄進行透明的層疊,從而造成一個單一的一致的文件系統。
採用層是 Docker 輕量級的一個緣由。例如,當你對應用進行了升級後,就會建立一個新的層,從而完成對 image 的修改。無需對整個 image 進行重建,只需添加或更新相關的層便可。在分發時,也只需分發更新了的層。
每一個 image 都開始於一個最基本的 image ,如 ubuntu,而後在些基礎上構建新的 image。
在基 image 以後,經過運行一組步驟(稱爲指令)來建立出新的 image。每一個指令在咱們的 image 上建立一個新的層。
指令動做包含:
這些指令保存在 Dockerfile 文件中。Dockerfile 是一個腳本文件,包含了從基 image 建立所需 image 的全部指令和命令。
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
上面的命令中:
運行該命令時 Docker 引擎依次執行了以下操做:
使用 Go 編寫,並利用瞭如下幾個內核功能。
運行容器時,Docker 會爲該容器建立一組 namespaces,從而容器中的每一個部件都運行於獨立的 namespace 中,互不干擾。
Linux 上的 Docker 引擎用到的 namespaces:
Docker 引擎利用它實現容器間的硬件資源共享,並設置限制和約束。例如限制某個容器的內存使用量。
Docker 引擎能夠使用幾個 ufs 的變種,如 AUFS, btrfs, vfs 和 DeviceMapper。
Docker 引擎將這些組件合併成一個封閉體叫一個 container format,默認的 container format 叫 libcontainer。
參考文獻: Undering docker