作者:sparkdev ;
來源:www.cnblogs.com/sparkdev


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的6年之癢!


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等,如下圖所示:


Docker的6年之癢!


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的6年之癢!


至此,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生產模型像任何其他常見的單個開源項目一樣開始:


Docker的6年之癢!


進而將單個項目拆分爲不同的開放組件:


Docker的6年之癢!


然後進化到可以共享這些組件以及組件集合(Assembly)的模型:


Docker的6年之癢!


最終達到能夠提供更多關於組件和通用組件集合的協作的模型:


Docker的6年之癢!


下面我們就來介紹一些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的6年之癢!


Docker&Kubernetes

在Docker Swarm與Kubernetes的競爭中,顯然是Kubernetes佔據了優勢。所以Docker緊急掉頭,開始原生的支持與Kubernetes的集成。

這可是2017年容器界的一大新聞啊,至此,Docker用戶和開發人員可以自由地選擇使用Kubernetes或是Swarm執行容器的編排工作。我們可以認爲Docker與Kubernetes聯姻了:


Docker的6年之癢!


新的支持Kubernetes集成的Docker版本將允許用戶把他們的Docker Compose應用程序部署爲Kubernetes本地Pod和服務。Kubernetes是一款非常強大且逐漸被大衆認可的本地編排工具:


Docker的6年之癢!


希望大家沒有被文中衆多的名稱和概念搞糊塗,讓我們以下圖來結束本文,它展示了從2013年到2017年從Docker Hub拉取鏡像次數的趨勢:


Docker的6年之癢!


注:本文所有圖片均來自互聯網

參考

相關文章