[Docker 官方文檔] 理解 Docker

http://segmentfault.com/a/1190000002609286python

什麼是 Docker?

Docker 是一個用於開發、交付和執行應用的開放平臺,Docker 設計用來更快的交付你的應用程序。Docker 可以將你的應用程序和基礎設施層隔離。並且還可以將你的基礎設施看成程序同樣進行管理。Docker 可以幫助你更塊地打包你代碼、測試以及部署,並且也可以下降從編寫代碼到部署執行代碼的週期。linux

Docker 將一個輕量級的容器虛擬化平臺和一組標準工做流程、工具進行集成,來幫助你方便地管理和部署應用。nginx

核心是,Docker 提供了一種在安全隔離的容器中執行近乎所有應用的方式,這樣的隔離性和安全性贊成你在同一主機上同一時候執行多個容器,而容器的這樣的輕量級特性,意味着你可以節省不少其它的硬件資源,因爲你沒必要消耗執行 hypervisor 所需要的額外負載。docker

基於容器虛擬化的工具或者平臺可以爲你提供例如如下幫助:ubuntu

  • 將應用程序(包含支撐的組件)放入Docker容器中;
  • 將這些容器打包並分發給你的團隊。以便於興許的開發和測試;
  • 將這些容器部署到生產環境中,生產環境可以是本地的數據中心。也可以在雲端。

我可以用 Docker 作些什麼?

高速分發你的應用

Docker是開發過程當中較爲理想的助手。它贊成你在包括了你的應用和服務的本地容器中進行開發。而後幫你完畢集成和部署。segmentfault

好比,你的開發者可以在本地編寫代碼而後經過Docker與其它同事共享,當他們完畢了各自的開發任務後,可以將他們的代碼推送到一個測試的環境中進行測試,完畢測試後便可以將對應的Docker鏡像部署到生產環境中。安全

更方便地進行部署和調整規模

Docker這樣的基於容器的平臺具備高度的便攜性,它可以無縫地執行於開發人員的本地主機、數據中心其餘的物理機或虛擬機、或者雲端。bash

Docker的便攜性和其自然的輕量特性易於實現動態地負載管理,你可以利用Docker高速地增減應用和服務的部署規模,Docker的速度保證了這樣的規模的調整近乎實時。網絡

更高密度的部署應用和執行不少其它的應用

由於Docker輕量並且高速,所以相對於基於Hypervisor的虛擬機的部署方式。Docker提供了一種更可行和划算的替代方案,這對於高密度部署環境尤事實上用,好比在構建私有云或PaaS。固然,當你想在有限的資源裏部署不少其它的應用時,Docker對於中小型的部署也很實用。架構

Docker 主要包含哪些組件?

Docker主要包含兩個組件:

  • Docker:開源的容器虛擬化平臺。
  • Docker Hub :用於分享和管理Docker容器的軟件即服務平臺。

:Docker在Apache 2.0開源協議下進行受權。

Docker 的架構?

Docker是Client/Server的架構,Dockerclient與Docker daemon進行交互,daemon負責構建、執行和公佈Docker容器。client可以和服務端執行在同一個系統中。也可以鏈接遠程的daemon。Docker的client的daemon經過RESTful API進行socket通訊。

[architecture.jpg

Docker 守護進程

就像上圖所看到的,Docker守護進程(daemon)在主機上執行,用戶不能直接和守護進程打交道,但是可以經過Dockerclient與其進行交互。

Docker client

Dockerclient——docker二進制文件的功能之中的一個——是Docker的初始用戶界面,它接收用戶的命令並反饋,並且與Docker的守護進行交互。

Docker 內部機制

理解Docker的內部機制。你需要明確例如如下三個組件:

  • Docker鏡像
  • Docker註冊中心
  • Docker容器

Docker 鏡像

Docker鏡像是一個僅僅讀的模板。好比,一個鏡像可以包括安裝了Apache Web服務應用的Ubuntu操做系統。鏡像可以用來建立Docker容器。

Docker提供了構建新鏡像或升級原有鏡像的較爲便利的方式,或者你也可以下載別人已經建立好的鏡像。Docker鏡像是Docker的構建組件。

Docker 註冊中心

Docker註冊中心用於上傳和下載鏡像,分爲公共註冊中心和私有註冊中心兩種。公共註冊中心爲Docker Hub,它提供了大量的現成鏡像,你可以構建本身的鏡像並上傳到上面,也可以在上面下載別人構建的鏡像。Docker註冊中心是Docker的公佈組件。

Docker 容器

Docker容器就像是一個目錄。它包括了一個應用程序執行所需要的所有內容。

每個容器都是基於Docker鏡像構建。

咱們可以執行、開始、中止、遷移或者是刪除Docker容器。

每個容器均是一個隔離的、安全的應用平臺。Docker容器是Docker的執行組件。

Docker 如何工做的

至此,咱們已經知道了:

  1. 你可以構建用於存儲你的應用程序的鏡像。
  2. 你可以從Docker鏡像中建立容器用來執行你的應用;
  3. 你可以經過Docker Hub或者你本身的註冊中心來共享Docker鏡像。

那咱們看看 Docker 是怎麼將這些元素組合在一塊兒工做的。

Docker 鏡像是怎樣工做的

咱們已經知道Docker鏡像實質上是一些用於載入Docker容器的僅僅讀模板,每個鏡像包含很是多層。

Docker利用union file systems將這些層組合爲一個鏡像。Union file systems贊成相互隔離的文件或文件夾透明的疊加在一塊兒。而呈現爲一個統一的文件系統。

Docker如此輕量化的緣由也是由於這些層的存在。當你對一個Docker鏡像進行改動時——好比將一個應用升級爲一個新的版本號——會構建一個新的層。所以,與虛擬機的替換整個鏡像或全然構建的方式不一樣。Docker僅對相關的層進行加入或升級。因此你僅需要公佈鏡像的更新部分而沒必要公佈整個鏡像,這樣的方式使得鏡像的公佈更加高速和簡單。

每個鏡像始於一個基礎鏡像,好比:ubuntu即是一個基礎的Ubuntu鏡像,fedora是一個基礎的Fedora鏡像。

你也可以將你本身製做的鏡像做爲基礎鏡像,好比你可以將一個Apache鏡像做爲一個Web應用的基礎鏡像。

注意:Docker通常從Docker Hub上獲取基礎鏡像。Docker鏡像從這些基礎鏡像中依照一系列的步驟進行製做。咱們稱這些步驟爲指令,每個指令在你的鏡像中建立一個新的層。指令包含下面行爲:

  • 執行一條命令;
  • 加入一個文件或文件夾;
  • 建立一個環境變量;
  • 今後鏡像中載入一個容器時需要執行的進程。

這些指令存儲在Dockerfile中。Docker在構建鏡像過程當中讀取這個Dockerfile,執行裏面的指令並返回終於的鏡像。

Docker註冊中心怎樣工做的

Docker註冊中心是Docker鏡像的存儲中心,當你構建完一個鏡像後便可以將其推送到Docker Hub或你本身的註冊中心。

利用Dockerclient,你可以搜索已經公佈的鏡像,而後將其拉取到你的Docker主機上,以便於基於這些鏡像構建容器。

Docker Hub爲鏡像提供了公共的和私有的存儲空間。

公共的存儲空間不論什麼人均可以在上面搜索和下載,私有存儲空間僅對你本人或你的團隊開放搜索以及拉取下載。你可以經過這裏註冊一個私有的存儲空間。

容器是怎樣工做的

一個容器包含操做系統、用戶加入的文件以及相關的元數據。咱們知道,每個容器都是從鏡像中構建出來的,這個鏡像告訴Docker容器用到什麼資源、當容器載入時啓動哪一個進程以及容器啓動時的其餘配置。Docker鏡像是僅僅讀的。當Docker從一個鏡像執行一個容器時。它會在鏡像的上層加入一個用於執行應用的可讀寫的層(利用的就是上文提到的union file system)。

執行一個容器時究竟發生了什麼

不管是經過Docker命令仍是API調用的方式。Dockerclient都會通知Docker的守護進程執行一個容器。

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

咱們來看一下這個命令,Dockerclient利用docker命令並結合run選項來啓動一個容器,一個最小配置的Dockerclient執行一個容器需要告訴Docker守護進程下面事項:

  • 此容器基於什麼鏡像來構建。此處是ubuntu——一個基礎的Ubuntu鏡像;
  • 需要在容器中執行的命令,此處是/bin/bash——在容器中啓動一個Bash Shell。

那麼咱們看看執行上述命令時究竟發生了什麼?

依照順序,Docker依次幹了例如如下事情:

  • 拉取ubuntu鏡像 : Docker首先檢查一下ubuntu鏡像在本地server上存不存在。假設不存在。則本身主動從Docker Hub中下載。假設已經存在則直接利用這個鏡像來啓動一個新的容器。
  • 建立一個新的容器: 假設Docker本地server中存在這個鏡像。那麼就據此來啓動一個容器。
  • 分配一個文件每戶並且將其掛載到一個可讀寫的層: 容器在此文件系統中被建立。並且將其做爲一個可讀寫的層加入到鏡像中。
  • 分配一個網絡或橋接的接口: 建立一個網絡的接口以便於Docker容器能夠訪問本機。
  • 設置一個IP地址: 爲此容器從地址池中找到並綁定一個IP地址。

  • 執行指定的進程: 執行你的應用程序,而後;
  • 獲取並提供應用程序的輸出: 鏈接標準輸入、標準輸出和標準錯誤接口,這樣你即可以觀察到程序執行的一切。

現在你已經執行了一個容器,這樣你便可以管理你的容器、與應用程序進行交互。當執行結束是中止或者刪除你的容器。

底層技術問題

Docker是用Go語言實現的。用到了一些Linux內核的特性實現上述功能。

命名空間(namespaces)

Docker在爲容器提供一個隔離的工做空間時。用到了命名空間的技術,當你執行一個容器時,Docker會爲此容器建立一組命名空間。

這樣便可以提供一個隔離的層:每個容器執行在本身的命名空間中,而外部不能訪問這個層。

Docker用到的一些命名空間有:

  • pid命名空間: 用於隔離進程(PID:Process ID)。
  • net命名空間: 用於管理網絡;
  • ipc命名空間: 用於訪問IPC資源(IPC:InterProcess Communication);
  • mnt命名空間: 用於管理掛載點(MNT:Mount);
  • uts命名空間: 用於隔離內核和版本號標識(UTS:Unix Timesharing System)。

控制組(Control Groups)

Docker還用到了另一項技術叫cgroups或者叫控制組(control groups)。實現程序執行環境的隔離的關鍵在於使這些程序僅僅用到它們需要的資源,這就行保證這些容器是主機服務環境小社會中的好市民。控制組贊成Docker在不一樣的容器之間共享硬件資源,需要時加入一些限制和約束,好比限制一個容器最大訪問內存量。

統一文件系統(Union file systems)

統一文件系統或者說是UnionFS,是建立層的時候用到的文件系統,使文件系統很輕量和高速。Docker使用統一文件系統爲容器構建blocks,Docker可以使用幾種不一樣的文件系統:AUFS、btrfs、vfs以及DeviceMapper。

容器格式

Docker容器將這些組件合併在一塊兒,咱們稱之爲容器格式,容器的缺省格式稱爲libcontainer。Docker還支持利用LXC技術的傳統Linux容器格式,將來還將會支持其餘的容器格式。好比:與BSD Jails或者Solaris Zones實現整合。

下一步


原文連接:Understanding Docker(翻譯:deerlux 校對:李穎傑)
譯者介紹:deerlux@163.com,現就任於一家軍工科研機構,深度的技術控、Linux控、python控。

相關文章
相關標籤/搜索