<ins id="jxy61"><option id="jxy61"><menu id="jxy61"></menu></option></ins>
          1. 煉數成金 門戶 大數據 虛擬化 查看內容

            容器or虛擬機?

            2021-3-10 12:07| 發布者: 煉數成金_小數| 查看: 17682| 評論: 0|原作者: JUSTIN|來自: K8S中文社區

            摘要: 容器是一種操作系統虛擬化技術,用于打包應用程序及其依賴項,并在隔離環境中運行它們。在不同類型的基礎架構中,容器以一種標準的方式,提供了輕量級打包和部署應用程序的方法。容器的這些特性使其對開發和運維人員 ...
            介 紹
            容器,以及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,是一種硬件虛擬技術,它模擬為一整臺計算機。在虛擬機內安裝一個完整的操作系統可用于管理內部組件和訪問虛擬機的計算資源。

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

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

            聲明:文章收集于網絡,版權歸原作者所有,為傳播信息而發,如有侵權,請聯系小編刪除,謝謝!

            歡迎加入本站公開興趣群
            軟件開發技術群
            興趣范圍包括:Java,C/C++,Python,PHP,Ruby,shell等各種語言開發經驗交流,各種框架使用,外包項目機會,學習、培訓、跳槽等交流
            QQ群:26931708

            Hadoop源代碼研究群
            興趣范圍包括:Hadoop源代碼解讀,改進,優化,分布式系統場景定制,與Hadoop有關的各種開源項目,總之就是玩轉Hadoop
            QQ群:288410967 

            鮮花
            1

            握手

            雷人

            路過

            雞蛋

            剛表態過的朋友 (1 人)

            相關閱讀

            最新評論

            熱門頻道

            • 大數據

            即將開課

             

            GMT+8, 2021-4-8 19:29 , Processed in 0.138779 second(s), 25 queries .

            年轻人手机在线观看