Docker是一個開源的應用容器引擎,使用Go語言開發,基於Linux內核的CGroup,Namespace,Union FS等技術實現,對應用程序進行封裝隔離,而且獨立於宿主機與其餘進程,這種運行時封裝的狀態稱爲容器。是一種系統級的虛擬化技術。
Docker早起版本實現是基於LXC,並進一步對其封裝,包括文件系統、網絡互聯、鏡像管理等方面,極大簡化了容器管理。從0.7版本之後開始去除LXC,轉爲自行研發的libcontainer,從1.1開始,進一步演進爲使用runc和containerd。docker
2014年4月9日,發佈第一個正式版本v1.0。
2017年2月8日,發佈v1.13.1
2017年3月1日,發佈v17.03-CE版本,今後版本開始分爲企業版和社區版。網絡
從下圖能夠看出從2106年Docker技術引發爆發式關注。
架構
Docker的思想源於集裝箱,集裝箱解決了什麼問題呢?在早期運輸貨物須要不一樣分類的船,例如運輸水果的船,運輸生活用品的船,有了集裝箱後,在大船上,能夠把貨物分類到不一樣的集裝箱中,水果一個集裝箱,生活用品一個集裝箱,它們之間互不影響,只要把貨物封裝好集裝箱裏,就能夠把不一樣類的貨物一塊兒運走。
經過Docker logo也能夠看出因此然來,Docker就像大船,集裝箱就是容器。
一條鯨魚拖着若干個集裝箱的經典形象已經深刻人心。
ide
Docker理念是將應用及依賴包打包到一個可移植的容器中,可發佈到任意Docker Engine上。使用沙箱機制運行程序,程序之間相互隔離。工具
隨着Docker的火熱,docker、oci、runc、containerd等等名詞也逐漸傳播開來。這麼多的名詞,也容易讓人混淆,下面對相關名詞和其之間的聯繫進行一下梳理和總結,方便你們更好地理解。spa
在2015年,由Docker、Redhat、Google、IBM、Microsoft等廠商共同成立OCI(Open Container Initiative)的組織,其目的圍繞容器技術指定開放標準和規範。
在2017年7月,OCI v1.0正式發佈,其中包含兩個規範:容器運行時(runtime)和鏡像規範(image),有了這兩個規範,不一樣組織和廠商開發的容器就可以在不一樣的Container引擎上運行。這樣就保證了容器的可移植性和互操做性。
OCI下一步關鍵工做是提供認證,以驗證開發者的產品和項目是否符合規範。3d
Docker採用C/S架構,Dcoker daemon做爲服務端接受來自客戶端請求,並處理這些請求,好比建立容器、管理鏡像。
爲了兼容OCI標準,Docker1.1以後也作了架構調整,Docker容器運行已經不是簡單的經過Docker daemon來啓動,而是集成了containerd、runc等多個組件。
以下圖:blog
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位置,根據配置文件啓動相應進程。接口
Container中文意思是集裝箱,不少人叫容器,其實延續了原理的Linux container,無論叫哪一個,含義是同樣的。我以爲叫容器比較合適。容器本質上是Linux系統上的一個進程,這個父進程可能會有多個子進程組成,這個一組進程受資源限制,與其餘組進程之間隔離。這種運行時的狀態成爲容器。進程
Docker的流行,很大因素是取決於有數十萬計免費的應用鏡像,使得用戶或者開發者很容器找到可用的鏡像。
鏡像不是一個單一的文件,而是有多層構成。能夠理解爲鏡像是建立容器的模板,一個鏡像能夠建立N個容器。鏡像一般封裝了一個應用的基礎環境。
在將來數月,Amazon Container Registry、Google Container Registry、Docker Hub 及 Quay 等 Container 儲存庫,也都將支援 OCI 映像檔標準。
一般說的Docker,指的是Docker Engine,是以daemon模式運行。而Docker CLI是客戶端,用於管理Docker Engine,例如鏡像管理、容器管理等操做。
容器是經過鏡像建立的,大量的鏡像須要找一個地方存放,這就須要Registry(註冊中心)。
企業一般自建私有倉庫,也可使用公共倉庫,例如: