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技術引起爆發式關注。
docker的思想源于集裝箱,集裝箱解決了什麼問題呢?在早期運輸貨物需要不同分類的船,例如運輸水果的船,運輸生活用品的船,有了集裝箱後,在大船上,可以把貨物分類到不同的集裝箱中,水果一個集裝箱,生活用品一個集裝箱,它們之間互不影響,隻要把貨物封裝好集裝箱裡,就可以把不同類的貨物一起運走。
通過docker logo也可以看出是以然來,docker就像大船,集裝箱就是容器。
一條鲸魚拖着若幹個集裝箱的經典形象已經深入人心。
docker理念是将應用及依賴包打包到一個可移植的容器中,可釋出到任意docker engine上。使用沙箱機制運作程式,程式之間互相隔離。
随着docker的火熱,docker、oci、runc、containerd等等名詞也逐漸傳播開來。這麼多的名詞,也容易讓人混淆,下面對相關名詞和其之間的聯系進行一下梳理和總結,友善大家更好地了解。
在2015年,由docker、redhat、google、ibm、microsoft等廠商共同成立oci(open container initiative)的組織,其目的圍繞容器技術指定開放标準和規範。
在2017年7月,oci v1.0正式釋出,其中包含兩個規範:容器運作時(runtime)和鏡像規範(image),有了這兩個規範,不同組織和廠商開發的容器就能夠在不同的container引擎上運作。這樣就保證了容器的可移植性和互操作性。
oci下一步關鍵工作是提供認證,以驗證開發者的産品和項目是否符合規範。
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位置,根據配置檔案啟動相應程序。
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(注冊中心)。
企業通常自建私有倉庫,也可以使用公共倉庫,例如:
docker hub
位址:https://hub.docker.com
docker官方提供的公共托管registry,上面有很多現成的鏡像,docker cli預設就是從這個倉庫下載下傳的。
quay.io
位址:https://quay.io
另一個公共托管的registry,提供與docker hub類似的服務。