Linux容器(Container)發展史
作者:尹正傑
版權聲明:原創作品,謝絕轉載!否則將追究法律責任。
在操作系統虛擬化技術中,每個節點上只有唯一的系統內核,不虛擬任何硬件設備。通過使用操作系統提供的功能,多個虛擬環境之間可以相互隔離。
通常所說的容器(Container)技術就屬於操作系統級虛擬化。容器並非起源於Linux,但開源世界的最精彩之處就在於借鑒,修改和改進,容器也不例外。
一.容器(Container)技術概述
1>.什么是容器(Container)
容器是一種基礎工具;泛指任何可以用於容納其它物品的工具,可以部分或完全封閉,被用於容納,存儲,運輸物品;物體可以被放置在容器中,而容器則可以保護內容物。 人類使用容器的歷史至少有十萬年,甚至可能有數百萬的歷史。以下是我們生活中常見到的容器的類型: 瓶: 指口部比腹部窄小,頸長的容器。 罐: 指那些開口較大,一般為近圓筒形的器皿。 箱: 通常是立方體或圓柱體。形狀固定。 籃: 以條形物編織而成。 桶: 一種圓柱形的容器。 袋: 柔性材料制成的容器,形狀會受內容物而變化。 翁: 通常是指陶制,口小肚大的容器。 碗: 用來盛載食物的容器。 櫃: 指由一個盒組成的家俱。 鞘: 用於裝載刀刃的容器。 綜上所述,想必大家對容器這個概念應該有所了解,說了這么多,我想表達的是: "計算機中的技術來源於現實生活"。 那計算機所指的容器(Container)到底是什么呢?可能你會說它是能裝"東西"的一個技術,那這個"東西"到底是啥呢?自然是就是我們熟悉的所有應用程序(Application Program)啦。 我們以Linux容器為例,它是運行在操作系統上的一系列進程。運行這些進程所需的所有文件都由另一個只讀鏡像文件提供,這意味着從"開發 -> 測試 --> 生產"的整個過程中,Linux容器都具有可移植性和一致性。 換句話說,Linux容器技術能夠讓您對應用及其整個運行時環境(包括全部所需文件)一起進行打包或隔離。從而讓您可以在不同環境(如開發、測試和生產等環境)之間輕松遷移應用,同時還可保留應用的全部功能。 因而,相對於依賴重復傳統測試環境的開發渠道,容器的運行速度要快得多。容器比較普遍也易於使用,因此也成了IT安全方面的重要組成部分。將安全性內置於容器管道,可以為您的基礎架構增添防護,從而保障容器的可靠性、可擴展性和信賴度。 推薦閱讀: https://www.redhat.com/zh/topics/containers/whats-a-linux-container。 https://www.redhat.com/zh/topics/security/container-security https://www.redhat.com/zh/topics/security
2>.為什么要用容器
場景: 假設您在使用一台筆記本電腦開發一個應用,而且您的開發環境具有特定的配置。其他開發人員身處的環境配置可能稍有不同。您正在開發的應用不止依賴於您當前的配置,還需要某些特定的庫、依賴項和文件。 與此同時,您的企業還擁有標准化的開發和生產環境,有着自己的配置和一系列支持文件。您希望盡可能多在本地模擬這些環境,而不產生重新創建服務器環境的開銷。 根據以上場景分析,您要考慮如何確保應用能夠在這些環境中運行和通過質量檢測,並且在部署過程中不出現令人頭疼的各種依賴問題,也無需重新編寫代碼和進行故障修復呢?答案就是使用容器。 (1)容器可以確保您的應用擁有必需的庫、依賴項和文件,讓您可以在生產中自如地遷移這些應用,無需擔心會出現任何負面影響。 (2)實際上,您可以將容器鏡像中的內容,視為Linux發行版的一個安裝實例,因為其中完整包含RPM軟件包、配置文件等內容。但是,安裝容器鏡像發行版,要比安裝新的操作系統副本容易得多。這樣可以避免不必要的麻煩,做到皆大歡喜。 雖然這只是一個常見情況的示例,但在需要很高的可移植性、可配置性和隔離的情況下,我們可以利用Linux容器通過很多方式解決難題。 Linux容器的價值在於,它能加速開發並滿足新出現的業務需求。 在某些情形中(如通過Apache Kafka進行實時數據流處理),容器是不可或缺的,因為它們是提供應用所需的可擴展性的唯一途徑。 無論基礎架構是在企業內部還是在雲端,或者混合使用兩者,容器都能滿足您的需求。當然,選擇正確的容器平台也同樣重要。 在雲服務范疇內,CaaS被認為是基礎架構即服務(IaaS)的一種子集,介於IaaS和平台即服務(PaaS)之間。 CaaS的基本資源為容器,它是雲原生應用和微服務的常見部署機制。此外,CaaS還可以提高環境之間的可移植性,無論是混合環境還是多雲環境。 使用容器有很多好處,以下是比較容器可圈可點的特性: (1)可移植性: 用容器開發的應用擁有運行所需的一切,並可以部署在包括私有雲和公共雲在內的多種環境中。 可移植性也意味着靈活性,因為您可以更輕松地在環境和提供商之間移動工作負載。 (2)可擴展性: 容器具有水平擴展的功能,這意味着用戶可以在同一集群中成倍增加相同容器的數量,從而根據需要進行擴展。 通過僅在需要時使用和運行所需的內容,可以大大降低成本。 (3)高效性: 容器所需的資源要少於虛擬機(VM),因為它們不需要虛擬單獨的操作系統。 您可以在單個服務器上運行多個容器,而且它們需要較少的裸機硬件,這意味着成本更低。 (4)更高的安全性: 容器之間彼此隔離,這意味着在一個容器遭到破壞的情況下,其他容器並不會受到影響。 (5)速度: 由於容器相對於操作系統具有自主性,因此其啟動和停止僅需幾秒鍾的時間。這也加快了開發和運維工作,同時帶來了更快、更流暢的用戶體驗。
二.常見的操作系統級虛擬化實現方案
1>.Unix chroot
容器的概念始於1979年前后的UNIX chroot,它是一個UNIX操作系統上的系統調用,用於將一個進程及其子進程的根目錄改變到文件系統中的一個新位置,讓這些進程只能訪問到該目錄。
這個功能的想法是為每個進程提供獨立的磁盤空間。其后在1982年前后,它被加入到了BSD系統中。
溫馨提示:
BSD是Unix的擴展版本,FreeBSD是BSD發行版最流行的系統。
2>.Unix FreeBSD jail
在2000年前后,FreeBSD jail這種技術可將FreeBSD系統分區為多個子系統(也稱為Jail)。Jail是作為安全環境而開發的,系統管理員可與企業內部或外部的多個用戶共享這些Jail。 Jail的目的是讓進程在經過修改的chroot環境中創建,而不會脫離和影響整個系統。在chroot環境中,對文件系統、網絡和用戶的訪問都實現了虛擬化。
盡管Jail在實施方面存在局限性,但最終人們找到了脫離這種隔離環境的方法。但這個概念非常有吸引力。
推薦閱讀: https://www.freebsd.org/doc/handbook/jails.html https://www.freebsd.org/
3>.Linux-VServer
2001年前后,通過Jacques Gélinas的VServer項目,隔離環境的實施進入了Linux領域。正如Gélinas所說:"這項工作的目的是高度獨立且安全的單一環境中運行多個通用Linux服務器"。 Linux-VServer也是一個操作系統級虛擬化解決方案。Linux-VServer對Linux內核進行虛擬化,這樣多個用戶空間環境又稱為"Virtual Private Server"(簡稱"VPS")就可以單獨運行,而不需要互相了解。 Linux-VServer通過修改Linux內核實現用戶空間的隔離。Linux VServer也使用了chroot來為每個VPS隔離root目錄。雖然chroot允許指定新root目錄,但還是需要其他一些功能(稱為Chroot-Barrier)來限制VPS脫離其隔離的root目錄回到上級目錄。 給定一個隔離的root目錄之后,每個VPS就可以擁有自己的用戶列表和root密碼。在完成了這項針對Linux中多個受控制用戶空間的基礎性工作后,Linux容器開始逐漸成形並最終發展成了現在的模樣。 如下圖所示,2.4和2.6版本的Linux內核支持Linux-VServer,它可以運行於很多平台之上,包括 x86、x86-64、SPARC、MIPS、ARM 和 PowerPC。
溫馨提示:
同年時間(即2001年),Parallels公司發布了Virtuozzo Container產品,只不過該版本是商用版本。直到2005年才基於Virtuozzo Containers研發了OpenVZ進行開源。
推薦閱讀: http://linux-vserver.org/Welcome_to_Linux-VServer.org
4>.Oracle Solaris Container(Sun公司的Solaris與FreeBSD,Mac系統一樣,均是Unix擴展版(即BSD)的發行版)
2004年前后,作為Solaris 10中具有突破性意義的關鍵技術之一,由Sun公司虛擬化專家Joost Pronk van Hoogeveen、Jeff Victor和Chien-Hua Yen等研發的Solaris Containers能夠促進服務器整合,並提高應用程序可用性和易管理性。 Solaris 網格容器由兩個主要組件構成:Solaris區域(Zone)和Solaris資源管理器(SRM)。SRM 管理每個容器接收到的物理系統資源,而Solaris區域則控制名稱空間隔離。"區域"和SRM一起構成Solaris容器的基礎。 在2008年前后Sun以10億美元收購開源數據庫公司MySQL,做為一個開源的關系型數據庫管理系統,MySQL在市場上受到了廣泛的歡迎,並成為流行的網站架構方式LAMP(Linux+Apache+MySQL+PHP)的一部分。 2009年4月20日,加利福尼亞州聖克拉拉市Sun Microsystems(NASDAQ:JAVA)和Oracle Corporation(NASDAQ:ORCL)今天宣布,他們已達成最終協議,根據該協議,Oracle將以每股9.50美元的現金價格收購Sun普通股。 交易總價值約為74億美元,扣除Sun的現金和債務后為56億美元。曾經的工作站之王、Unix之王和締造了Solaris、Java傳奇的巨人Sun倒下了 Java和JavaScript啥關系?
Java由SUN公司研發,SUN公司和網景(Netscape)公司的是合作關系。JavaScript在1995年由Netscape公司(該公司成立於1994年)的Brendan Eich,在網景導航者瀏覽器上首次設計實現而成。 因為Netscape與Sun合作,Netscape管理層希望它外觀看起來像Java,因此取名為JavaScript。但實際上它的語法風格與Self及Scheme較為接近。JavaScript的標准是ECMAScript 。 1998年11月,網景被美國在線(American OnLine,AOL)收購,而后來美國在線和時代華納合並,之后再獨立。美國在線依然使用網景這品牌。 2007年12月28日,美國在線在博客表示將停止網景瀏覽器的開發,並於2008年3月1日停止安全更新和所有的技術支持,並建議用戶轉移使用Mozilla Firefox瀏覽器。 這就意味着於1994年問世的Netscape將正式退出歷史舞台。於2008年3月1日停止支持的網景瀏覽器后,保留了門戶網站Netscape。此外也有經營着一個以網景為名的廉價互聯網服務。 推薦閱讀: https://www.lampchina.net/ask/MTM3MTkwMg.html https://www.fujitsu.com/global/products/computing/servers/unix/sparc-enterprise/software/solaris10/container/ https://baike.baidu.com/item/%E7%BD%91%E6%99%AF/70176?fromtitle=netscape&fromid=2778944
5>.Parallels Virtuozzo/OpenVZ
2005年前后,前面我們提到過,Virtuozzo(2001年發布)是SWsoft公司(目前SWsoft已經改名為Parallels)的操作系統虛擬化軟件的命名,Virtuozzo是商業解決方案,而OpenVZ是以Virtuozzo為基礎的開源項目,它們采用的也是操作系統級虛擬化技術。 OpenVZ類似於Linux-VServer,它通過對Linux內核進行補丁來提供虛擬化、隔離、資源管理和狀態檢查。每個OpenVZ容器都有一套隔離的文件系統、用戶及用戶組等。 OpenVZ是Linux的基於容器的虛擬化。OpenVZ在單個物理服務器上創建多個安全的,隔離的Linux容器(也稱為VE或VPS),以提高服務器利用率並確保應用程序不沖突。 每個容器的執行和執行都完全像獨立服務器一樣。容器可以獨立地重新引導,並且具有root用戶訪問權限,用戶,IP地址,內存,進程,文件,應用程序,系統庫和配置文件。 推薦閱讀: https://wiki.openvz.org/Main_Page https://wiki.openvz.org/Quick_installation https://wiki.openvz.org/Download
6>.Linux Kernel支持Cgroup(控制組)和NameSpace(命名空間)技術
早期,Jail和VServer基本上都是在chroot概念之上稍作改進和其他一些標准工具的組合來實現此特定的虛擬服務器模型。很快,更多技術結合進來,讓這種隔離方法從構想變為現實。 2007年前后,Linux內核支持Cgroup和NameSpace技術,這兩種技術在增加對Linux的整體控制的同時,也成為了保持環境隔離的重要框架。 NameSpace(命名空間)主要包含以下六種技術: MNT Namespace(提供磁盤掛載點和文件系統的隔離能力): 每個容器都要有獨立的根文件系統用戶空間,以實現在容器里面啟動服務並且使用容器的運行環境。換句話說,就是在容器里面不能訪問宿主機的資源,宿主機是使用了chroot技術把容器鎖定到一個指的運行目錄里面。 舉個例子: 一個宿主機是ubuntu的服務器,可以在里面啟動一個centos運行環境的容器並且在里面啟動一個Nginx服務,此Nginx運行時使用的運行環境就是centos系統目錄的運行環境。 IPC Namespace(提供進程間通信的隔離能力): 一個容器內的進程間通信,允許一個容器內的不同進程的(內存,緩存等)數據訪問,但是不能跨容器訪問其他容器的數據 。 UTS Namespace(提供主機名隔離能力): 用於系統標識,其中包含了hostname和域名domainname,它使得一個容器擁有屬於自己hostname標識,這個主機名標識獨立於宿主機系統和其上的他容器 。 PID Namespace(提供進程隔離能力): CentOS Linux系統中,有一個PID為1的進程(init/systemd)是其他所有進程的父。 在每個容器內也要有一個父進程來管理其下屬的子進程,多個容器進程的PID namespace進程隔離(比如PID編號重復、容器內的主進程與回收子進程等)。 Net Namespace(提供網絡隔離能力): 每一個容器都類似於虛擬機一樣有自己的網卡,監聽端口,TCP/IP協議棧等。 以Docker為例,使用network namespace啟動一個vethX接口,這樣你的容器將擁有它自己的橋接ip地址,通常是docker0。 上面提到的docker0本質上是Linux的虛擬網橋(Virtual Bridge),網橋是在OSI七層模型的數據鏈路網絡設備,通過mac地址對網絡進行划分,並且在不同網絡直接傳遞數據。 User Namespace(提供用戶隔離能力): 各個容器內可能會出現重名的用戶和用戶組名稱,或重復的用戶UID或者GID,那么怎隔離各個容器內的用戶空間呢? User Namespace允許在各個宿主機的各個容器空間內創建相同的用戶名以及相同的用戶UID和GID,只是會用戶的作用范圍限制在每個容器內。 即A容器和B容器可以有相同的用戶名稱和ID的賬戶,但是此用戶的有效范圍僅是當前容器內,不能訪問另外一個容器內的文件系統,即相互隔離,互不影響,永不相見。 Cgroups: 一個容器如果不對其做任何資源限制,則宿主機(也稱為物理機,英文名稱為:"Physical machine")會允許其占用無限大的內存空間,有時候會因為代碼bug程序會一直申請內存,直到把宿主機內存占完。 綜上所述,為了避免此類的問題出現,宿主機有必要對容器進行資源分配限制,比如CPU,內存,磁盤等。 Linux Cgroups的全稱是Linux Control Groups,它最主要的作用就是限制一個進程組能夠使用的資源上限,包括CPU,內存,磁盤,網絡帶寬等等。 此外,Linux Cgroups還能夠對進程優先級設置,以及將進程掛起和恢復等操作。 溫馨提示: 如下圖所示,有關的NameSpace(命名空間)各種核心技術所支持的Linux Kernel的發行版本。因此推薦大家使用Linux Kernel 3.8+的版本喲~ 如果您使用的是Ubuntu就不用擔心Linux Kernel版本啦,因為它使用的Kernel版本要比CentOS的新,但如果您要是想使用CentOS發行,推薦使用CentOS 7.6+版本。 參考連接: https://www.cnblogs.com/yinzhengjie/p/12183066.html
7>.LXC/LXD
由於inux Kernel支持Cgroup(控制組)和NameSpace(命名空間)技術,這意味着一切都可在Linux內核中實現虛擬化,因此推動了容器的進一步發展。 LXC: 2008年前后,作為一個開源容器平台,Linux容器項目LXC是眾所周知的工具,模板,庫和語言綁定集。它的級別很低,非常靈活,幾乎涵蓋了上游內核支持的每個遏制功能。同年,RedHat公司發布了用於管理虛擬化平台的Libvirt工具。 LXC是Linux內核包含功能的用戶空間接口。通過功能強大的API和簡單的工具,它使Linux用戶可以輕松地創建和管理系統或應用程序容器。LXC采用簡單的命令行界面,可改善容器啟動時的用戶體驗。 LXC提供了一個操作系統級的虛擬化環境,可在許多基於Linux的系統上安裝。在Linux發行版中,可能會通過其軟件包存儲庫來提供LXC。 當前的LXC使用以下內核功能來包含進程: (1)Kernel namespaces (ipc, uts, mount, pid, network and user); (2)Apparmor and SELinux profiles; (3)Seccomp policies; (4)Chroots (using pivot_root); (5)Kernel capabilities; (6)CGroups (control groups); LXC容器通常被認為是chroot和成熟的虛擬機之間的中間對象。LXC的目標是創建一個與標准Linux安裝盡可能接近的環境,而不需要單獨的內核。 LXC的意思是LinuX Containers,它是第一個最完善的Linux容器管理器的實現方案,是通過cgroups和Linux名字空間namespace實現的。 LXC存在於liblxc庫中,提供了各種編程語言的API實現,包括Python3、Python2、Lua、Go、Ruby和Haskell等。 與其它容器技術不同的是,LXC可以工作在普通的Linux內核上,而不需要增加補丁。現在LXC project是由Canonical Ltd.贊助的項目,目前由Canonical公司贊助並托管的。 LXD: 雖然LXC使得用戶能夠通過簡單的命令行界面輕松地啟動使用容器,但是和我們過去使用的虛擬機來講,它的復雜程度並沒有多大降低,而且其隔離性依舊沒有虛擬機好。 LXC最大的好處就是在性能和資源上有所節約,但是在大規模容器使用上LXC依然沒有找到很好的突破口,於是后來就出現了LXD,Docker等技術。 LXD是新的LXC體驗。它使用一個命令行工具來管理容器,從而提供了全新的直觀用戶體驗。可以通過REST API以透明方式通過網絡管理容器。通過與OpenNebula和OpenStack等雲平台集成,它還可以用於大規模部署。 LXD是下一代系統容器管理器。它提供類似於虛擬機的用戶體驗,但是使用Linux容器。它基於映像,並帶有可用於各種Linux發行版的預制映像,並且基於非常強大但非常簡單的REST API構建。 推薦閱讀: https://www.freedesktop.org/wiki/Software/systemd/ https://linuxcontainers.org/ https://linuxcontainers.org/lxc/introduction/ https://linuxcontainers.org/lxd/introduction/ http://www.canonical.com/ https://libvirt.org/
8>.Docker
2013年dotCloud公司首次在pycon官網首次公布了Docker開源版本。Docker帶來了一種先進的軟件交付方式,即通過容器進行進行軟件的交付。並對外宣傳的是Build(本地編譯),Ship(傳輸到其他服務器節點),Run(可以移植到指定的服務器運行)。 實際上我們可以使用docker build將代碼的運行環境制作成鏡像,通過dock push將鏡像發布至私有或共有的docker倉庫。其他人可以通過dock poll下載你提交的鏡像,而后使用docker run將制定鏡像啟動。此過程可以排除環境依賴等問題。 docker這款開源軟件可以有效的解決(程序員開發的)程序在運行時環境差異而帶來的一系列問題,達到"Build once, Run anywhere"的目標。 此后docker也稱為了容器的代名詞(就想Hadoop成了大數據的代名詞一樣),並成為容器時代的引領者。關於Docker容器的歷史,架構,應用場景等我這里不做贅述,感興趣的小伙伴可參考我另外一篇筆記。 Docker容器的應用場景: (1)應用程序打包和發布; (2)應用程序隔離; (3)持續集成; (4)部署微服務; (5)快速搭建測試環境; (6)提供CAAS產品; 推薦閱讀: https://www.cnblogs.com/yinzhengjie2020/p/14017860.html https://www.cnblogs.com/yinzhengjie2020/p/14022268.html https://us.pycon.org/2013/
9>.RedHat(已被IBM收購)的CoreOS rkt容器技術
Rkt誕生於2014年11月末,我在GitHub上發現他在2014年11月27日就發布了"v0.0.0"版本,"v0.1.0"版本是在同年的12月1日發布的。 Rkt是一種與Docker類似的容器引擎,由CoreOS公司主導,得到了Redhat、Google、Vmware等公司的支持,更加專注於解決安全、兼容、執行效率等方面的問題。 CoreOS公司最早是Docker的支持者,其產品CoreOS操作系統是適用於企業的輕量級容器化的Linux發行版,是Docker生態圈的重要一員。 隨着Docker在容器行業變得逐漸強大,Docker也越來越臃腫,CoreOS公司希望有一個更加開放和中立的容器標准,因此推出了自己的容器計划,很明顯CoreOS公司也想在容器方面有一席之地。 就這樣,CoreOS公司成為了Docker公司的容器引擎競爭對手。由於Docker已經深入人心,盡管Rkt也很優秀,但很少有人願意將Docker技術棧遷移到Rkt技術棧。最終容器之戰Docker占領了大部分市場。 2018年4月16日是發布的最新rkt容器工具,目前該項目已經停止維護,因此生產環境中不推薦大家使用該容器技術。推薦使用主流的容器工具,如Docker,Pouch,podman。 參考鏈接: https://github.com/rkt/rkt/releases https://www.sohu.com/a/216850450_468741
11>.阿里開源的Pouch容器技術
2017年11月19日上午,在中國開源年會現場,阿里巴巴正式開源了基於Apache 2.0協議的容器技術Pouch。 Pouch Container是阿里巴巴集團創建的一個開源項目,旨在促進集裝箱技術的發展。 Pouch Container的願景是改善容器生態系統並促進容器標准OCI(開放容器計划),從而使容器技術成為雲時代應用程序開發的基礎。 Pouch Container可以打包,交付和運行任何應用程序。它為應用程序提供了輕量級的運行時環境,具有強大的隔離性和最小的開銷。Pouch Container將應用程序與變化的運行時環境隔離開來,並最大程度地減少了操作工作量。 Pouch Container可以最大程度地減少應用程序開發人員編寫本機應用程序或將舊版應用程序遷移到Cloud平台的工作。 Pouch是一款輕量級的容器技術,擁有快速高效、可移植性高、資源占用少等特性,主要幫助阿里更快的做到內部業務的交付,同時提高超大規模下數據中心的物理資源利用率。 溫馨提示: 上圖是Pouch容器的內部實現架構圖,下圖是Pouch容器的生態系統圖。 在Pouch Container的路線圖中,我們將擁抱生態系統作為主要目標。對於上層業務流程層,Pouch Container支持Kubernetes和Swarm。 對於底層運行時層,Pouch Container支持runC,runV(該容器引擎由音速神童公司2015年5月左右發起的,同年發布的還有Intel公司發起的Clear Container),runlxc等。為了使存儲和網絡大為補充,CNI和CSI就在其中。 推薦閱讀: https://github.com/alibaba/pouch https://github.com/opencontainers https://www.infoq.cn/article/alibaba-pouch https://github.com/alibaba/pouch/blob/master/docs/architecture.md https://github.com/opencontainers/runc https://github.com/hyperhq/runv https://github.com/containernetworking/cni https://github.com/container-storage-interface
11>.音速神童kata-containers
技術創業公司音速神童成立於2015年,由兩位中國開發者趙鵬和王旭創建。經過兩年的發展,成長為全球容器行業的的重要技術和力量, 2017年12月,音速神童在KubeCon上對外發布了Kata Containers安全容器項目,這個項目的兩個前身是:音速神童的自研容器產品runV和Inter公司的容器產品Clear Container,而這兩個項目均發布於2015年5月。 kata COntainers其支持者包括99cloud、AWcloud、Canonical、中國移動、City Network、CoreOS、Dell/EMS、EasyStack、Fiberhome、谷歌、華為、京東、Mirantis、NetApp、Red Hat、SUSE、騰訊、Ucloud、UnitedStack 和中興。 自2017年12月啟動以來,kata COntainers該社區成功地將Intel Clear Containers的最佳部分與Hyper.sh RunV合並,並進行了擴展,以包括對主要架構的支持,包括x86_64之外的AMD64,ARM,IBM p系列和IBM z系列。 Kata Containers是一個開放源代碼社區,致力於通過輕量級虛擬機來構建安全的容器運行時,這些虛擬機的感覺和性能類似於容器,但是使用硬件虛擬化技術作為第二防御層,可以提供更強的工作負載隔離。 Kata Containers還支持多個虛擬機管理程序,包括QEMU,NEMU和Firecracker,並與其他容器化項目集成。 Kata Containers社區由開放基礎設施基金會管理,該基金會支持全球開放基礎設施的開發和采用。該代碼在Apache 2許可下托管在GitHub上。 綜上所述,Kata容器與容器一樣輕便,快速,並與容器管理層集成在一起,包括流行的編排工具,如Docker和Kubernetes(k8s),同時還具有VM的安全優勢。Kata Container具有以下幾個優勢: (1)安全: 在專用內核中運行,提供網絡,I/O和內存的隔離,並可以通過虛擬化VT擴展利用硬件強制隔離。 (2)兼容性: 支持行業標准,包括OCI容器格式,Kubernetes CRI接口以及舊版虛擬化技術。 (3)性能: 提供與標准Linux容器一致的性能;提高隔離度,而無需增加標准虛擬機的性能。 (4)簡單: 消除了在完整的虛擬機內部嵌套容器的要求;標准接口使插入和入門變得容易。 溫馨提示: 這一容器引擎其中一個特殊之處在於,它試圖解決傳統運維體驗的問題,讓容器可以像傳統虛擬機一樣操作。這其實就是VM與容器的結合,也正是Kata的用武之地。 在之前,螞蟻金服自研了一套技術來做到這點,而現在它們可以結合Kata的長處做到更好,同時又能保持和國內外主流技術保持同步。 據InfoQ獨家消息,技術創業公司音速神童創始人趙鵬王旭加入螞蟻金服,打造虛擬機級別的安全容器技術。這也是為什么你所看到的pouch container是支持runV容器引擎的一個原因吧,因為runV研發團隊核心成員已經入職阿里的螞蟻金服! 音速神童加入螞蟻金服這件事在容器和雲原生領域掀起新的波瀾,它意味着雲計算基礎技術仍有可挖掘的的地方,而隨着互聯網大公司和雲計算廠商的介入,未來的技術演進的競爭將更加激烈。 參考鏈接: https://github.com/kata-containers/kata-containers https://github.com/hyperhq/runv https://katacontainers.io/ https://katacontainers.io/learn/ https://www.infoq.cn/article/OI-CCUqPe82xKUwtVoA2 https://blog.csdn.net/weixin_44326589/article/details/103726445 https://www.kubernetes.org.cn/tags/kubecon
12>.podman
Podman是一個無守護進程的容器引擎,用於在Linux系統上開發,管理和運行OCI容器。容器可以以root用戶或無根模式運行。簡而言之:alias docker = podman。
2018年2月,PodMan的v0.2版本發布。Podman(POD管理器)是一種基於Apache-2.0 License開源工具,用於管理容器和鏡像,安裝在這些容器中的體積以及由容器組制成的容器。 Podman基於libpod,libpod是一個用於容器生命周期管理的庫,該庫也包含在其中。libpod庫提供用於管理容器,pod,容器映像和卷的API。 推薦閱讀: https://podman.io/ https://github.com/containers/podman
三.容器技術改變了傳統部署應用程序的方式
1>.容器和虛擬機之間的架構差異
我們通常會說容器和虛擬化技術實現了一個互補,接下來我們來簡單列舉一下容器(Container)和虛擬機(virtual machine)直接的差別。 啟動速度: Docker Container只需加載鏡像文件,通常情況下是秒級(除非你的鏡像不在本地,而是在公網上,這需要一個下載鏡像的過程)。 而virtual machine需要啟動宿主機,速度較慢。 運行性能: 接近原生物理系統,因為Docker Container和原生操作系統使用的是同一個kernel。 而virtual machine使用的宿主機的虛擬kernel,這意味着需要將虛擬kernel的指令經過編譯,翻譯成機器碼交由物理kernel取執行。因此會多占用一些資源。 鏡像體積: Docker Container鏡像基本上都是MB級別。 virtual machine就需要ISO鏡像來安裝,官方有900MB+(Minimal的ISO鏡像),4GB+(DVD的ISO鏡像),10GB+(Everything的ISO鏡像)等等。 可管理性: Docker Container單進程(即進程級隔離) virtual machine是虛擬完整的系統管理(即系統級隔離,相對來隔離更徹底) 資源利用率: 一台物理機可以運行數百個容器Docker Container,但是一般只能運行數十多個virtual machine。 封裝程度: Docker Container只打包項目代碼及其運行環境所依賴的關系 virtual machine虛擬完整的操作系統。
2>.容器改變了部署方式
傳統部署時代: 早期,組織在物理服務器上運行應用程序。無法為物理服務器中的應用程序定義資源邊界,這會導致資源分配問題。 例如,如果在物理服務器上運行多個應用程序,則可能會出現一個應用程序占用大部分資源的情況,結果,另一個應用程序的性能將下降。 解決方案是在不同的物理服務器上運行每個應用程序。但是,這並沒有隨着資源利用不足而擴展,並且組織維護許多物理服務器的成本很高。 虛擬化部署時代: 作為解決方案,引入了虛擬化。 它允許您在單個物理服務器的CPU上運行多個虛擬機(VM)。虛擬化允許在VM之間隔離應用程序,並提供安全級別,因為一個應用程序的信息不能被另一應用程序自由訪問。 虛擬化可以更好地利用物理服務器中的資源,並可以實現更好的可伸縮性,因為可以輕松地添加或更新應用程序,降低硬件成本等等。借助虛擬化,您可以將一組物理資源呈現為一組一次性虛擬機。 每個VM都是一台完整的計算機,在虛擬化硬件之上運行所有組件,包括其自己的操作系統。 容器部署時代: 容器類似於VM,但是它們具有輕松的隔離屬性,可以在應用程序之間共享操作系統(OS)。因此,容器被認為是輕質的。 與VM相似,容器具有自己的文件系統,CPU,內存,進程空間等的共享。由於它們與基礎架構分離,因此可以跨雲和OS分發進行移植。 參考連接: https://kubernetes.io/docs/concepts/overview/what-is-kubernetes/