6年來,Docker的這些變化你都知道嗎?
Docker和容器技術的發展可謂日新月異,本文試圖以全域性視角來梳理一下Docker目前的生態圈。
Docker自發布以來發生了很多的變化,有些方面的變化還非常大。對於技術愛好者來說,我們喜歡 酷斃新的功 能,喜歡舊功能的改善。但對生產環境中的使用者來說,他們其實不太喜歡這種頻繁的變化。不管怎樣,我們都有必要理清Docker生態系統中的眾多概念和它們之間的關係,以及Docker誕生至今(2018年)的里程碑事件。
一、百花齊放的容器技術
雖然Docker把容器技術推向了巔峰,但容器技術卻不是從Docker誕生的。實際上,容器技術連新技術都算不上,因為它的誕生和使用確實有些年頭了。下面的一串名稱可能有的你都沒有聽說過,但它們的確都是容器技術的應用:
-
Chroot Jail
-
FreeBSD Jails
-
Linux VServer
-
Solaris Containers
-
OpenVZ
-
Process Containers
-
LXC
-
Warden
-
LMCTFY
-
Docker
-
RKT
Chroot Jail
就是我們常見的Chroot命令的用法。它在1979年的時候就出現了,被認為是最早的容器化技術之一。它可以把一個程序的檔案系統隔離起來。
The FreeBSD Jail
Freebsd Jail實現了作業系統級別的虛擬化,它是作業系統級別虛擬化技術的先驅之一。
Linux VServer
使用新增到Linux核心的系統級別的虛擬化功能實現的專用虛擬伺服器。
Solaris Containers
它也是作業系統級別的虛擬化技術,專為X86和SPARC系統設計。Solaris容器是系統資源控制和通過 "區域" 提供邊界隔離的組合。
OpenVZ
OpenVZ是一種Linux中作業系統級別的虛擬化技術。它允許建立多個安全隔離的Linux容器,即VPS。
Process Containers
Process容器由Google的工程師開發,一般被稱為Cgroups。
LXC
LXC又叫Linux容器,這也是一種作業系統級別的虛擬化技術,允許使用單個Linux核心在宿主機上執行多個獨立的系統。
Warden
在最初階段,Warden使用LXC作為容器執行時。如今已被CloudFoundy取代。
LMCTFY
LMCTY是Let me contain that for you的縮寫。它是Google的容器技術棧的開源版本。 Google的工程師一直在與Docker的libertainer團隊合作,並將libertainer的核心概念進行抽象並移植到此專案中。該專案的進展不明,估計會被libcontainer取代。
Docker
Docker是一個可以將應用程式及其依賴打包到幾乎可以在任何伺服器上執行的容器的工具。
RKT
RKT是Rocket的縮寫,它是一個專注於安全和開放標準的應用程式容器引擎。 正如我們所看到的,Docker並不是第一個容器化技術,但它的確是最知名的一個。Docker誕生於2013年,並獲得了快速的發展,下圖展示了當前Docker平臺中的組成部分:
Docker立於系統基礎架構之上併為應用程式提供支撐。它由稱為Containerd的行業標準容器執行時元件,稱為Docker Swarm的本地編排工具,以及開源的Docker Community版本和提供商業管理服務的Docker Enterprise版組成。
二、與Docker相關的重要概念
Docker & LXC
Docker的第一個執行環境是LXC,但從版本0.9開始LXC被libcontainer取代。
Docker & Libcontainer
Libcontainer為Docker封裝了Linux提供的基礎功能,如Cgroups,Namespaces,NetLink和NetFilter等,如下圖所示:
2015-Docker & RunC
2015年,Docker釋出了RunC,一個輕量級的跨平臺的容器執行時。這基本上就是一個命令列小工具,可以直接利用libcontainer執行容器,而無需通過Docker Engine。RunC的目標是使標準容器在任何地方都可用。
Docker & OCI
OCI(The Open Containers Initiative)是一個輕量級的開放式管理架構,由Docker,CoreOS和容器行業的其他領導廠商於2015年建立。它維護一些專案,如RunC,還有容器執行時規範和映象規範。OCI的目的是圍繞容器行業制定標準,比如使用Docker建立的容器可以在任何其他容器引擎上執行。
2016-Docker & Containerd
2016年,Docker分拆了Containerd,並將其捐贈給了社群。將這個元件分解為一個單獨的專案,使得Docker將容器的管理功能移出Docker的核心引擎並移入一個單獨的守護程序(即Containerd)。
Docker Components
分拆完Containerd後,Docker各元件的關係如下圖所示:
至此,Docker從一個單一的軟體演變成了一套相互獨立的元件和專案。
Docker如何執行一個容器?
-
Docker引擎建立容器映像;
-
將容器映像傳遞給Containerd;
-
Containerd呼叫Containerd-Shim;
-
Containerd-Shim使用RunC來執行容器;
-
Containerd-Shim允許執行時(本例中為 RunC)在啟動容器後退出;
-
該模型帶來的最大好處是在升級Docker引擎時不會中斷容器的執行。
2017-容器成為主流
2017年是容器成為主流技術的一年,這就是為什麼Docker在Linux之外支援眾多平臺(比如Docker for Mac、Docker for Windows、Docker for AWS、GCP等)的原因。
當容器技術被大眾接受後,Docker公司意識到需要新的生產模型,這就是為什麼它開始Moby專案。
三、Moby Project
Moby專案開啟了實現協作和生產的新篇章。它是一個開源專案,旨在推進軟體的容器化。Moby專案提供了數十個樂高積木一樣的元件以及將它們組裝成定製的基於容器的系統的框架。
Docker生產模型像任何其他常見的單個開源專案一樣開始:
進而將單個專案拆分為不同的開放元件:
然後進化到可以共享這些元件以及元件集合(Assembly)的模型:
最終達到能夠提供更多關於元件和通用元件集合的協作的模型:
下面我們就來介紹一些Moby專案中的元件。
Containerd
Containerd是Docker基於行業標準建立的核心容器執行時,它可以用作Linux和Windows的守護程序,並管理整個容器生命週期。
Linuxkit
Linuxkit是Moby專案中的另一個元件,它是為容器構建安全、跨平臺、精簡系統的工具。目前已經支援的本地Hypervisor有Hyper-V和VMware。支援的雲平臺有AWS、Azure等。
Infrakit
Infrakit也是Moby專案的一部分。它是建立和管理宣告式、不可變和自我修復基礎架構的工具包。 Infrakit旨在自動化基礎架構的設定和管理,以支援分散式系統和更高級別的容器編排系統。
Infrakit對於像Docker Swarm和Kubernetes這樣的編排工具或跨越AWS等公共雲建立自動縮放群集的 用例 很有用。
Libnetwork
Libnetwork是用Go語言實現的容器網路管理專案。它的目標是定義一個容器網路模型(CNM),併為應用程式提供一致的程式設計介面以及網路抽象。這樣就可以滿足容器網路的“可組合”需求。
Docker & Docker Swarm
Docker Swarm是一個在Docker引擎中構建的編排工具,從Docker1.12開始它就作為一個獨立的工具被原生包含在Docker Engine中。我們可以使用Docker Cli通過Docker Swarm建立群集,並部署和管理應用程式和服務。下圖描述了Docker Swarm在Docker體系中的作用:
Docker&Kubernetes
在Docker Swarm與Kubernetes的競爭中,顯然是Kubernetes佔據了優勢。所以Docker緊急掉頭,開始原生的支援與Kubernetes的整合。
這可是2017年容器界的一大新聞啊,至此,Docker使用者和開發人員可以自由地選擇使用Kubernetes或是Swarm執行容器的編排工作。我們可以認為Docker與Kubernetes聯姻了:
新的支援Kubernetes整合的Docker版本將允許使用者把他們的Docker Compose應用程式部署為Kubernetes本地Pod和服務。Kubernetes是一款非常強大且逐漸被大眾認可的本地編排工具:
希望大家沒有被文中眾多的名稱和概念搞糊塗,讓我們以下圖來結束本文,它展示了從2013年到2017年從Docker Hub拉取映象次數的趨勢:
注:本文所有圖片均來自網際網路
參考
<An Overall View On Docker Ecosystem — Containers , Moby, Swarm, Linuxkit, containerd, Kubernetes>