'Docker是啥?容器變革的火花?'

"


"


Docker是啥?容器變革的火花?


編譯作者:風車雲馬(微信號:zhangyisq)

文︱Serdar Yegulalp

本篇文章轉自InfoWorld網站


在暢聊Docker之前,我們先講講什麼是容器?

現代軟件開發的目標之一是應用程序既能運行在同一主機或集群上,又能彼此隔離,這樣它們就不會過度干擾彼此的操作或維護,但由於要運行包、庫和其他軟件組件,這樣就會變得會比較困難。

解決這個問題的方案之一是用虛擬機,它將相同硬件上的應用程序完全隔離,並將軟件組件之間的衝突和硬件資源之間的競爭降到最低,但是虛擬機體積比較龐大,每個虛擬機都需要自己的操作系統,所以通常是GB大小而且很難維護和升級。

與虛擬機相反,容器將應用程序的執行環境彼此隔離,但共享底層OS內核。它們通常以兆字節為單位,使用的資源比虛擬機少得多,而且幾乎是立即啟動的。可以做到在相同的硬件上更密集地打包,而不需要花費太多的精力和開銷。

容器提供了一種高效和高粒度的機制,將軟件組件組合到現代企業所需的各種應用程序和服務堆棧中,並保持這些軟件組件的更新和維護。


"


Docker是啥?容器變革的火花?


編譯作者:風車雲馬(微信號:zhangyisq)

文︱Serdar Yegulalp

本篇文章轉自InfoWorld網站


在暢聊Docker之前,我們先講講什麼是容器?

現代軟件開發的目標之一是應用程序既能運行在同一主機或集群上,又能彼此隔離,這樣它們就不會過度干擾彼此的操作或維護,但由於要運行包、庫和其他軟件組件,這樣就會變得會比較困難。

解決這個問題的方案之一是用虛擬機,它將相同硬件上的應用程序完全隔離,並將軟件組件之間的衝突和硬件資源之間的競爭降到最低,但是虛擬機體積比較龐大,每個虛擬機都需要自己的操作系統,所以通常是GB大小而且很難維護和升級。

與虛擬機相反,容器將應用程序的執行環境彼此隔離,但共享底層OS內核。它們通常以兆字節為單位,使用的資源比虛擬機少得多,而且幾乎是立即啟動的。可以做到在相同的硬件上更密集地打包,而不需要花費太多的精力和開銷。

容器提供了一種高效和高粒度的機制,將軟件組件組合到現代企業所需的各種應用程序和服務堆棧中,並保持這些軟件組件的更新和維護。


Docker是啥?容器變革的火花?


圖片來源網絡

Docker技術到底是啥?


Docker是一個開源項目,可以輕鬆創建容器和基於容器的應用程序,最初是為Linux構建的,現在也可以在Windows和MacOS上運行。

一直以來Docker都可以幫助開發人員快速構建輕量級和可移植的軟件容器,從而簡化應用程序開發、測試和部署等諸多環節。具體來說,它是一個用於構建應用程序的軟件平臺,可以提供一種小型和輕量級的執行環境用來共享操作系統內核,但在其他方面是獨立運行的。

雖然容器概念已經出現不短的時間,但2013年推出的開源項目Docker在很大程度上幫助推廣了這項技術,並推動了軟件開發中容器化和微服務的趨勢,這種趨勢後來被稱為雲原生開發。

要理解Docker的工作原理,讓我們看一下用於創建Docker容器化應用程序的一些組件。


"


Docker是啥?容器變革的火花?


編譯作者:風車雲馬(微信號:zhangyisq)

文︱Serdar Yegulalp

本篇文章轉自InfoWorld網站


在暢聊Docker之前,我們先講講什麼是容器?

現代軟件開發的目標之一是應用程序既能運行在同一主機或集群上,又能彼此隔離,這樣它們就不會過度干擾彼此的操作或維護,但由於要運行包、庫和其他軟件組件,這樣就會變得會比較困難。

解決這個問題的方案之一是用虛擬機,它將相同硬件上的應用程序完全隔離,並將軟件組件之間的衝突和硬件資源之間的競爭降到最低,但是虛擬機體積比較龐大,每個虛擬機都需要自己的操作系統,所以通常是GB大小而且很難維護和升級。

與虛擬機相反,容器將應用程序的執行環境彼此隔離,但共享底層OS內核。它們通常以兆字節為單位,使用的資源比虛擬機少得多,而且幾乎是立即啟動的。可以做到在相同的硬件上更密集地打包,而不需要花費太多的精力和開銷。

容器提供了一種高效和高粒度的機制,將軟件組件組合到現代企業所需的各種應用程序和服務堆棧中,並保持這些軟件組件的更新和維護。


Docker是啥?容器變革的火花?


圖片來源網絡

Docker技術到底是啥?


Docker是一個開源項目,可以輕鬆創建容器和基於容器的應用程序,最初是為Linux構建的,現在也可以在Windows和MacOS上運行。

一直以來Docker都可以幫助開發人員快速構建輕量級和可移植的軟件容器,從而簡化應用程序開發、測試和部署等諸多環節。具體來說,它是一個用於構建應用程序的軟件平臺,可以提供一種小型和輕量級的執行環境用來共享操作系統內核,但在其他方面是獨立運行的。

雖然容器概念已經出現不短的時間,但2013年推出的開源項目Docker在很大程度上幫助推廣了這項技術,並推動了軟件開發中容器化和微服務的趨勢,這種趨勢後來被稱為雲原生開發。

要理解Docker的工作原理,讓我們看一下用於創建Docker容器化應用程序的一些組件。


Docker是啥?容器變革的火花?


圖片來源網絡

Dockerfile文件:每個Docker容器都從一個Dockerfile開始。Dockerfile是用易於理解的語法編寫的文本文件,其中包含構建Docker鏡像的指令,指定了容器的操作系統、編程語言、環境變量、文件位置、網絡端口和其他組件,當然還指定了容器在運行後要做什麼。

Docker鏡像:編寫好Dockerfile之後,就可以調用Docker構建工具build來創建一個Dockerfile鏡像。

Dockerfile是一組說明如何生成鏡像的指令,而Docker鏡像是一個可移植文件,包含容器將運行哪些軟件組件以及如何運行的規範,因為Dockerfile可能包含關於從在線資源庫獲取某些軟件包的說明,所以需要注意指定正確的版本,否則Dockerfile可能會根據調用的時間不同生成不一致的鏡像。但是一旦創建了一個鏡像,它就是靜態的。

Docker啟動:Docker的實用程序run是啟動容器的命令,每個容器都是一個鏡像的實例。容器設計為瞬態和臨時的,但是它們可以停止和重新啟動。此外可以同時運行同一鏡像的多個容器實例(每個容器具有唯一的名稱)。

Docker Hub庫:雖然構建容器很容易,但也不要以為需要從頭構建每個鏡像。Docker Hub是一個用於共享和管理容器的SaaS存儲庫,可以從中找到來自開源項目和軟件供應商的官方Docker鏡像,甚至普通公眾的非官方鏡像。甚至可以下載包含有用代碼的容器鏡像,或者上傳自己的鏡像共享它們,也可以將它們設置為私有,如果願意還可以創建一個本地Docker註冊表。

Docker 引擎:Docker引擎是Docker的核心,Docker創建和運行容器採用的是底層CS(客戶端-服務器)技術。一般來說,當某人泛泛地說Docker,而不是指公司或整個項目時,他們指的是Docker引擎。Docker引擎有兩個不同的版本:Docker Engine Enterprise和Docker Engine Community。

Docker在2017年發佈了企業版Enterprise Edition,兼容最初的版本,仍然是免費開源的。除此之外,Enterprise Edition增加了高級管理功能,包括集群控制和鏡像管理,以及漏洞監控,每個節點每年的成本為1500美元。

Docker組件、Docker集群和Kubernetes:Docker還使容器之間的協調變得更容易,通過將容器打包來構建應用程序堆棧。Docker組件簡化了開發和測試多容器應用程序的過程。它是一個命令行工具,類似於Docker客戶端,它接收一個特殊格式的描述符文件,用於從多個容器組裝應用程序,並在單個主機上協同運行它們。

這些更高級的版本由其他產品提供,比如Docker Swarm和Kubernetes。但是Docker提供了基礎。Swarm是從Docker項目中發展起來的,Kubernetes實際上已經成為Docker編配平臺的首選。


Docker優勢可圈可點


Docker容器提供了一種構建企業應用程序和業務流程應用程序的方法,這些應用程序比傳統應用程序更容易安裝、維護和移動。

Docker容器支持隔離:Docker容器使應用程序不僅彼此隔離,而且與底層系統隔離。這不僅使軟件棧更乾淨,而且更容易使容器化應用程序使用系統資源,例如CPU、GPU、內存、I/O、網絡等,它還可以確保數據和代碼保持獨立。

Docker容器支持可移植性:Docker容器在支持容器運行環境的任何機器上運行。應用程序不必綁定到主機操作系統,因此可以保持應用程序環境和底層操作環境的整潔和最小化。

例如,採用容器的MySQL將在大多數支持容器的Linux系統上運行,應用程序的所有依賴項通常都在同一個容器中提供。基於容器的應用程序可以輕易從on-prem系統遷移到雲環境中,或從開發人員的筆記本電腦移到服務器上,只要目標系統支持Docker以及可能與之一起使用的任何第三方工具,比如Kubernetes。

通常,Docker容器鏡像必須為特定的平臺構建。例如Windows容器不能在Linux上運行,反之亦然;以前,繞過此限制的一種方法是啟動運行所需操作系統實例的虛擬機,並在虛擬機中運行容器。

然而Docker團隊後來設計了一個更優雅的解決方案,稱為manifest,它允許多個操作系統的鏡像並行打包。儘管manifest雖然還處於試驗階段,但這暗示了容器可能成為跨平臺應用程序解決方案和跨環境應用程序解決方案。

Docker容器支持可組合性:大多數業務應用程序由幾個獨立的組件組成,web服務器、數據庫和cache緩存。Docker容器可以將這些部件組合成一個容易更換的功能單元。每個部分由不同的容器提供,可以獨立於其他容器進行維護、更新、交換和修改。

這本質上是應用程序設計的微服務模型。通過將應用程序功能劃分為獨立的、自包含的服務,微服務模型為過程緩慢的傳統開發和單一僵化的應用程序提供了一種解決方案,輕量級和便攜式容器使構建和維護基於微服務的應用程序變得更加容易。

Docker容器簡化了編排和擴展:由於容器是輕量級的,並且開銷很小,所以可以在給定的系統上啟動更多的容器,而且容器也可以用於跨系統集群擴展應用程序,並將服務向上或向下擴展以滿足高峰需求或節約資源。

用於部署、管理和擴展容器的大多數企業級工具版本都是通過第三方項目提供的。其中最主要的是谷歌的Kubernetes,這是一個支持容器部署和擴展的自動化系統,還支持容器連接、負載平衡和管理。Kubernetes還提供了創建和重用多容器應用程序或“Helm charts”圖表的方法,這樣就可以根據需要構建和管理複雜的應用程序堆棧。

Docker還內置了Swarm編排模式,目前該模式應用比較少,Kubernetes已成為某種默認選擇。事實上Kubernetes與Docker Enterprise Edition捆綁在一起。

Docker是如何征服容器世界的?


幾十年來,Unix操作系統(如BSD和Solaris)一直存在這樣一種思想,即給定的進程可以在一定程度上獨立於其操作環境運行。最初的Linux容器技術LXC是一種os級別的虛擬化方法,用於在一臺主機上運行多個隔離的Linux系統。LXC是通過兩個Linux特性實現的:命名空間(namespaces)和cgroups控制組(controlgroups),命名空間封裝了一組系統資源,使其看起來像是專門用於該進程的;cgroups控制組用於管理一組進程的系統資源(如CPU和內存)的隔離和使用。

容器將應用程序與操作系統解耦,這意味著用戶可以擁有一個乾淨且最小的Linux操作系統,並在一個或多個隔離的容器中運行其他所有東西。由於操作系統是從容器中抽象出來的,所以您可以將容器移動到支持容器運行環境的任何Linux服務器上。

Docker在LXC基礎上進行了幾項重大更改,使容器更加便捷和靈活。使用Docker容器,比使用虛擬機更快、更容易地部署、複製、移動和備份工作負載。Docker為任何能夠運行容器的基礎架構帶來了雲一樣的靈活性。Docker的容器鏡像工具也是LXC的一個改進,它允許開發人員構建鏡像庫,從多個鏡像組合應用程序,並在本地或遠程基礎架構上啟動這些容器和應用程序。

Docker表現並不萬能


容器可以解決很多問題,但也不是萬能藥,有一些缺點是由設計本身造成的。

Docker容器不是虛擬機。人們對容器最常見的錯誤是將它們等同於虛擬機。然而,由於容器和虛擬機使用不同的隔離機制,它們有明顯不同的優點和缺點。

虛擬機為進程提供了高度的隔離,因為它們在自己的操作系統實例中運行。該操作系統也不必與主機上運行的操作系統相同。Windows虛擬機可以在Linux管理程序上運行,反之亦然。

相反,容器使用主機操作系統資源的受控部分;許多應用程序以高度管理的方式共享相同的OS內核。因此,容器化應用程序不像虛擬機那樣完全隔離,但是它們為絕大多數工作負載提供了足夠的隔離。

Docker容器無法提供裸機速度。容器幾乎沒有虛擬機的開銷,但是它們的性能影響仍然是存在的。如果您的工作負載需要裸機速度,那麼容器可能足夠接近—比vm更接近—但是您仍然會看到一些開銷。

Docker容器是無狀態和不可變的。容器從描述其內容的鏡像啟動和運行。默認情況下,該鏡像是不可變的——一旦創建,它就不會更改。

因此,容器沒有持久性。如果啟動一個容器實例,然後將其終止並重新啟動它,那麼新的容器實例將不會具有與舊容器實例關聯的任何有狀態信息。

這是容器區別於虛擬機的另一個方式。默認情況下,虛擬機具有跨會話的持久性,因為它有自己的文件系統。對於容器來說,改變這種情況的唯一方法是創建一個新的、修改過的容器鏡像。

從積極的方面看,容器的無狀態性使容器的內容更加一致,它還迫使開發人員將應用程序數據與應用程序代碼分開。如果希望容器具有任何持久性狀態,則需要將該狀態放置到其他位置。可以是數據庫,也可以是在引導時連接到容器的獨立數據卷。

Docker容器不是微服務。在前面提到過容器如何幫助創建微服務應用程序。這並不意味著將給定的應用程序粘貼到容器中就會自動創建一個微服務。無論微服務是否部署在容器中,都必須根據微服務設計模式構建微服務應用程序。

當虛擬機出現時,它們使應用程序與所運行的系統解耦成為可能。Docker容器進一步實現了這一想法,它不僅比虛擬機更輕量級、更便攜、運行速度更快,而且還提供了虛擬機無法提供的擴展、組合和管理特性。

"

相關推薦

推薦中...