容器並不能解決一切問題

{"type":"doc","content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"italic"},{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":"我們的行業在過去十年中取得了令人難以置信的進步,這在一定程度上要歸功於Docker、Docker Compose和Kubernetes等技術。然而,我們仍在研究如何在我們所處的多樣化環境中進行開發。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":"容器化在開發和運維領域掀起了一場風暴。在過去,部署是高度依賴於特定技術的,通常需要對每個項目進行大量不可重複的工程工作。你是否部署到VPS?你是否在分法虛擬機鏡像?靜態可執行文件?需要特定解釋器的腳本?根據你對這些問題的回答,你可能已經使用了Capistrano、Puppet、shell腳本、Ansible、deb或rpm包、cloud-init腳本、專有云技術、upstart、systemd、init等很多技術。在部署階段,系統管理和開發之間的界限就變得模糊了,DevOps的原則就誕生了。隨着DevOps開始成熟,業界發展出了應用開發的最佳實踐,比如"},{"type":"link","attrs":{"href":"https:\/\/12factor.net","title":null,"type":null},"content":[{"type":"text","marks":[{"type":"underline"}],"text":"12因素應用程序方法論"}],"marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}]},{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":",但許多實現細節仍然是依賴於特定技術的。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":" "}]},{"type":"heading","attrs":{"align":null,"level":2},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":"進入Docker"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"image","attrs":{"src":"https:\/\/static001.geekbang.org\/infoq\/6d\/6da5421443ce27c16d1536f135125f8e.png","alt":null,"title":null,"style":[{"key":"width","value":"75%"},{"key":"bordertype","value":"none"}],"href":null,"fromPaste":true,"pastePass":true}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"heading","attrs":{"align":null,"level":4},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":"使用Docker打包和部署"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":"然後Docker出現了,並通過如下簡單的規則使應用程序的部署產品化:如果你的應用程序可以打包成一個容器,那麼它就可以部署在任何地方。容器並不是什麼新鮮事——畢竟,谷歌已經使用它們很多年了。Unix黑客也曾出於類似目的使用Solaris Zones和FreeBSD jail。然而,在Docker出現之前,還沒有一個很好的方式可以輕鬆地將應用程序打包到一個可移植的容器中。Docker徹底改變了我們部署應用程序的方式。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":"Docker解決了許多重要的部署問題,所以接下來要問的問題是Docker是否爲開發提供了任何優勢。擁有一個看起來(至少大體看起來)像生產環境的開發環境有很多好處。如果你在生產環境中部署Docker容器,那麼在開發過程中在容器中運行代碼也是合理的。此外,Docker還解決了版本依賴關係的問題。例如,如果你有一個應用程序需要MySQL 5.3,而另一個應用程序需要MySQL 5.7,那麼你就不需要在本地運行兩個版本,也不需要在各自的虛擬機中運行每個版本。你可以爲每個版本使用一個容器,它們可以在幾秒鐘內啓動和停止。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":" "}]},{"type":"heading","attrs":{"align":null,"level":4},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":"使用Docker Compose進行開發"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"image","attrs":{"src":"https:\/\/static001.geekbang.org\/infoq\/10\/10a3713c54161d4c90f06ff0935d00b9.png","alt":null,"title":null,"style":[{"key":"width","value":"75%"},{"key":"bordertype","value":"none"}],"href":null,"fromPaste":true,"pastePass":true}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"heading","attrs":{"align":null,"level":4},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":"使用Docker Compose管理開發環境"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":"2013年底,Docker Compose(當時稱爲fig)進入了這個領域。Docker Compose有一個簡單的前提:與使用一次性腳本啓動和停止應用程序及其在開發中的依賴不同,你把它們描述爲YAML文件中的Docker容器,並讓Docker Compose管理它們的生命週期。它提供了一些額外的細節,如爲12因素應用程序提供日誌採集、環境變量以及基本容器網絡。簡而言之,Docker Compose對那些想要使用容器化的方法開發12因素應用程序的開發人員來說是一種完美工具。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":"乍一看,Docker Compose似乎是本地開發的理想解決方案——在許多情況下,它確實是。然而,就像它的名字一樣,它只關注那些一切都在Docker內部運行的開發工作流。在某些情況下,這樣做很好。例如,如果你在Node.JS中編寫一個依賴於Postgres的API,那麼你可以在nodejs容器中運行代碼(可能在它前面有一個文件監視器),在Postgres容器中運行Postgres。然而,並不是所有的開發工作流都可以被容器化。無論是爲了性能、易於與主機操作系統特性集成,還是其他許多原因,有時最好將開發環境的某些部分作爲本地進程運行,而將其他部分作爲容器運行。你仍然需要拼湊一個解決方案,以將非Docker部分與一些Docker容器進行集成。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":"此外,考慮到Docker依賴於Linux內核特定的特性來實現容器,macOS、Windows、FreeBSD和其他操作系統的用戶仍然需要虛擬化層。我們想要通過使用容器來擺脫的一系列複雜的網絡、文件同步和虛擬機管理等問題仍然存在。當然,它們通常是可以工作的——"},{"type":"link","attrs":{"href":"https:\/\/stackoverflow.com\/questions\/55951014\/docker-in-macos-is-very-slow","title":null,"type":null},"content":[{"type":"text","marks":[{"type":"underline"}],"text":"直到出現問題"}],"marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}]},{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":",這時我們就只剩下谷歌、Stack Overflow和GitHub來幫助我們找到解決方案。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":" "}]},{"type":"heading","attrs":{"align":null,"level":2},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":"現代開發:雲和微服務"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"image","attrs":{"src":"https:\/\/static001.geekbang.org\/infoq\/34\/34ee89fa3f7bdacccedf1b21a339fb07.png","alt":null,"title":null,"style":[{"key":"width","value":"75%"},{"key":"bordertype","value":"none"}],"href":null,"fromPaste":true,"pastePass":true}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"heading","attrs":{"align":null,"level":4},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":"雲原生開發的複雜性"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":"快進到2021年,大多數生產級應用也依賴於雲基礎設施,這些基礎設施不能作爲本地Docker容器運行,因此我們面臨一系列新的問題,每個問題都需要權衡:"}]},{"type":"bulletedlist","content":[{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":"我們是否將雲服務存根?這種方法成本低、性能好,但除了非常簡單的服務外,維護本地存根所需工程量很高。"}]}]},{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":"每個開發人員是否都有自己的每個雲資源實例?這通常代價高昂,公司必須支付很高的成本來保留很少使用的基礎設施。無服務器產品通常比預留產品有更好的成本模型,但仍然必須考慮成本。"}]}]},{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":"開發人員是否共享共同的開發基礎設施?在此選項中,基礎設施成本降低了,但通常需要額外的工程量,以便多個應用程序可以共享相同的數據庫和其他有狀態服務而不會發生衝突。換句話說,每個應用程序都必須支持多租戶。"}]}]}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":"以上選項在不同的場景中都是可行的,但這裏要說的是採用Docker或者Docker Compose並不能解決問題——甚至不能指出哪個選項是最好的!現代開發環境編排器必須具有云感知能力並支持不同的運行時架構。目前,基礎設施即代碼工具最接近解決這個問題,但由於它們專注於生產部署,因此無法與本地開發環境順利集成。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":"除了雲服務,微服務還具有它們自身的複雜性,這些複雜性是“僅僅使用Docker”無法解決的。任何採用了微服務策略的大型組織都會迅速發展到任何開發人員都可以在其筆記本電腦上運行該組織所有服務的地步。像"},{"type":"link","attrs":{"href":"https:\/\/www.telepresence.io","title":null,"type":null},"content":[{"type":"text","marks":[{"type":"underline"}],"text":"Telepresence"}],"marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}]},{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":"這樣的工具有助於將本地容器連接到遠程Kubernetes集羣中運行的容器,但我們仍然缺乏能夠跨本地和遠程環境透明地處理服務發現、代理和身份驗證等問題的高級工具。而且,現有的工具大多是以kubernetes爲中心的,這給很多開發人員增加了使用難度。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":" "}]},{"type":"heading","attrs":{"align":null,"level":2},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":"下一步是什麼?"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":"我們的行業在過去十年中取得了令人難以置信的進步,這在一定程度上要歸功於Docker、Docker Compose和Kubernetes等技術。然而,我們仍在研究如何在我們所處的多樣化環境中進行開發。下一代開發工具必須能夠處理本地進程、Docker容器、雲服務,甚至其他團隊的微服務的構建和運行。針對所有這些問題,我們還沒有答案,但我們正在構建"},{"type":"link","attrs":{"href":"https:\/\/exo.deref.io","title":null,"type":null},"content":[{"type":"text","marks":[{"type":"underline"}],"text":"exo"}],"marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}]},{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":",以幫助像我們這樣的開發者克服本地開發的複雜性。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":" "}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":"原文鏈接:"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"link","attrs":{"href":"https:\/\/blog.deref.io\/containers-dont-solve-everything\/","title":null,"type":null},"content":[{"type":"text","text":"https:\/\/blog.deref.io\/containers-dont-solve-everything\/"}],"marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}]}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":" "}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":" "}]}]}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章