为什么Docker容器将占领世界
為什么Docker容器將占領世界
我加入了bieryun,主持了一個關于Docker的網絡研討會,以及您可以使用容器將傳統Windows應用程序遷移到云端以及運行開源無服務器平臺。?
我分享了Docker容器啟用的最常用的用例。這些是公司目前在生產中所做的事情。以下是前五個場景,以及我在現場網絡研討會上對問答的所有答案。
將應用遷移到云端
將現有工作負載遷移到云曾經是IaaS和PaaS之間的選擇。PaaS選項意味著將您的應用程序的要求與您選擇的云的產品目錄相匹配,并采用包含所有托管服務的組件的新架構:
這有利于運營成本和效率,但需要一個項目才能實現 - 您需要更改代碼并運行完整的回歸測試套件。當你上線時,你只能在一個云上運行,所以如果你想要多云或混合云,它將需要另一個項目。
另一種選擇是IaaS,這意味著在云中租用虛擬機。由于您只需要啟動一組VM并使用現有的部署工件和工具來部署應用程序,因此初始工作量較少:
但是,將VM環境從數據中心復制到云只意味著要復制所有運營和基礎架構的低效率。你仍然需要管理你的所有虛擬機,而且它們仍然大量未充分利用,但現在你有一個月度賬單顯示它的效率是多么低效。
新方法是首先將應用程序移動到容器,然后在云中運行它們。您可以使用現有的部署工件來構建Docker容器映像,因此您無需更改代碼。如果您可以將部署腳本編寫到Dockerfile中,那么您可以容納幾乎任何東西 - 它可能是一個已有15年歷史的.NET 2.0應用程序或去年的Node.js應用程序:
Docker化應用程序在任何地方都以相同的方式運行,因此開發人員可以使用Docker Desktop在本地運行整個堆棧。您可以使用Docker Enterprise在數據中心或云中運行它們,也可以選擇云提供商的容器服務。這些應用程序現在可以移植,運行速度遠遠超過虛擬機,并使用最新的操作系統,所以這是擺脫Windows Server 2003和2008的好方法,很快就會失去支持。
提供云原生應用程序
從初創企業到大型企業,人們都看到了新型應用程序架構帶來的好處。所述云本地計算基礎(CNCF)定義了這些類型的應用程序作為具有微服務的設計,在容器中運行,并且由容器平臺動態管理。
云原生應用程序可高效運行并輕松擴展。它們是自我修復的,因此應用程序和基礎架構問題不會導致停機。它們旨在支持快速,增量更新。在容器中運行的微服務可以獨立更新,因此可以推出對產品目錄服務的更改,而無需測試支付服務,因為支付服務不會更改:
這個架構來自GitHub上的微服務 - 演示示例,它都打包在容器中運行,因此您可以在筆記本電腦上啟動整個堆棧。它使用一系列編程語言和數據庫作為每個組件的最佳選擇。
現代化傳統應用程序
您可以在同一群集上的Docker容器中運行現有應用程序和新的云原生應用程序。它也是一個發展遺留應用程序的絕佳平臺,因此它們的外觀和感覺更像是云原生應用程序,而且您可以在沒有2年重新架構項目的情況下完成。首先將應用程序遷移到Docker。此示例適用于單個ASP.NET Web應用程序和SQL Server數據庫:
現在,您可以開始從整體中斷出功能并在單獨的容器中運行它們。版本2可以使用反向代理來引導現有monolith與在單獨容器中運行的新應用程序主頁之間的流量:
這是一個簡單的模式,用于分解Web UI而無需更改原始整體中的代碼。對于下一個版本,您可以打破應用程序的內部功能,并將其作為在另一個容器中運行的REST API公開:
這些新組件完全獨立于原始組件。你可以使用你喜歡的任何技術堆棧。每個功能都可以有自己的發布節奏,您可以按需要的比例運行每個組件。
技術創新:無服務器
到目前為止,您已經在同一群集上的Docker容器中運行了遺留應用程序,云原生應用程序和不斷發展的單塊。您以相同的方式構建,打包,分發,運行和管理所有應用程序的所有組件。您的整個應用程序環境都在一個安全,現代和開放的平臺上運行。
它并沒有就此結束。可以使用相同的平臺來探索技術創新。無服務器是一種很有前途的新部署模型,它由容器驅動。AWS Lambda和Azure功能是專有實現,但是有許多開源無服務器框架可以在數據中心或云中與Docker一起部署:
所述CNCF無服務器工作組定義的當前選擇的通用架構和管道的過程。如果您對無服務器模型感興趣,但是您在本地或跨多個云運行,那么開放框架是一個很好的選擇。Nuclio很容易上手,它在與其他應用程序相同的平臺上的Docker容器中運行。
流程創新:DevOps
下一個重大創新是DevOps,它旨在打破構建軟件的團隊和運行軟件的團隊之間的障礙,目標是更快地將更好的軟件推向市場。DevOps更多的是關于文化和流程,而不是軟件,但如果你仍在使用相同的技術和工具,很難做出有影響力的改變。
CALMS是一個很好的框架,用于理解DevOps轉換中要關注的領域。它是關于文化,自動化,精益,指標和共享的關鍵部分。如果您通過技術變革為其提供支持,那么在這些領域取得進展并量化成功要容易得多。采用容器支撐該框架:
當團隊使用相同的工具并使用相同的語言時,將團隊整合在一起要容易得多 - Dockerfiles和Docker Compose文件與應用程序源代碼一起使用,并由Dev和Ops共同擁有。它們提供了共同合作的共同點。?
自動化是Docker的核心。手動制作容器要比使用Dockerfile自動化容器要困難得多。將應用程序分解為小型單元支持精簡,您可以將指標烘焙到所有這些組件中,以便為您提供一致的方法來監控不同類型的應用程序。Docker Hub可以輕松共享,其中有數十萬個應用程序打包為Docker鏡像。
網絡研討會問答
我們在會議結束時提出了很多問題,沒有足夠的時間來回答這些問題。以下是錯過的問題。
?
問:你說你可以在你的筆記本電腦上運行你的投票應用程序,但它是Linux和Windows容器的混合體。這不會有用嗎?
答:不,你不能在一臺機器上運行Linux和Windows容器的混合體。您需要有一個運行Docker Swarm的集群,其中包含Linux和Windows服務器的混合體。示例投票應用程序具有不同的版本,因此它可以在所有Linux,全Windows或混合環境中運行。
?
問:使用Docker容器從源代碼編譯[你的應用程序]是什么?在這種情況下MSBuild?
答:是的,您編寫了一個多階段Dockerfile,其中第一階段編譯您的應用程序。該階段使用已部署工具集的Docker鏡像。Microsoft擁有.NET Framework SDK映像和.NET Core映像,還有其他平臺(如Go和Maven for Java)的官方Docker映像。您可以構建自己的SDK映像并打包所需的任何工具。
?
問:如果群集中安裝了遺留應用程序,我們如何使用Docker swarm或Kubernetes維護粘性會話?
答:您的群集節點上將有一個負載平衡器,因此流量可以進入任何服務器,然后您可以在該服務器上運行多個容器。Docker Swarm或Kubernetes都沒有為開箱即用的容器提供會話親和性,但你可以通過運行像Traefik這樣的反向代理或者像Nginx這樣的Kubernetes的會話感知入口控制器來實現。
?
問:在桌面上進行測試時,不同的操作系統要求如何工作?(例如,某些容器需要Linux,有些需要Windows,而Mac則用于開發)
答:容器非常有效,因為它們使用運行它們的主機的底層操作系統。這意味著Linux容器需要在Windows主機上的Linux主機和Windows容器上運行。Docker Desktop使這一切變得簡單 - 它為您提供和管理Linux VM。Docker Desktop for Mac只允許您運行Linux容器,但Docker Desktop for Windows支持Windows和Linux。
?
問:IDE如何適應Docker(例如,確保所有開發團隊成員都使用兼容的IDE配置)?
答:使用Docker從源代碼編譯和打包應用程序的好處在于人們使用的IDE無關緊要。當開發人員在本地測試應用程序時,他們將使用具有CI使用的相同構建腳本的Docker容器來構建和運行它。因此構建是一致的,團隊不需要使用相同的IDE - 人們可以在同一個項目中使用Visual Studio,VS Code或Rider。
?
問:如何協調Windows容器的最佳方法?
答:現在只有Docker Swarm支持生產中的Windows節點。您可以將多個Windows服務器與Docker Swarm一起加入,或者使用Docker Enterprise配置混合的Linux-Windows群集。預計到2018年底,Kubernetes將支持Windows節點。
?
問:我是否需要管理程序來管理我的Docker環境運行的底層硬件?更好的是,使用Docker是否可以滿足對VMware的需求?
答:Docker可以在裸機或VM上運行。生產Docker服務器只安裝了最小的操作系統(比如Ubuntu Server或Windows Server Core)和Docker。
?
問:在容器中運行的SQL Server可以使用Windows身份驗證嗎?
答:是的。默認情況下,容器不是域加入的,但您可以使用憑據規范運行它們,這意味著它們可以使用組管理的服務帳戶的憑據訪問AD。
?
問:對于舊的Eclipse IDE依賴,在容器內構建/編譯Java的任何建議嗎?
答:您需要在沒有任何IDE的情況下通過腳本構建應用程序。如果您可以遷移構建以使用Maven(例如),那么您可以在Dockerfile中使用Maven設置構建和打包。
?
問:那么,服務器必須擁有容器所需的所有應用程序?如果服務器沒有容器需要的應用程序,會發生什么?
A.不,恰恰相反!Docker鏡像是包含容器所需內容的包。因此,Docker鏡像中的ASP.NET應用程序將安裝.NET Framework,IIS和ASP.NET,并且您不需要在運行容器的服務器上安裝任何這些組件。?
?
問:如果您需要多種技術來運行應用程序,如何在單個包中創建支持它們的Docker鏡像?如果您需要一個不易獲得的特定技術堆棧呢?
答:您的應用程序映像需要安裝應用程序的所有先決條件。您可以使用現有圖像,如果它可以為您提供所需的一切或構建自己的圖像。只要您可以編寫腳本,就可以將其放在Dockerfile中 - 因此Windows Dockerfile可以使用Chocolatey來安裝依賴項。
?
問:Docker如何決定哪些庫/運行時將成為容器的一部分?它如何劃分OS和其他運行時?
A. Docker沒有決定。這取決于構建應用程序映像的人。目標是使您的應用程序實際需要的依賴項盡可能地使您的運行時映像盡可能小。這為您提供了更小的攻擊表面區域,并縮短了構建和部署的時間。
總結
以上是生活随笔為你收集整理的为什么Docker容器将占领世界的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Python 线程(二):简单锁实现线程
- 下一篇: 软件工程——认识方法、模型、工具和技术