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。