Docker 和容器技術的發展可謂是突飛猛進,本文試圖以全局的視角來梳理一下 docker 目前的生態圈。既然是概覽,因此不會涉及具體的技術細節。linux
Docker 自從發佈以來發生了不少的變化,而且有些方面的變化還很是大。對於技術愛好者來講,咱們喜歡酷斃新的功能,喜歡舊功能的改善。但對於生產環境中的使用者來講,其實不太喜歡這種頻繁的變化!無論怎樣,咱們都有必要理清 docker 生態系統中的衆多概念及它們之間的關係,以及 docker 自誕生至今(2018 年)的里程碑性事件。docker
百花齊放的容器技術
雖然 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 如何運行一個容器?
- 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 生產模型像任何其餘常見的單個開源項目同樣開始(此圖來自互聯網):
進而將單個項目拆分爲不一樣的開放組件(此圖來自互聯網):
而後進化到能夠共享這些組件以及組件集合(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