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 ProjectMoby項目開啟了實作協作和生産的新篇章。它是一個開源項目,旨在推進軟體的容器化。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拉取鏡像次數的趨勢:
注:本文所有圖檔均來自網際網路
原文釋出時間為:2018-11-22
本文作者:sparkdev
本文來自雲栖社群合作夥伴“
DBAplus社群”,了解相關資訊可以關注“
”。