介 紹docker
容器,以及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內核功能,容器能夠與主機環境彼此隔離。這提供了必定程度的功能限制,以防止容器環境互相干擾。
雖然不夠強大,不足以被視爲徹底安全沙箱,但這種隔離確實具備優點。因爲主機和每一個容器將軟件保存在單獨的文件系統中,所以更容易避免依賴性和庫衝突。網絡環境能夠分離,所以容器內的應用程序能夠綁定到其本機端口,而無需擔憂主機系統中或其餘容器中的軟件會產生衝突。而後,管理員能夠根據須要選擇如何將容器的網絡映射到主機網絡中。
標準化打包格式和運行時目標
容器最引人注目的其中一個優點是它能夠統一和簡化打包和部署軟件的流程。容器鏡像可讓您綁定應用程序和全部的運行時需求到可跨多個基礎架構部署的單個單元中。
在容器內部,開發人員能夠安裝和使用其應用程序所需的任一庫,而無需擔憂干擾主機系統庫。當鏡像建立時,依賴項是版本鎖定的。容器運行時能夠充當一個標準、穩定的部署平臺,所以開發人員無需瞭解容器在哪一個特定的機器上運行。只要容器運行時可操做且有足夠的系統資源可用,容器就會像在開發環境中那樣運行。
一樣的,從運維的角度來看,容器化使部署環境的需求標準化了。管理員能夠專一於維護充當容器平臺的通用主機,並分配這些計算機能夠訪問的資源池,而不是基於應用程序的語言、運行時和依賴項來配置和維護特定的環境。綁定容器中的全部特定應用程序特性會在應用程序的關注點與平臺的關注點之間建立天然邊界。
可擴展性
容器的既定範式可讓您以一種相對簡單的機制來擴展您的應用程序。輕量級鏡像、快速的啓動時間、建立測試以及部署「黃金鏡像」以及標準化的運行時環境這些特性使得構建高度擴展的系統成爲可能。
一個可擴展性的系統是高度依賴於應用程序架構和容器鏡像自己是如何構建的。與容器範例配合良好的設計將會充分發揮容器格式的優點,以實現速度、可用性和可管理性的良好平衡。面向服務的架構,特別是微服務,在容器化環境中很是流行,由於將應用程序分解爲具備集中目的的離散組件使得開發,擴展和更新更加簡單。
容器專用術語
在咱們結束以前,讓咱們回顧一下咱們在本文中介紹的一些關鍵術語,以及您在繼續學習時可能遇到的一些新術語。
總 結
容器並不是魔彈,但它們的確具有一些優於在裸機上運行軟件或使用其餘虛擬化技術的優點。經過提供輕量級、功能性隔離和開發豐富的工具生態系統來幫助管理複雜性,爲容器在開發期間和整個運維生命週期中提供了極大的靈活性和可控性。