來源:sparkdev;
鏈接:www.cnblogs.com/sparkdev/p/8998546.html


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 生態概覽

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 生態概覽

2015 - Docker & runC

2015 年,docker 發佈了 runC,一個輕量級的跨平臺的容器運行時。 這基本上就是一個命令行小工具,可以直接利用 libcontainer 運行容器,而無需通過 docker engine。runC 的目標是使標準容器在任何地方都可用。

Docker & The Open Containers Initiative(OCI)

OCI 是一個輕量級的開放式管理架構,由 docker,CoreOS 和容器行業的其他領導廠商於 2015 年建立。它維護一些項目,如 runC ,還有容器運行時規範和鏡像規範。OCI 的目的是圍繞容器行業制定標準,比如使用 docker 創建的容器可以在任何其他容器引擎上運行。

2016 - Docker & containerd

2016年,Docker 分拆了 containerd,並將其捐贈給了社區。將這個組件分解爲一個單獨的項目,使得 docker 將容器的管理功能移出 docker 的核心引擎並移入一個單獨的守護進程(即 containerd)。

Docker Components

分拆完 containerd 後,docker 各組件的關係如下圖所示(此圖來自互聯網):

Docker 生態概覽

至此,docker 從一個單一的軟件演變成了一套相互獨立的組件和項目。


Docker 如何運行一個容器?

  1. Docker 引擎創建容器映像
  2. 將容器映像傳遞給 containerd
  3. containerd 調用 containerd-shim
  4. containerd-shim 使用 runC 來運行容器
  5. 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 生態概覽

進而將單個項目拆分爲不同的開放組件(此圖來自互聯網):

Docker 生態概覽

然後進化到可以共享這些組件以及組件集合(assembly)的模型(此圖來自互聯網):

Docker 生態概覽

最終達到能夠提供更多關於組件和通用組件集合的協作的模型(此圖來自互聯網):

Docker 生態概覽

下面我們就來介紹一些 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 引擎中構建的編排工具。從 docker 1.12 開始它就作爲一個獨立的工具被原生包含在 docker engine 中。我們可以使用 docker cli 通過 docker swarm 創建羣集,並部署和管理應用程序和服務。下圖描述了 docker swarm 在 docker 體系中的作用(此圖來自互聯網):

Docker 生態概覽


Docker&Kubernetes

在 docker swarm 與 kubernetes 的競爭中,顯然是 kubernetes 佔據了優勢。所以 docker 緊急掉頭,開始原生的支持與 kubernetes 的集成。這可是 2017 年容器界的一大新聞啊!至此,docker 用戶和開發人員可以自由地選擇使用 kubernetes 或是 swarm 執行容器的編排工作。我們可以認爲 docker 與 kubernetes 聯姻了(此圖來自互聯網):

Docker 生態概覽

新的支持 kubernetes 集成的 docker 版本將允許用戶把他們的 docker compose 應用程序部署爲 kubernetes 本地 pod 和服務。Kubernetes 是一款非常強大且逐漸被大衆認可的本地編排工具(此圖來自互聯網):

Docker 生態概覽

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

Docker 生態概覽

相关文章