容器快速入門完全指南
介 紹
容器,以及Docker和Kubernetes之類的容器技術已經日益成為許多開發人員工具包中常見的工具。容器化的核心目標是提供一種更好的方式,以可預測和便於管理的方式在不同的環境中建立、打包以及部署軟體。
在本文中,我們將一窺什麼是容器,它與其他虛擬化技術有何不同以及它在部署和運維的過程中有哪些優勢。如果您只是想迅速瞭解有關容器的核心概念,您可以直接滑到倒數第二部分【容器專用術語】檢視。
什麼是容器?
容器是一種作業系統虛擬化技術,用於打包應用程式及其依賴項,並在隔離環境中執行它們。在不同型別的基礎架構中,容器以一種標準的方式,提供了輕量級打包和部署應用程式的方法。
容器的這些特性使其對開發和運維人員極具吸引力。因為容器可以在任意支援容器的主機上執行一致,所以開發人員可以直接在本地測試相同的軟體,稍後就可以方便地部署到完整的生產環境中。同時,Container Format可以確保應用程式的依賴項被放到映象中,簡化了手動操作的部分和釋出流程。因為執行容器的主機和平臺是通用的,所以可以標準化管理基於容器系統的基礎架構。
容器從容器映象中建立,其中包含了系統、應用程式和容器環境。容器映象和建立特定容器模板一樣,同一映象可用於生成任意數量的執行中的容器。這與類和例項在面向物件程式設計中的工作方式類似:一個單獨的類可以用於建立任何數量的例項,一個單獨的容器映象也可以用於建立任何數量的容器。這類比喻也適用於繼承方面,因為容器映象可以作為其他自定義容器映象的父級。使用者可以從外部資源下載預先構建的容器,也可以根據需要構建自定義映象。
什麼是Docker?
雖然Linux容器是一種能夠以不同方式實現和管理的通用技術,但Docker是目前為止執行構建和容器最常見的方式。它包含了一系列的工具,可以允許使用者建立容器映象,從外部映象倉庫推送或者拉取映象,還能在不同的環境中執行和管理容器。可以這麼說,容器在Linux上迅速流行主要歸功於Docker在2013年釋出之後所做的努力。
docker命令列工具扮演了多種角色。它可以充當容器工作負載的流程管理器來執行和管理容器。此外,它還可以通過閱讀和執行Dockerfile或者拍攝執行中的容器快照來建立新的容器映象。這一命令還可以和Docker Hub(一種容器映象倉庫)互動,來拉取新的容器映象或者推送本地映象以儲存或者釋出它們。
雖然在Linux上Docker只提供了眾多實現方式中的一種,但它讓容器世界更容易進入,並且具備最常用的解決方案。儘管已經為容器開發了開放標準以確保互通性,但大多數與容器相關的平臺和工具都將Docker作為測試和釋出軟體時的主要參照。對於既定環境,Docker可能並不總是最高效能的解決方案,但它可能是最受歡迎的測試選項之一。實際上,對於容器而言,雖然在Linux上有許多其他的替代方案,但大家通常都會首先學習Docker,這並非毫無理由,因為Docker無處不在並且在容器生態系統中對術語、標準以及工具都擁有影響力。
容器如何工作?
瞭解容器的工作原理對於討論其與虛擬機器的區別大有裨益。
虛擬機器vs容器
虛擬機器,或稱VMs,是一種硬體虛擬技術,它可以讓您完全虛擬化硬體或計算機資源。一個單獨的訪客作業系統管理虛擬機器與執行在主機系統的OS完全分開。在主機系統上,一個名為hypervisor的軟體負責啟動、停止和管理虛擬機器。由於虛擬機器作為完全不同的計算機執行,在正常執行條件下不會影響主機系統或其他虛擬機器,因此虛擬機器具備極大的隔離性和安全性。然而,它們也存在不足。例如,虛擬化整個計算機需要VM使用大量的資源。此外,由於虛擬機器在單獨的訪客作業系統上執行,因此虛擬機器的配置和啟動時間可能相當慢。同時,因為虛擬機器作為一個獨立的機器執行,所以管理員通常需要採用類似基礎架構的管理工具和流程來更新和執行各個環境。
總而言之,虛擬機器允許您將計算機的資源細分為較小的單個計算機,但最終結果與管理一組物理計算機沒有顯著差異。計算機規模擴大,每個主機的責任可能變得更加集中,但您使用的工具,策略和流程以及系統的功能可能不會有明顯的變化。
與虛擬化整個計算機相比,容器則採用不同的方式——直接虛擬化作業系統。它作為由主機作業系統核心管理的專用程序執行,但具有受限且嚴格操作的系統程序、資源和環境檢視。容器存在於共享系統上,並且像它們在完全控制的計算機上執行一樣。
與其將容器視為像虛擬機器一樣的完整計算機,倒不如說更常見的管理容器與應用程式更為相似。例如,雖然您可以將SSH伺服器繫結到容器中,但這不是推薦的模式。相反,除錯通常通過日誌記錄介面執行,通過滾動新映象來應用更新,並且不再強調服務管理以支援管理整個容器。
這些特性意味著容器佔據著位於虛擬機器的強隔離性和傳統流程的本地管理之間的空間。容器提供區域化和以流程為中心的虛擬化,可在限制,靈活性和速度之間實現良好平衡。
Linux cgroups和名稱空間
Linux控制組或cgroups是一種核心功能,允許將程序及其資源作為一個單元進行分組、隔離和管理。cgroups和流程一起繫結,並且決定資源的訪問許可權以及提供管理和監控它們行為的機制。它們遵循分層系統,允許子程序繼承其父程序的條件並可能採用進一步的限制。cgroups將程序作為一個組,並將所需的功能與其繫結在一起,並限制它們可以訪問的資源。
另一個容器所依賴的核心功能是Linux名稱空間。名稱空間限制了什麼程序可以看到餘下的系統。執行在名稱空間內部的程序無法獲取任何名稱空間外執行的程序。由於名稱空間定義了與系統其餘部分分離的獨特上下文,因此名稱空間的程序樹需要反映該上下文。在名稱空間內部,主程序變為PID1(process ID1),傳統上為OS的init系統保留PID。在名稱空間內構建嚴格操作的虛擬程序樹讓在容器內執行的程序表現得像在正常的、不受限制的環境中操作一樣。
容器化的優勢
上文中我們已經討論了一些能夠使得容器成為可能的技術,那麼現在我們來看一看它們最重要的特性有什麼。
輕量級虛擬化
與使用虛擬機器的硬體虛擬化相比,容器顯得更為輕便。首先,容器使用主機系統的核心並在該作業系統中作為分割槽程序執行,而不是虛擬化所有硬體資源並在該環境中執行完全獨立的作業系統。
其次,從主機的角度出發,容器像其他程序一樣執行,這意味著它們可以迅速啟動和停止並且可以使用受限制的資源。此外,容器不僅可以檢視和訪問主機的程序空間和資源子集,而且還能夠在大多數情況下,可以表現得像一個完全獨立的作業系統。
容器映象本身也可以非常小。最小的映象能夠使依賴於拉取最新映象的工作流不會出現顯著延遲。這是許多容錯,自我修復的分散式系統的要求。
環境隔離
通過使用cgroups以及名稱空間等Linux核心功能,容器可以與主機環境彼此隔離。這提供了一定程度的功能限制,以防止容器環境互相干擾。
雖然不夠強大,不足以被視為完全安全沙箱,但這種隔離確實具有優勢。由於主機和每個容器將軟體儲存在單獨的檔案系統中,因此更容易避免依賴性和庫衝突。網路環境可以分離,因此容器內的應用程式可以繫結到其本機埠,而無需擔心主機系統中或其他容器中的軟體會產生衝突。然後,管理員可以根據需要選擇如何將容器的網路對映到主機網路中。
標準化打包格式和執行時目標
容器最引人注目的其中一個優勢是它可以統一和簡化打包和部署軟體的流程。容器映象可以讓您繫結應用程式和所有的執行時需求到可跨多個基礎架構部署的單個單元中。
在容器內部,開發人員可以安裝和使用其應用程式所需的任一庫,而無需擔心干擾主機系統庫。當映象建立時,依賴項是版本鎖定的。容器執行時可以充當一個標準、穩定的部署平臺,因此開發人員無需瞭解容器在哪個特定的機器上執行。只要容器執行時可操作且有足夠的系統資源可用,容器就會像在開發環境中那樣執行。
同樣的,從運維的角度來看,容器化使部署環境的需求標準化了。管理員可以專注於維護充當容器平臺的通用主機,並分配這些計算機可以訪問的資源池,而不是基於應用程式的語言、執行時和依賴項來配置和維護特定的環境。繫結容器中的所有特定應用程式特性會在應用程式的關注點與平臺的關注點之間建立自然邊界。
可擴充套件性
容器的既定正規化可以讓您以一種相對簡單的機制來擴充套件您的應用程式。輕量級映象、快速的啟動時間、建立測試以及部署“黃金映象”以及標準化的執行時環境這些特性使得構建高度擴充套件的系統成為可能。
一個可擴充套件性的系統是高度依賴於應用程式架構和容器映象本身是如何構建的。與容器範例配合良好的設計將會充分發揮容器格式的優勢,以實現速度、可用性和可管理性的良好平衡。面向服務的架構,特別是微服務,在容器化環境中非常流行,因為將應用程式分解為具有集中目的的離散元件使得開發,擴充套件和更新更加簡單。
容器專用術語
在我們結束之前,讓我們回顧一下我們在本文中介紹的一些關鍵術語,以及您在繼續學習時可能遇到的一些新術語。
-
容器:在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,是一種硬體虛擬技術,它模擬為一整臺計算機。在虛擬機器內安裝一個完整的作業系統可用於管理內部元件和訪問虛擬機器的計算資源。
-
虛擬化:虛擬化是一個建立、執行以及管理虛擬環境或者計算機資源的過程。虛擬化是一種抽象物理資源的方式,並且常用於以不同目的分割資源池。
總 結
容器並非魔彈,但它們的確具備一些優於在裸機上執行軟體或使用其他虛擬化技術的優勢。通過提供輕量級、功能性隔離和開發豐富的工具生態系統來幫助管理複雜性,為容器在開發期間和整個運維生命週期中提供了極大的靈