1. 程式人生 > >Docker(一):認識Docker

Docker(一):認識Docker

soft -o 分享圖片 ffffff .com tro dock 默認 com

Docker是一個開源的應用容器引擎,使用Go語言開發,基於Linux內核的CGroup,Namespace,Union FS等技術實現,對應用程序進行封裝隔離,並且獨立於宿主機與其他進程,這種運行時封裝的狀態稱為容器。是一種系統級的虛擬化技術。
Docker早起版本實現是基於LXC,並進一步對其封裝,包括文件系統、網絡互聯、鏡像管理等方面,極大簡化了容器管理。從0.7版本以後開始去除LXC,轉為自行研發的libcontainer,從1.1開始,進一步演進為使用runc和containerd。

2014年4月9日,發布第一個正式版本v1.0。
2017年2月8日,發布v1.13.1
2017年3月1日,發布v17.03-CE版本,從此版本開始分為企業版和社區版。

從下圖可以看出從2106年Docker技術引起爆發式關註。
技術分享圖片

1.1 Docker思想

技術分享圖片

Docker的思想源於集裝箱,集裝箱解決了什麽問題呢?在早期運輸貨物需要不同分類的船,例如運輸水果的船,運輸生活用品的船,有了集裝箱後,在大船上,可以把貨物分類到不同的集裝箱中,水果一個集裝箱,生活用品一個集裝箱,它們之間互不影響,只要把貨物封裝好集裝箱裏,就可以把不同類的貨物一起運走。
通過Docker logo也可以看出所以然來,Docker就像大船,集裝箱就是容器。
一條鯨魚拖著若幹個集裝箱的經典形象已經深入人心。
技術分享圖片

Docker理念是將應用及依賴包打包到一個可移植的容器中,可發布到任意Docker Engine上。使用沙箱機制運行程序,程序之間相互隔離。

隨著Docker的火熱,docker、oci、runc、containerd等等名詞也逐漸傳播開來。這麽多的名詞,也容易讓人混淆,下面對相關名詞和其之間的聯系進行一下梳理和總結,方便大家更好地理解。

1.2 OCI

在2015年,由Docker、Redhat、Google、IBM、Microsoft等廠商共同成立OCI(Open Container Initiative)的組織,其目的圍繞容器技術指定開放標準和規範。
在2017年7月,OCI v1.0正式發布,其中包含兩個規範:容器運行時(runtime)和鏡像規範(image),有了這兩個規範,不同組織和廠商開發的容器就能夠在不同的Container引擎上運行。這樣就保證了容器的可移植性和互操作性。

OCI下一步關鍵工作是提供認證,以驗證開發者的產品和項目是否符合規範。

1.3 Docker架構概覽

技術分享圖片

Docker daemon

Docker采用C/S架構,Dcoker daemon作為服務端接受來自客戶端請求,並處理這些請求,比如創建容器、管理鏡像。
為了兼容OCI標準,Docker1.1之後也做了架構調整,Docker容器運行已經不是簡單的通過Docker daemon來啟動,而是集成了containerd、runc等多個組件。
如下圖:

技術分享圖片
Containerd:是一個簡單的守護進程,管理shim,向Docker Engine提供接口。使用UnixSocket通信,協議是grpc。
Shim:管理一個容器
runC:運行一個容器。是基於OCI標準的一個容器技術實現,是一個可以直接創建和運行容器的工具。runc直接與容器所依賴的cgroups/kernel等進行交互,負責容器所需環境。
工作流程:
dockerd拿到鏡像後,通過grpc通知docker-containerd進程啟動容器,docker-containerd收到dockerd啟動容器請求之後,再啟動docker-containerd-shim進程,docker-containerd-shim進程啟動後,按照runtime準備運行環境,再啟動docker-runc進程。docker-runc進程打開容器的配置文件,找到rootfs位置,根據配置文件啟動相應進程。

Containers

Container中文意思是集裝箱,很多人叫容器,其實延續了原理的Linux container,不管叫哪個,含義是一樣的。我覺得叫容器比較合適。容器本質上是Linux系統上的一個進程,這個父進程可能會有多個子進程組成,這個一組進程受資源限制,與其他組進程之間隔離。這種運行時的狀態成為容器。

Images

Docker的流行,很大因素是取決於有數十萬計免費的應用鏡像,使得用戶或者開發者很容器找到可用的鏡像。
鏡像不是一個單一的文件,而是有多層構成。可以理解為鏡像是創建容器的模板,一個鏡像可以創建N個容器。鏡像通常封裝了一個應用的基礎環境。
在未來數月,Amazon Container Registry、Google Container Registry、Docker Hub 及 Quay 等 Container 儲存庫,也都將支援 OCI 映像檔標準。

Docker Client

通常說的Docker,指的是Docker Engine,是以daemon模式運行。而Docker CLI是客戶端,用於管理Docker Engine,例如鏡像管理、容器管理等操作。

Registry

容器是通過鏡像創建的,大量的鏡像需要找一個地方存放,這就需要Registry(註冊中心)。
企業通常自建私有倉庫,也可以使用公共倉庫,例如:

  • Docker Hub
    地址:https://hub.docker.com
    Docker官方提供的公共托管Registry,上面有很多現成的鏡像,Docker CLI默認就是從這個倉庫下載的。
  • Quay.io
    地址:https://quay.io
    另一個公共托管的Registry,提供與Docker Hub類似的服務。

技術分享圖片

Docker(一):認識Docker