本文收錄在容器技術學習系列文章總目錄
Docker 和容器技術的發展可謂是日新月異,本文試圖以全局的視角來梳理一下 docker 目前的生態圈。既然是概覽,所以不會涉及具體的技術細節。
Docker 自從發布以來發生了很多的變化,並且有些方面的變化還非常大。對於技術愛好者來說,我們喜歡酷斃新的功能,喜歡舊功能的改善。但對於生產環境中的使用者來說,其實不太喜歡這種頻繁的變化!不管怎樣,我們都有必要理清 docker 生態系統中的眾多概念及它們之間的關系,以及 docker 自誕生至今(2018 年)的里程碑性事件。
一、百花齊放的容器技術
雖然 docker 把容器技術推向了巔峰,但容器技術卻不是從 docker 誕生的。實際上,容器技術連新技術都算不上,因為它的誕生和使用確實有些年頭了。下面的一串名稱肯能有的你都沒有聽說過,但它們的確都是容器技術的應用:
- Chroot Jail
- FreeBSD Jails
- Linux VServer
- Solaris Containers
- OpenVZ
- Process Containers
- LXC
- Warden
- LMCTFY
- Docker
- RKT
1、Chroot Jail
就是我們常見的 chroot 命令的用法。它在 1979 年的時候就出現了,被認為是最早的容器化技術之一。它可以把一個進程的文件系統隔離起來。
2、The FreeBSD Jail
Freebsd Jail 實現了操作系統級別的虛擬化,它是操作系統級別虛擬化技術的先驅之一。
3、Linux VServer
使用添加到 Linux 內核的系統級別的虛擬化功能實現的專用虛擬服務器。
4、Solaris Containers
它也是操作系統級別的虛擬化技術,專為 X86 和 SPARC 系統設計。Solaris 容器是系統資源控制和通過 "區域" 提供邊界隔離的組合。
5、OpenVZ
OpenVZ 是一種 Linux 中操作系統級別的虛擬化技術。 它允許創建多個安全隔離的 Linux 容器,即 VPS。
6、Process Containers
Process 容器由 Google 的工程師開發,一般被稱為 cgroups。
7、LXC
LXC 又叫 Linux 容器,這也是一種操作系統級別的虛擬化技術,允許使用單個 Linux 內核在宿主機上運行多個獨立的系統。
8、Warden
在最初階段,Warden 使用 LXC 作為容器運行時。 如今已被 CloudFoundy 取代。
9、LMCTFY
LMCTY 是 Let me contain that for you 的縮寫。它是 Google 的容器技術棧的開源版本。
Google 的工程師一直在與 docker 的 libertainer 團隊合作,並將 libertainer 的核心概念進行抽象並移植到此項目中。該項目的進展不明,估計會被 libcontainer 取代。
10、Docker
Docker 是一個可以將應用程序及其依賴打包到幾乎可以在任何服務器上運行的容器的工具。
11、RKT
RKT 是 Rocket 的縮寫,它是一個專注於安全和開放標准的應用程序容器引擎。
正如我們所看到的,docker 並不是第一個容器化技術,但它的確是最知名的一個。Docker 誕生於 2013 年,並獲得了快速的發展,下圖展示了當前 docker 平台中的組成部分(此圖來自互聯網):
Docker 立於系統基礎架構之上並為應用程序提供支撐。它由稱為 containerd 的行業標准容器運行時組件,稱為 docker swarm 的本地編排工具,以及開源的 docker community 版本和提供商業管理服務的 docker enterprise 版組成。
二、與 docker 相關的重要概念
1、Docker & LXC
Docker 的第一個執行環境是 LXC,但從版本 0.9 開始 LXC 被 libcontainer 取代。
2、Docker & libcontainer
Libcontainer 為 docker 封裝了 Linux 提供的基礎功能,如 cgroups,namespaces,netlink 和 netfilter 等,如下圖所示(此圖來自互聯網):
3、2015 - Docker & runC
2015 年,docker 發布了 runC,一個輕量級的跨平台的容器運行時。 這基本上就是一個命令行小工具,可以直接利用 libcontainer 運行容器,而無需通過 docker engine。runC 的目標是使標准容器在任何地方都可用。
4、Docker & The Open Containers Initiative(OCI)
OCI 是一個輕量級的開放式管理架構,由 docker,CoreOS 和容器行業的其他領導廠商於 2015 年建立。它維護一些項目,如 runC ,還有容器運行時規范和鏡像規范。OCI 的目的是圍繞容器行業制定標准,比如使用 docker 創建的容器可以在任何其他容器引擎上運行。
5、2016 - Docker & containerd
2016年,Docker 分拆了 containerd,並將其捐贈給了社區。將這個組件分解為一個單獨的項目,使得 docker 將容器的管理功能移出 docker 的核心引擎並移入一個單獨的守護進程(即 containerd)。
6、Docker Components
分拆完 containerd 后,docker 各組件的關系如下圖所示(此圖來自互聯網):
至此,docker 從一個單一的軟件演變成了一套相互獨立的組件和項目。
7、Docker 如何運行一個容器?
- Docker 引擎創建容器映像
- 將容器映像傳遞給 containerd
- containerd 調用 containerd-shim
- containerd-shim 使用 runC 來運行容器
- containerd-shim 允許運行時(本例中為 runC)在啟動容器后退出
該模型帶來的最大好處是在升級 docker 引擎時不會中斷容器的運行。
8、2017 - 容器成為主流
2017 年是容器成為主流技術的一年,這就是為什么 docker 在 Linux 之外支持眾多平台的原因(Docker for Mac,Docker for Windows,Docker for AWS,GCP 等)。
當容器技術被大眾接受后,Docker 公司意識到需要新的生產模型,這就是為什么它開始 Moby 項目。
三、Moby Project
Moby 項目開啟了實現協作和生產的新篇章。它是一個開源項目,旨在推進軟件的容器化。Moby 項目提供了數十個樂高積木一樣的組件以及將它們組裝成定制的基於容器的系統的框架。
1、docker的生成模型
(1)Docker 生產模型像任何其他常見的單個開源項目一樣開始(此圖來自互聯網):
(2)進而將單個項目拆分為不同的開放組件(此圖來自互聯網):
(3)然后進化到可以共享這些組件以及組件集合(assembly)的模型(此圖來自互聯網):
(4)最終達到能夠提供更多關於組件和通用組件集合的協作的模型(此圖來自互聯網):
2、下面我們就來介紹一些 Moby 項目中的組件
(1)Containerd
Containerd 是 docker 基於行業標准創建的核心容器運行時。它可以用作 Linux 和 Windows 的守護進程,並管理整個容器生命周期。
(2)Linuxkit
Linuxkit 是 Moby 項目中的另一個組件,它是為容器構建安全、跨平台、精簡系統的工具。目前已經支持的本地 hypervisor 有 hyper-v 和 vmware。支持的雲平台有 AWS、Azure 等。
(3)Infrakit
Infrakit 也是 Moby 項目的一部分。它是創建和管理聲明式、不可變和自我修復基礎架構的工具包。
Infrakit 旨在自動化基礎架構的設置和管理,以支持分布式系統和更高級別的容器編排系統。Infrakit 對於像 Docker Swarm 和 Kubernetes 這樣的編排工具或跨越 AWS 等公共雲創建自動縮放群集的用例很有用。
(4)Libnetwork
Libnetwork 是用 Go 語言實現的容器網絡管理項目。它的目標是定義一個容器網絡模型(CNM),
並為應用程序提供一致的編程接口以及網絡抽象。這樣就可以滿足容器網絡的 "可組合" 需求。
(5)Docker & Docker Swarm
Docker Swarm 是一個在 docker 引擎中構建的編排工具。從 docker 1.12 開始它就作為一個獨立的工具被原生包含在 docker engine 中。我們可以使用 docker cli 通過 docker swarm 創建群集,並部署和管理應用程序和服務。下圖描述了 docker swarm 在 docker 體系中的作用(此圖來自互聯網):
(6)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 拉取鏡像次數的趨勢:
轉載自sparkdev