本章所講內容
- Docker概念
- Docker核心
- Docker組成
- Docker架構
- Docker應用場景
- Docker優點
- Docker與虛機及OpenStack區別
Docker官網 https://www.docker.com/
Docker鏡像源下載地址https://hub.docker.com/explore/
Docker 概念
Docker是一個開源的應用容器引擎,讓開發者可以打包他們的應用以及依賴包到一個可移植的容器中,然後發佈到任何流行
的Linux機器上,也可以實現虛擬化;Docker是 dotCloud 公司開源的一個基於 LXC 的高級容器引擎,源代碼託管在Github
上,基於go語言開發並遵從 Apache2.0 協議開源;Docker和其它虛擬化不同的是,Docker是通過虛擬化技術來提供容器資源
隔離與安全保障,由於Docker通過操作系統層的虛擬化實現隔離,所以Docker容器在運行時,不需要類似虛擬機(VM)額外的
操作系統開銷,提高資源利用率。
擴展
LXC 爲 Linux Container 的簡寫。Linux Container 容器是一種內核虛擬化技術,可以提供輕量級的虛擬化,
以便隔離進程和資源,而且還需要提供命令解釋機制以及全虛擬化的其他複雜性。LXC 主要通過來自 kernel 的
namespace 實現每個用戶實例之間的相互隔離,通過 cgroup 實現對資源的配額和度量。
Docker 核心
Docker核心的東西主要爲:Control Groups、Namespace
Cgroups實現了資源控制、Namespace實現了資源隔離
CGroup
cgroup是control groups的縮寫,是Linux內核提供的一種可以限制、記錄、隔離進程組所使用的物理資源的機制。物理資源如:cpu、memmory、
IO等等。該機制最初有google工程師提出,後來被整合進linux內核,cgroups也是LXC爲實現虛擬化所使用的資源管理手段。Namespace
namespace是對內核內的全局資源的封裝,使得每一個namespace中都有一份獨立的資源,因此不同進程在各自的namespace中對同一份資源進行操作
互不影響。小結
假如我們有四個容器,就需要有四個namespace(命令空間)和四個cgroup;內核把硬件資源按自己規劃分配給各個cgroup,例如分給第一個cgroup
2顆CPU、4G內存、50G硬盤、100M帶寬等,分給其它cgroup各不一樣;然後再把每個cgroup應用到namespace上,每個容器就有了獨立的硬件資源,從而實
現了物理資源隔離。這個機制就防止了假如有一臺容器瘋狂申請硬件資源從而導致其它容器硬件資源不足。
Docker 組成
Docker爲C/S架構,即爲Docker Server/Client;使用遠程API來管理Docker容器。
Docker進程可以比喻爲Docker Server
Docker內的容器可以比喻爲Docker Client
注:如果docker的服務端掛了,運行在docker的容器全部會掛掉
Docker 架構
架構示意圖
Docker_Client
運行docker命令的client。
Docker_daemon
包含Images(docker鏡像)及Containers(Docker容器)的Docker daemon(docker守護進程)主機
Docker_Registry
docker用來保存鏡像的倉庫,也可以理解爲代碼控制中的代碼倉庫,不過 Docker Hub提供了龐大的鏡像集合供使
用小結
上面講到了Docker服務端是使用遠程API來管理Docker容器的,而他們之間使用的是什麼協議呢?
是HTTPS協議,由上面的架構圖所示,Docker Client到Docker_HOST之間通訊使用的就是HTTPS協議,當我們去Docker hub下載鏡像的時候,從Registr
y下載到Images之間使用的也是HTTPS協議。
Docker工作流程
1. Client使用 docker pull <image> 命令從倉庫把image拉到docker_host,默認拉取的倉庫地址是 Docker Hub;獲取到image後會放到Docker Image內
對應的命令如下: [root@centos7_code1 ~]# docker pull ubuntu #下載ubuntu鏡像
[root@centos7_code1 ~]# docker images #查看本地所有鏡像
REPOSITORY TAG IMAGE ID CREATED SIZE
docker.io/ubuntu latest 74f8760a2a8b 9 days ago 82.4 MB
docker.io/centos latest 49f7960eb7e4 7 weeks ago 200 MB
2. Client使用 docker run -it --rm <image> /bin/bash命令在Docker_Host上啓動該鏡像爲容器運行
對應的命令如下: [root@centos7_code1 ~]# docker run -itd ubuntu /bin/bash
[root@centos7_code1 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
e56efa7bd7b1 ubuntu "/bin/bash" 2 minutes ago Up 2 minutes sad_lamarr
注:image和container之間的關係類似程序與進程之間的關係,一個靜若處子,一個動如脫兔。比如程序QQ,運行一次就是1個QQ進程,再運行一個QQ就是第2個QQ進程。
同樣道理,一個image也可以運行多份container
Docker 應用場景
常用的8個Docker的真實使用場景,分別是簡化配置、代碼流水線管理、提高開發效率、隔離應用、整合服務器、調試能力、多租戶環境、快速部署。我們一直在談Docker,Docker怎麼使用,在怎麼樣的場合下使用?
簡化配置
這是Docker公司宣傳的Docker的主要使用場景。虛擬機的最大好處是能在你的硬件設施上運行各種配置不一樣的平
臺(軟件、系統),Docker在降低額外開銷的情況下提供了同樣的功能。它能讓你將運行環境和配置放在代碼中然後部署
,同一個Docker的配置可以在不同的環境中使用,這樣就降低了硬件要求和應用環境之間耦合度。代碼流水線管理
前一個場景對於管理代碼的流水線起到了很大的幫助。代碼從開發者的機器到最終在生產環境上的部署,需要經過很
多的中間環境。而每一箇中間環境都有自己微小的差別,Docker給應用提供了一個從開發到上線均一致的環境,讓代碼的
流水線變得簡單不少。提高開發效率
這就帶來了一些額外的好處:Docker能提升開發者的開發效率。如果你想看一個詳細一點的例子,可以參考Aater在
DevOpsDays Austin 2014 大會或者是DockerCon上的演講。不同的開發環境中,我們都想把兩件事做好。一是我們想
讓開發環境儘量貼近生產環境,二是我們想快速搭建開發環境。理想狀態中,要達到第一個目標,我們需要將每一個服務都
跑在獨立的虛擬機中以便監控生產環境中服務的運行狀態。然而,我們卻不想每次都需要網絡連接,每次重新編譯的時候遠
程連接上去特別麻煩。這就是Docker做的特別好的地方,開發環境的機器通常內存比較小,之前使用虛擬的時候,我們經
常需要爲開發環境的機器加內存,而現在Docker可以輕易的讓幾十個服務在Docker中跑起來。隔離應用
有很多種原因會讓你選擇在一個機器上運行不同的應用,比如之前提到的提高開發效率的場景等
整合服務器
正如通過虛擬機來整合多個應用,Docker隔離應用的能力使得Docker可以整合多個服務器以降低成本。由於沒有多
個操作系統的內存佔用,以及能在多個實例之間共享沒有使用的內存,Docker可以比虛擬機提供更好的服務器整合解決方
案。調試能力
Docker提供了很多的工具,這些工具不一定只是針對容器,但是卻適用於容器。它們提供了很多的功能,包括可以爲
容器設置檢查點、設置版本和查看兩個容器之間的差別,這些特性可以幫助調試Bug。多租戶環境
另外一個Docker有意思的使用場景是在多租戶的應用中,它可以避免關鍵應用的重寫。我們一個特別的關於這個場景
的例子是爲IoT(譯者注:物聯網)的應用開發一個快速、易用的多租戶環境。這種多租戶的基本代碼非常複雜,很難處理
,重新規劃這樣一個應用不但消耗時間,也浪費金錢。使用Docker,可以爲每一個租戶的應用層的多個實例創建隔離的環
境,這不僅簡單而且成本低廉,當然這一切得益於Docker環境的啓動速度和其高效的diff命令。快速部署
在虛擬機之前,引入新的硬件資源需要消耗幾天的時間。虛擬化技術(Virtualization)將這個時間縮短到了
分鐘級別。而Docker通過爲進程僅僅創建一個容器而無需啓動一個操作系統,再次將這個過程縮短到了秒級。這正是
Google和Facebook都看重的特性。
Docker 優點
靈 活:即使是最複雜的應用也可以集裝箱化。
輕量級:容器利用並共享主機內核。
可互換:您可以即時部署更新和升級。
便攜式:您可以在本地構建,部署到雲,並在任何地方運行。
可擴展:您可以增加並自動分發容器副本。
可堆疊:您可以垂直和即時堆疊服務。
Docker 與虛擬機及 OpenStack區別
Docker與虛擬機
一個容器中運行原生 Linux和共享主機與其它容器的內核。它運行一個獨立的進程,不佔用任何其他可執行文件的內存,使
其輕量級。相比之下,虛擬機(VM)運行一個完整的“客戶”操作系統,通過虛擬機管理程序對主機資源進行虛擬訪問。通常,VM
提供的環境比大多數應用程序需要的資源更多。虛擬機需要爲每個應用創建單獨的操作系統來實現隔離,而Docker使用內核隔離
技術來實現隔離,無需爲每個應用創建相應的操作系統。
Docker與OpenStack