Docker Overview

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

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

 

什麼是 Docker 平臺?

核心是,Docker 提供了一種在安全隔離的容器中運行近乎全部應用的方式,這種隔離性和安全性容許你在同一主機上同時運行多個容器,而容器的這種輕量級特性,意味着你能夠節省更多的硬件資源,由於你沒必要消耗運行 hypervisor 所須要的額外負載。安全

基於容器虛擬化的工具或者平臺能夠爲你提供以下幫助:bash

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

 

什麼是 Docker 引擎?

Docker 引擎是一個 C/S 應用,主要有如下組件:服務器

  • 一個叫作守護進程的長時間運行的服務器程序
  • REST API 接口提供程序與守護進程交互
  • 一個 CLI 命令行工具

CLI 命令行工具利用 REST API 來與守護進程交互,使用腳本或直接用命令。網絡

守護進程建立並管理 Docker 對象,Docker 對象包括鏡像、容器、網絡、數據卷等等。架構

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

 

我能夠用 Docker 作些什麼?

快速分發你的應用

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

例如,你的開發人員能夠在本地編寫代碼而後經過 Docker 與其餘同事共享,當他們完成了各自的開發任務後,能夠將他們的代碼推送到一個測試的環境中進行測試,完成測試後即可以將相應的 Docker 鏡像部署到生產環境中。工具

 

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

Docker 這種基於容器的平臺具備高度的便攜性,它能夠無縫地運行於開發者的本地主機、數據中心其它的物理機或虛擬機、或者雲端。

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

 

更高密度的部署應用和運行更多的應用

因爲 Docker 輕量而且快速,所以相對於基於 Hypervisor 的虛擬機的部署方式,Docker 提供了一種更可行和划算的替代方案,這對於高密度部署環境尤爲有用,例如在構建私有云或 PaaS。固然,當你想在有限的資源裏部署更多的應用時,Docker 對於中小型的部署也很是有用。

 

Docker 的架構?

Docker 是 Client/Server 的架構,Docker 客戶端與 Docker daemon 進行交互,daemon 負責構建、運行和發佈 Docker 容器。客戶端能夠和服務端運行在同一個系統中,也能夠鏈接遠程的 daemon。Docker 的客戶端的 daemon 經過 RESTful API 進行 socket 通訊。

 

Docker 守護進程

就像上圖所示,Docker 守護進程(daemon)在主機上運行,用戶不能直接和守護進程打交道,可是能夠經過 Docker 客戶端與其進行交互。

 

Docker 客戶端

Docker 客戶端—— 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 鏡像是如何工做的?

咱們已經知道 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 或你本身的註冊中心。

利用 Docker 客戶端,你能夠搜索已經發布的鏡像,而後將其拉取到你的 Docker 主機上,以便於基於這些鏡像構建容器。

Docker Hub 爲鏡像提供了公共的和私有的存儲空間。公共的存儲空間任何人都可以在上面搜索和下載,私有存儲空間僅對你本人或你的團隊開放搜索以及拉取下載,你能夠經過這裏註冊一個私有的存儲空間。

 

容器是如何工做的?

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

 

運行一個容器時到底發生了什麼?

不論是經過 Docker 命令仍是 API 調用的方式,Docker 客戶端都會通知 Docker 的守護進程運行一個容器。

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

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

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

那麼咱們看看運行上述命令時到底發生了什麼?

按照順序,Docker 依次幹了以下事情:

  • 拉取 ubuntu 鏡像:Docker 首先檢查一下 ubuntu 鏡像在本地服務器上存不存在,若是不存在,則自動從 Docker Hub 中下載,若是已經存在則直接利用這個鏡像來啓動一個新的容器。
  • 建立一個新的容器:若是 Docker 本地服務器中存在這個鏡像,那麼就據此來啓動一個容器。
  • 分配一個文件而且將其掛載到一個可讀寫的層:容器在此文件系統中被建立,而且將其做爲一個可讀寫的層添加到鏡像中。
  • 分配一個網絡或橋接的接口:建立一個網絡的接口以便於 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。

 

容器格式(Container format)

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

相關文章
相關標籤/搜索