歡迎光臨
每天分享高質量文章

Docker 生態概覽

作者:sparkdev

連結:http://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 立於系統基礎架構之上併為應用程式提供支撐。它由稱為 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 & 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 如何執行一個容器?


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 生產模型像任何其他常見的單個開源專案一樣開始(此圖來自網際網路):


進而將單個專案拆分為不同的開放元件(此圖來自網際網路):


然後進化到可以共享這些元件以及元件集合(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 引擎中構建的編排工具。從 docker 1.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


●編號229,輸入編號直達本文

●輸入m獲取文章目錄

推薦↓↓↓

 

Linux學習

更多推薦18個技術類微信公眾號

涵蓋:程式人生、演演算法與資料結構、駭客技術與網路安全、大資料技術、前端開發、Java、Python、Web開發、安卓開發、iOS開發、C/C++、.NET、Linux、資料庫、運維等。

贊(0)

分享創造快樂