認識docker架構
Docker 是什麼 ?
Docker是一個開源的平臺,用於開發、航運(打包和遷移)和運行應用程序。Docker的設計目是爲了解決應用的迅速交付。使用Docker你可以將你的應用和基礎平臺分離,方便基礎平臺的管理。Docker爲你的航運代碼、測試、部署加速,縮短了編碼到運行的時間週期。
Docker將一個輕量級的容器虛擬技術結合管理和部署應用的流程工具來實現上述的功能。
其核心思想是,Docker提供一個解決方案,在一個容器裏運安全獨立地運行絕大多數的應用。獨立且安全的特性允許你在宿主機上可以同時運行多個容器。這個輕量級容器的本質,不需要依賴額外的超級監督者(hyvpervistor),這個意味你可以充分的利用你的硬件。
圍繞着容器虛擬的工具和平臺,對下面幾個方面有幫助:
- 讓你的應用(和支持的組件)進入到Docker容器裏。
- 分佈和航運這些容器到你的團隊裏,以便做更生層次的開發和測試。
- 部署這些應用到你的生產環境中,無論它是在一個本地數據中心或雲上。
我可以用Docker做什麼?
快速交付你的應用
Docker可以幫你完善你的開發生命週期。Docker允許你的開發者在一個本地容器上開發你的應用和服務。它可以集成到一個持續整合部署的流程裏。
例如,你的開發人員編寫的本地代碼,通過Docker分享他們的開發棧給他們的同事。當他們準備好時,可以將這些代碼和棧部署到一個測試的環境上,做任何的必要測試。經過測試環境後,你就可以部署到生產環境中了。
更容易部署和擴展
Docker 的基於容器平臺特性允許高的移植性。Docker容器可以在一個開發者的本地主機、一個數據中心或雲平臺裏的物理或虛擬機上運行。
Docker的可移植和輕量級的特性讓動態管理工作負載變得簡單。你可以使用Docker快速上下擴展應用和服務。Docker這種擴展速度接近實時。
實現更高的密度和運行更多的負載
Docker是輕量且快速的。它提供一個可行的、高性能的替代基於hypervistor虛擬機的方案。這在高密度的環境中特別有用:例如,構建屬於你自己的雲或平臺既服務。然而,它對中小型的部署也有幫助,當你的想在現有的資源下獲得更多的性能。
Docker 有什麼主要的組件?
Docker有兩主要的組件:
- Docker:開源容器虛擬平臺。
- Docker Hub:我們的軟件既服務(saas)平臺,用於分享和管理Docker容器。
注意:Docker採用開源Apache 2.0許可。
Docker的架構是什麼樣子?
Docker採用的是c/s的架構。Docker客戶端和Docker守護進程通信,來完成構建、運行和分發你的Docker容器。Docker客戶端和守護進程可以運行在同一系統下,或你可以使用一個Docker客戶端連接到一個遠程的Docker守護進程。Docker客戶端和守護進程可以通過socket(套接字)或RESTful API進行通信。
Docker守護進程
如上圖所示,Docker守護進程運行在宿主機上。用戶不能直接跟守護進程交互,需要經過Docker客戶端。
Docker客戶端
Docker客戶端,docker
二進制格式,是用戶和Docker交互的主要接口。它可以接收用戶的指令,實現和Docker守護進程的雙工通信。
Docker內部構造
爲了理解Docker的內部構建,你需要了解三個組件:
- Docker 鏡像
- Docker 註冊中心(registry)
- Docker 容器
Docker 鏡像
一個Docker鏡像是一個只讀模板。例如,一個鏡像可能包含一個安裝了Apache和你的web應用的Ubuntu操作系統。鏡像通常用於創建容器。Docker提供一個簡單的方法去構建一個新的鏡像或更新已存在的鏡像,或你可以下載其他人已經創建好的鏡像。Docker鏡像是Docker的構建組件。
Docker 註冊中心(registry)
Docker註冊中心可以保存鏡像。目前有分私有和公共註冊中心,你對它們進行鏡像上傳或下載操作。公共Docker註冊中心是 Docker Hub提供的。它爲你提供海量的、可用的鏡像集合。你可以自己創建或使用他人預先創建的鏡像。Docker註冊中心是Docker的分發組件。
Docker 容器
Docker容器類似一個目錄。一個docker容器保存着運行應用的所有東西。每個容器都是有鏡像創建的。Docker容器可以被運行、啓動、遷移和刪除。每個容器都是一個獨立且安全的應用平臺。Docker容器是Docker的運行組件。
Docker是如何工作?
到目前爲止,我們已經學習了:
- 你可以構建一個包含你的應用的鏡像。
- 你可以基於Docker鏡像創建Docker容器去運行你的應用。
- 你可以通過Docker Hub 或你自己註冊中心分享你的鏡像。
讓我們瞧一瞧,如何聯合這些組件(元素)在一起讓Docker工作。
Docker 鏡像是如何工作?
我們已經知道Docker鏡像只是一個只讀的模板。每個鏡像都是有一連串的層組成的。Docker使用聯合文件系統使這些層聯合到一個單一的鏡像裏。聯合文件系統允許單獨文件系統的文件和目錄,一般稱爲分支,採用透明的覆蓋,形成一個連貫的文件系統。
Docker之所以被稱爲輕量級的一個原因是這些層。當你更改一個Docker鏡像——例如,將應用更新一個版本——獲得一個新構建的層。因此,不是替換整個鏡像或全部重構,相對一個虛擬機上做些事情,你只是添加或更新一個層,而不是全部。
每個鏡像都是從一個基礎鏡像開始,例如, ubuntu
,一個Ubuntu 基礎鏡像,或者fedora
,一個Fedora基礎鏡像。你可能也使用自己的鏡像作爲基礎來構建一個新的鏡像,例如,如果你有一個Apache的基礎鏡像,你可以使用它作爲你所有的web應用鏡像基礎鏡像。
注意:Docker通常會從Docker Hub獲取這些基礎鏡像。
Docker鏡像是由這些基礎鏡像和一些列簡單的、描述性的指令集來構建的。每條指令都會在鏡像裏創建一個層。指令包括像如下的行爲:
- 運行一條命令
- 添加一個文件或文件夾
- 創建一個環境變量
- 當基於這個鏡像運行一個容器時,需要運行什麼程序
這些指令會被保存在一個稱爲Dockerfile
的文件裏。當你發送一個構建鏡像指令時,Docker會解析這個Dockerfile
文件,執行裏面的指令,返回一個最終的鏡像。
Docker 註冊中心(registry)是如何工作?
Docker註冊中心是用來保存你的Docker鏡像。一旦你構建完一個Docker鏡像,你就可以把它推送到一個註冊中心,比如,由Docker Hub提供的一個公共註冊中心或運行在你的防火牆後面的註冊中心。
使用Docker客戶端,你可以搜索那些已經存在的公共鏡像並下載它們到你的Docker宿主機上,然後基於它們構建你的容器。
Docker Hub 爲鏡像提供公共和私有兩種註冊中心。公共的存儲可以給任何人搜索和下載。私有的存儲不會出現在搜索結果裏,它只允許你和你的用戶下載鏡像。你可以在這註冊一個註冊中心計劃。
容器是如何工作?
一個容器是由一個操作系統、用戶附加的文件和元數據。正如我們所看到的,每個容器都是基於一個鏡像構建的。那個鏡像告訴Docker,創建的容器需要保存什麼,容器啓動的時候需要運行什麼程序,和各種其他的配置數據。Docker鏡像是隻讀的。當Docker基於一個鏡像創建運行一個容器時,它就在鏡像(使用一個聯合文件系統,正如我們前面看到)的頂層添加了一層可讀寫層,你的應用就是這裏運行。
當你運行一個容器時,發生了什麼?
不管是使用docker
二進制或API,Docker客戶端告訴|Docker守護進程要運行一個容器。
$ docker run -i -t ubuntu /bin/bash
然我們分析一下這個命令。Docker客戶端是使用docker
二進制加上run
選項去告訴守護進程,它想啓動一個新的容器。Docker守護進程要運行這個容器,要求Docker客戶端必須提供下面信息:
- 容器是基於那個Docker鏡像構建的,這裏是
ubuntu
一個Ubuntu的基礎鏡像。 - 當容器啓動時候,你希望運行的命令,這裏是
/bin/bash
,在新容器裏啓動Bash shell。
當我們運行這個命令時,底層發生了什麼?
按順序,Docker做了一下事情:
- 拉取
ubuntu
鏡像:Docker 檢查ubuntu
鏡像是否存在,如果它在宿主機上不存在,之後,Docker會從Docker Hub上下載它。如果鏡像已經存在,之後Docker使用它創建一個新容器。 - 創建一個新容器:一旦Docker擁有這個鏡像,它就會使用這個鏡像創建一個容器。
- 分配一個文件系統並掛載一個讀寫層:容器被創建在文件系統裏且在鏡像裏添加一個可讀寫層。
- 分配一個網絡/網橋接口: 創建一個允許容器和宿主機通信的網絡接口。
- 設置一個IP地址:從一個可用的IP地址池裏查找並附加到容器裏。
- 執行你指定的程序:運行你的應用,等。
- 抓取並提供應用的輸出:連接日誌標準輸入、輸出、錯誤輸出應用運行情況。
你現在已經擁有一個運行的容器!這裏,你可以管理你的容器,和你的應用交互,然後,結束、停止和刪除你的容器。
底層技術
Docker使用Go語言,基於Linux內核幾個特性實現我們所需的功能。
命令空間
Docker利用一個稱爲namespaces
技術爲我們的容器提供一個孤立的工作空間。當你運行一個容器時,Docker爲那個容器創建一套命名空間。
這樣就提供一層隔離:一個容器的各個方面都運行在它自己的命令空間並沒有訪問其他的命令空間。
Docker使用的命令空間:
pid
命令空間:用於進程隔離(PID:進程ID)net
命令空間:用於管理網絡接口(NET:網絡)ipc
命令空間:用於管理IPC資源的訪問(IPC:進程間通信)mnt
命令空間:用於管理掛載點(MNT:掛載)uts
命令空間:用於隔離內核版本標識符。
cgroup
Docker也使用另外一種稱爲cgroups
的技術或控制族羣。孤立運行應用的關鍵是它們只使用你需要的資源。這樣確保容器可以合理的使用宿主機上的資源。控制族羣允許Docker去分享可用的硬件資源給容器,如果需要,可以設置限制和約束。例如,限制指定容器的可用內存。
聯合文件系統
聯合文件系統,或UnionFS,通過創建層,使得他們非常輕量和快速。Docker使用聯合文件系統提供構建容器塊。Docker可以使用幾個聯合文件系統變體:AUFS、btrfs、vfs和DeviceMapper。
容器格式
Docker聯合這些組件成一個包,我們成爲一個容器格式。默認的容器格式被稱爲 libcontainer
。Docker也支持傳統的Linux容器,使用LXC。在未來,Docker可能還支持其他容器格式,例如,通過整合BSD
Jails或Solaris Zones。
來源: <https://docs.docker.com/introduction/understanding-docker/>