理解Docker架構

Docker是一個用於開發,發佈和運行應用程序的開放平臺。Docker被設計用於更快的交付你的應用。使用Dokcer,你可以將你的應用從基礎設施中分離出來,並且向對待一個管理應用程序一樣對待你的基礎設施。Docker幫助你更快的發佈代碼,更快的測試,更快的部署和縮短編寫代碼和運行代碼的週期。

Docker通過組合帶有工作流和工具的內核容器化特徵來實現,這些工具能夠幫助你管理和部署你的應用。

在她的內核,Docker提供了一個方式,該方式能夠在一個容器中安全分離的運行任何程序。這種分離和安全性允許你同時在你的主機上運行任何容器。容器的輕量化特徵,不帶額外的虛擬機加載來運行,意味着你可以獲取儘可能多的硬件。

圍繞着容器的是工具和一個平臺,他們可以以下面幾個方式幫助你:

  • 將你的應用(和支持的組件)帶入到Docker容器中。
  • 分發和發佈這些容器到你的團隊中用於後期開發和測試。
  • 部署這些應用到你的產品uanjing中,無論他是在一個本地數據中心還是在雲上。

我可以使用Docker幹啥?

1、更快的發佈你的應用

Docker在幫助縮短開發生命週期方面做的很完美。Docker允許你的應用在本地容器中開發,該容器包含你的應用和服務程序。然後他會集成一個連續的集合體和部署工作流。

舉個例子,你的開發者本地編寫代碼並且和他們的同事使用Docker共享他們的開發棧。當他們完成之後,他們推送他們的代碼和棧進入到一個測試環境中,運行任何必須的測試。從測試環境中,你可以推送Docker鏡像到產品中,並部署你的代碼。

2、更簡單的部署和擴展

Docker的基於容器的平臺允許高度可移植的工作負載。Docker容器可以運行在一個開發者本地主機上,在一個數據中心的物理或虛擬機上,或者是在雲上。

Docker的可移植性和輕量性特徵也使得動態管理工作負載更加容易。你可以使用Docker更快的擴展和卸載應用和服務。Docker的速度意味着擴展可以更加接近真實的時間。

3、實現更高的密度和運行更多的工作負載

Docker是輕量的和快速的。相比較基於管理程序的虛擬機,他提供一個切實可行的,性價比高的選擇。這在高密度環境中是及其有用的:例如,構件你自己的雲或PAAS。但是他用於小中型的部署,你想要獲取更多的資源,也是很有用的。

啥是主要的Docker組件?

Docker有兩個主要組件:

  • Docker引擎:開源的容器化平臺。
  • Docker Hub:我們的用於分享和管理Docker容器的SAAS平臺。

啥是Docker的架構?

Docker使用一個客戶端服務器架構。Docker客戶端和Docker守護進程交流,Docker守護進程做非常重要的工作,構建,運行和分發你的Docker容器。Docker客戶端和守護進程可以運行在同樣的系統上,或者是你可以連接一個Docker客戶端到一個遠程Docker守護進程中。Docker客戶端和守護進程通過sockets或通過RESTful API進行溝通交流。

這裏寫圖片描述

Docker守護進程

正如上面的圖片顯示,Docker守護進程運行在一個主機機器中。用戶不直接和守護進程交互,而是通過Docker客戶端。

Docker客戶端

Docker客戶端,以docker二進制的形式出現,是Docker最基本的用戶接口。他接收來自用戶的命令,然後和Docker守護進程來回溝通。

Docker內部

爲了能夠理解Docker的內部,你需要去理解下面三個資源:

  • Docker鏡像
  • Docker註冊處
  • Docker容器
Docker鏡像

一個Docker鏡像是一個只讀的模板。例如,一個鏡像可以包含一個帶有Apache和你的web應用的Ubuntu操作系統。鏡像被用來創建Docker容器。Docker提供了一個簡單的方式來構建一個新的鏡像或更新一個存在的鏡像,或者是你可以下載其他人已經創建的Docker鏡像。Docker鏡像是Docker的build組件。

Docker註冊處

Docker註冊處保留鏡像。這些是來自於上傳或下載鏡像的公共或私密存儲的地方。公共的Docker註冊處又Docker Hub提供。他提供了一個你可以使用的已存鏡像的集合。這些可以是你自己創建的或其他人創建的你可以使用的鏡像。Docker註冊處是Docker的distribution組件。

Docker容器。

Docker容器和目錄是相似的。一個Docker容器可以保存任何東西,這些東西是運行一個應用程序所必須的。每一個容器都是從一個Docker鏡像中創建的。Docker容器可以被運行,開啓,停止,移動和刪除。每一個容器都是一個分離的和安全的應用平臺。Docker容器是Docker的運行組件。

Docker鏡像如何工作?

我們已經知道Docker鏡像是一個只讀的模板,在鏡像中Docker容器被創建。每一個容器包含一系列層。Docker使用union文件系統來組合這些層到一個單一的鏡像中。Union文件系統允許分離文件系統的文件和目錄作爲分支,被透明化的覆蓋,構成一個單一的一致的文件系統。

Docker非常輕量化的一個原因就是因爲這些層。當你改變了一個Docker鏡像的時候–例如,更新一個應用程序到一個新版本–一個新的層被構建。因此,不是替換整個鏡像或整體重新構建。就像你可能在一個虛擬機上工作,僅僅那一層被添加或更新。現在你不必發佈一個整體的新的鏡像,僅僅更新便可。這使得發佈Docker鏡像更快更簡單。

每一個鏡像都從一個基礎鏡像開始,例如,ubuntu,一個基本的Ubuntu鏡像,或者是fedora,一個基本的Fedora鏡像。你也可以使用你自己的鏡像作爲新鏡像的基礎鏡像,例如,如果你有一個基本的Apache鏡像,你可以使用這個作爲你的Web應用鏡像的基本鏡像。

Docker鏡像從這些基本鏡像中使用一個簡單的,可描述的步驟,我們稱作指令,被構件。每一個指令在我們的鏡像中創建一個新層。指令包含的行爲類似於:

  • 運行一個命令
  • 添加一個文件或目錄
  • 創建一個環境變量
  • 當從這個鏡像中創建了一個容器的時候哪一個進程運行

這些指令被存儲在被稱爲Dockerfile的文件中。一個Dockerfile是一個基於包含構件鏡像的指令和命令腳本的文本文件。當你需要構件一個鏡像,執行指令返回一個最終鏡像的時候,Docker讀取這個Dockerfile

Docker註冊處如何工作?

Docker註冊處是你的Docker鏡像的保存處。一旦你構建了一個Docker鏡像,你可以將他推送到一個公共的註冊處例如Docker Hub或者是到你自己的註冊處。

使用Docker客戶端,你可以搜索已經發布的鏡像和下載到你的Docker主機中來從他們中構建容器。

Docker Hub既提供公共的也提供私人的鏡像存儲。公共存儲可以被任何人搜索和下載。私人存儲僅僅你和你的用戶可以下載使用。

容器如何工作?

一個容器包含一個操作系統,用戶文件和元數據。正如我們看到的,每一個容器都是從鏡像中被構建的。那個鏡像告訴Docker容器保存什麼數據,當容器發佈的時候運行什麼進程,還有其他一些配置數據。Docker鏡像是隻讀的。當Docker從一個鏡像中運行一個容器的時候,他在鏡像的最頂層添加一個讀寫層(使用union文件系統),在該層中你的應用程序可以運行。

當你運行一個容器的時候發生了啥?

無論是使用docker二進制還是API,Docker客戶端告訴Docker守護程序來運行一個容器。

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

Docker引擎客戶端使用帶有run選項的docker二進制運行一個新的容器。Docker客戶端需要告訴Docker守護進程運行容器的最低限度是:

  • 容器從哪一個Docker鏡像中構建的,例如,ubuntu
  • 當他被髮布的時候,內部容器想要運行的命令,例如,/bin/bash

所以,當我們運行這個命令的時候鉤子下面發生了什麼?

按照次序,Docker引擎做:

  • 推出ubuntu鏡像:Docker引擎檢查當前的ubuntu鏡像。如果鏡像已經存在,Docker引擎使用他作爲新的容器。如果在當前主機上不存在,然後Docker引擎從Docker Hub中拉取下來。
  • 創建一個新的容器:一旦Docker引擎有鏡像,他便使用它來創建一個容器。
  • 分配文件系統,掛載一個讀寫層:容器在文件系統中被創建,並且一個讀寫層被添加到鏡像中。
  • 分配一個網絡/橋接口。創建一個網絡接口來允許Docker容器與本地主機交流。
  • 設置一個IP地址。從一個池中尋找和綁定一個可用的IP地址。
  • 執行一個你指定的進程。運行應用。
  • 捕獲和獲取應用輸出:連接和記錄標準輸入,輸出和錯誤,來告訴你你的應用是如何工作的。

現在你就擁有一個運行的容器了。現在你可以管理你的容器,與你的應用交互,當結束的時候,可以停止和移除你的容器。

底層的技術

Docker是使用Go編寫的,使用多個內核特徵來分發其功能。

命名空間

Docker充分使用稱爲namespace的技術來提供分離的工作空間,我們稱爲容器。當你運行一個容器,Docker爲這個容器創造一些列命名空間。

這個提供了一層分離:容器的每一個方面運行在他自己的明明空間中,並且不能訪問其命名空間之外的數據。

Docker引擎在Linux中使用的命名空間有:

  • pid命名空間:進程分離
  • net命名空間:管理網絡接口
  • ipc命名空間:管理IPC資源訪問
  • mnt命名空間:管理掛載點
  • uts命名空間:分離內核和版本識別

控制組

在Linux上的Docker引擎也會使用其他的技術稱爲cgroups或控制組。在分離體中運行程序的關鍵就是隻讓他們使用你想要的資源。這能保證容器在主機中是一個優秀的多租戶居民。控制組允許Docker引擎共享可用硬件資源,如果必要,設置限制和約束。例如,爲特定容器限制可用內存。

Union文件系統

Union文件系統或者是UnionFS,是一個文件系統,其通過創建層來操作,使得他們更加輕量化和快速。Docker引擎使用union文件系統來爲容器提供構件塊。Docker引擎可以使用多個union文件系統變量,包括AUFS,btrfs,vfs和DeviceMapper。

容器格式

Docker引擎組合這些組件到一個包中,我們稱爲一個容器格式。默認的容器格式被稱爲libcontainer。在將來,Docker可能支持其他容器格式,例如,通過集成BSD Jails或Solaris Zones。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章