容器快速入門完全指南

介 紹


容器,以及Docker和Kubernetes之類的容器技術已經日益成爲許多開發人員工具包中常見的工具。容器化的核心目標是提供一種更好的方式,以可預測和便於管理的方式在不同的環境中創建、打包以及部署軟件。

在本文中,我們將一窺什麼是容器,它與其他虛擬化技術有何不同以及它在部署和運維的過程中有哪些優勢。如果您只是想迅速瞭解有關容器的核心概念,您可以直接滑到倒數第二部分【容器專用術語】查看。


什麼是容器?


容器是一種操作系統虛擬化技術,用於打包應用程序及其依賴項,並在隔離環境中運行它們。在不同類型的基礎架構中,容器以一種標準的方式,提供了輕量級打包和部署應用程序的方法。

容器的這些特性使其對開發和運維人員極具吸引力。因爲容器可以在任意支持容器的主機上運行一致,所以開發人員可以直接在本地測試相同的軟件,稍後就可以方便地部署到完整的生產環境中。同時,Container Format可以確保應用程序的依賴項被放到鏡像中,簡化了手動操作的部分和發佈流程。因爲運行容器的主機和平臺是通用的,所以可以標準化管理基於容器系統的基礎架構。

容器從容器鏡像中創建,其中包含了系統、應用程序和容器環境。容器鏡像和創建特定容器模板一樣,同一鏡像可用於生成任意數量的運行中的容器。這與類和實例在面向對象編程中的工作方式類似:一個單獨的類可以用於創建任何數量的實例,一個單獨的容器鏡像也可以用於創建任何數量的容器。這類比喻也適用於繼承方面,因爲容器鏡像可以作爲其他自定義容器鏡像的父級。用戶可以從外部資源下載預先構建的容器,也可以根據需要構建自定義鏡像。


什麼是Docker?


雖然Linux容器是一種能夠以不同方式實現和管理的通用技術,但Docker是目前爲止運行構建和容器最常見的方式。它包含了一系列的工具,可以允許用戶創建容器鏡像,從外部鏡像倉庫推送或者拉取鏡像,還能在不同的環境中運行和管理容器。可以這麼說,容器在Linux上迅速流行主要歸功於Docker在2013年發佈之後所做的努力。

docker命令行工具扮演了多種角色。它可以充當容器工作負載的流程管理器來運行和管理容器。此外,它還可以通過閱讀和執行Dockerfile或者拍攝運行中的容器快照來創建新的容器鏡像。這一命令還可以和Docker Hub(一種容器鏡像倉庫)交互,來拉取新的容器鏡像或者推送本地鏡像以保存或者發佈它們。

雖然在Linux上Docker只提供了衆多實現方式中的一種,但它讓容器世界更容易進入,並且具備最常用的解決方案。儘管已經爲容器開發了開放標準以確保互通性,但大多數與容器相關的平臺和工具都將Docker作爲測試和發佈軟件時的主要參照。對於既定環境,Docker可能並不總是最高性能的解決方案,但它可能是最受歡迎的測試選項之一。實際上,對於容器而言,雖然在Linux上有許多其他的替代方案,但大家通常都會首先學習Docker,這並非毫無理由,因爲Docker無處不在並且在容器生態系統中對術語、標準以及工具都擁有影響力。

16c1766bf0b31739?w=640&h=427&f=jpeg&s=54358

容器如何工作?


瞭解容器的工作原理對於討論其與虛擬機的區別大有裨益。

虛擬機vs容器

虛擬機,或稱VMs,是一種硬件虛擬技術,它可以讓您完全虛擬化硬件或計算機資源。一個單獨的訪客操作系統管理虛擬機與運行在主機系統的OS完全分開。在主機系統上,一個名爲hypervisor的軟件負責啓動、停止和管理虛擬機。由於虛擬機作爲完全不同的計算機運行,在正常運行條件下不會影響主機系統或其他虛擬機,因此虛擬機具備極大的隔離性和安全性。然而,它們也存在不足。例如,虛擬化整個計算機需要VM使用大量的資源。此外,由於虛擬機在單獨的訪客操作系統上運行,因此虛擬機的配置和啓動時間可能相當慢。同時,因爲虛擬機作爲一個獨立的機器運行,所以管理員通常需要採用類似基礎架構的管理工具和流程來更新和運行各個環境。

總而言之,虛擬機允許您將計算機的資源細分爲較小的單個計算機,但最終結果與管理一組物理計算機沒有顯著差異。計算機規模擴大,每個主機的責任可能變得更加集中,但您使用的工具,策略和流程以及系統的功能可能不會有明顯的變化。

與虛擬化整個計算機相比,容器則採用不同的方式——直接虛擬化操作系統。它作爲由主機操作系統內核管理的專用進程運行,但具有受限且嚴格操作的系統進程、資源和環境視圖。容器存在於共享系統上,並且像它們在完全控制的計算機上運行一樣。

16c1766bf30c1770?w=640&h=240&f=jpeg&s=23478

與其將容器視爲像虛擬機一樣的完整計算機,倒不如說更常見的管理容器與應用程序更爲相似。例如,雖然您可以將SSH服務器綁定到容器中,但這不是推薦的模式。相反,調試通常通過日誌記錄界面執行,通過滾動新鏡像來應用更新,並且不再強調服務管理以支持管理整個容器。

這些特性意味着容器佔據着位於虛擬機的強隔離性和傳統流程的本地管理之間的空間。容器提供區域化和以流程爲中心的虛擬化,可在限制,靈活性和速度之間實現良好平衡。

Linux cgroups和命名空間

Linux控制組或cgroups是一種內核功能,允許將進程及其資源作爲一個單元進行分組、隔離和管理。cgroups和流程一起綁定,並且決定資源的訪問權限以及提供管理和監控它們行爲的機制。它們遵循分層系統,允許子進程繼承其父進程的條件並可能採用進一步的限制。cgroups將進程作爲一個組,並將所需的功能與其綁定在一起,並限制它們可以訪問的資源。

另一個容器所依賴的內核功能是Linux命名空間。命名空間限制了什麼進程可以看到餘下的系統。運行在命名空間內部的進程無法獲取任何命名空間外運行的進程。由於命名空間定義了與系統其餘部分分離的獨特上下文,因此命名空間的進程樹需要反映該上下文。在命名空間內部,主進程變爲PID1(process ID1),傳統上爲OS的init系統保留PID。在命名空間內構建嚴格操作的虛擬進程樹讓在容器內運行的進程表現得像在正常的、不受限制的環境中操作一樣。


容器化的優勢


上文中我們已經討論了一些能夠使得容器成爲可能的技術,那麼現在我們來看一看它們最重要的特性有什麼。

輕量級虛擬化

與使用虛擬機的硬件虛擬化相比,容器顯得更爲輕便。首先,容器使用主機系統的內核並在該操作系統中作爲分區進程運行,而不是虛擬化所有硬件資源並在該環境中運行完全獨立的操作系統。

其次,從主機的角度出發,容器像其他進程一樣運行,這意味着它們可以迅速啓動和停止並且可以使用受限制的資源。此外,容器不僅可以查看和訪問主機的進程空間和資源子集,而且還能夠在大多數情況下,可以表現得像一個完全獨立的操作系統。

容器鏡像本身也可以非常小。最小的鏡像能夠使依賴於拉取最新鏡像的工作流不會出現顯著延遲。這是許多容錯,自我修復的分佈式系統的要求。

環境隔離

通過使用cgroups以及命名空間等Linux內核功能,容器可以與主機環境彼此隔離。這提供了一定程度的功能限制,以防止容器環境互相干擾。

雖然不夠強大,不足以被視爲完全安全沙箱,但這種隔離確實具有優勢。由於主機和每個容器將軟件保存在單獨的文件系統中,因此更容易避免依賴性和庫衝突。網絡環境可以分離,因此容器內的應用程序可以綁定到其本機端口,而無需擔心主機系統中或其他容器中的軟件會產生衝突。然後,管理員可以根據需要選擇如何將容器的網絡映射到主機網絡中。

標準化打包格式和運行時目標

容器最引人注目的其中一個優勢是它可以統一和簡化打包和部署軟件的流程。容器鏡像可以讓您綁定應用程序和所有的運行時需求到可跨多個基礎架構部署的單個單元中。

在容器內部,開發人員可以安裝和使用其應用程序所需的任一庫,而無需擔心干擾主機系統庫。當鏡像創建時,依賴項是版本鎖定的。容器運行時可以充當一個標準、穩定的部署平臺,因此開發人員無需瞭解容器在哪個特定的機器上運行。只要容器運行時可操作且有足夠的系統資源可用,容器就會像在開發環境中那樣運行。

同樣的,從運維的角度來看,容器化使部署環境的需求標準化了。管理員可以專注於維護充當容器平臺的通用主機,並分配這些計算機可以訪問的資源池,而不是基於應用程序的語言、運行時和依賴項來配置和維護特定的環境。綁定容器中的所有特定應用程序特性會在應用程序的關注點與平臺的關注點之間創建自然邊界。

可擴展性

容器的既定範式可以讓您以一種相對簡單的機制來擴展您的應用程序。輕量級鏡像、快速的啓動時間、創建測試以及部署“黃金鏡像”以及標準化的運行時環境這些特性使得構建高度擴展的系統成爲可能。

一個可擴展性的系統是高度依賴於應用程序架構和容器鏡像本身是如何構建的。與容器範例配合良好的設計將會充分發揮容器格式的優勢,以實現速度、可用性和可管理性的良好平衡。面向服務的架構,特別是微服務,在容器化環境中非常流行,因爲將應用程序分解爲具有集中目的的離散組件使得開發,擴展和更新更加簡單。

16c1766bee6fd40d?w=640&h=431&f=jpeg&s=77797

容器專用術語


在本文結束之前,讓我們回顧一下我們在本文中介紹的一些關鍵術語,以及您在繼續學習時可能遇到的一些新術語。

  • 容器:在Linux系統中,容器是一個操作系統虛擬化技術,來打包應用程序及它們的依賴項並在獨立的環境中運行它們。

  • 容器鏡像:容器鏡像是靜態文件,其定義文件系統以及特定容器配置的行爲。它還可以作爲創建容器的模板。

  • 容器編排:容器編排用於描述跨多個主機管理容器隊列所需的進程和工具。它通常使用容器平臺控制擴展、容錯、資源分配和調度。

  • 容器運行時:容器運行時是在一臺主機上運行和管理容器的組件。其最基本的要求通常是能夠從給定的鏡像中配置容器,但許多運行時還綁定了其他功能,如進程管理、監控和鏡像管理。Docker內在docker命令中包含了一個容器運行時,但還有許多其他可用於不同用例的替代方案。

  • Docker:Docker是第一個成功推廣Linux容器概念的技術。其中,Docker的工具生態系統包括docker,一個帶有大量容器的容器運行時以及鏡像管理特性,docker-compose,一個定義和運行多容器應用程序的系統,以及Docker Hub,容器鏡像倉庫。

  • Dockerfile:Dockerfile是一個用於描述如何構建一個容器鏡像的文本文件。它定義了基本的鏡像,在系統內運行的命令以及在容器內運行時啓動和管理進程的方式。雖然Dockerfile並非唯一的選項,但它是最常用的定義容器鏡像的格式,即使不使用Docker鏡像的構建功能。

  • Kata Containers:Kata Container是一種使用模型,工作流和工具來管理輕量級虛擬機的方法,它複製了容器的使用體驗。Kata Container尋求獲得容器的好處,同時提供更強大的隔離和安全性。

  • Kubernetes:Kubernetes是一個功能強大的容器編排平臺,它可以管理容器主機的集羣以及運行在上面的工作負載。Kubernetes提供工具和抽象化,以在高可用生產環境中部署、擴展、監控和管理容器。

  • Linux cgroups:Linux cgroups,或稱控制組,是綁定了進程的內核功能,並且可以決定它們對資源的訪問權限。Linux中的容器是使用cgroups實現的,可以方便管理資源和單獨的進程。

  • Linux命名空間:Linux命名空間用於將進程或cgroup的可見性限制爲餘下系統的一種內核功能。在Linux的容器使用命名空間來幫助隔離工作負載和來自運行在系統上的其他進程的資源。

  • LXC:LXC是Linux容器化的一種形式,它早於Docker和其他許多技術,同時也依賴於許多相同的內核技術。相比於Docker,LXC通常虛擬化整個操作系統而非僅僅運行應用程序的進程,這與虛擬機更爲相似。

  • 虛擬機:虛擬機,或VMs,是一種硬件虛擬技術,它模擬爲一整臺計算機。在虛擬機內安裝一個完整的操作系統可用於管理內部組件和訪問虛擬機的計算資源。

  • 虛擬化:虛擬化是一個創建、運行以及管理虛擬環境或者計算機資源的過程。虛擬化是一種抽象物理資源的方式,並且常用於以不同目的分割資源池。


總 結


容器並非魔彈,但它們的確具備一些優於在裸機上運行軟件或使用其他虛擬化技術的優勢。通過提供輕量級、功能性隔離和開發豐富的工具生態系統來幫助管理複雜性,爲容器在開發期間和整個運維生命週期中提供了極大的靈活性和可控性。



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章