部署Docker前必須問自己的四個(gè)問題
2013年4月Docker被正式發(fā)布開源,所以在軟件行業(yè)中Docker還很年輕。像我這樣的網(wǎng)蟲(nerds),對(duì)于這么明星耀眼的軟件,首先看到的是它的潛質(zhì),并思考如何開始在各種場景下的使用它。
現(xiàn)在很多博主仍在聚焦Docker的優(yōu)勢,而我們感覺到已經(jīng)是時(shí)候認(rèn)真的詢問在什么場景下、為什么這是我們***的選擇方案。而且更重要的是,當(dāng)你可能在兩者之間做出***抉擇的時(shí)候。在慎重思考以下幾點(diǎn)后,我們最終沒有將Docker用于生產(chǎn)環(huán)境。但是,如果你已經(jīng)將Docker用于生產(chǎn),我們也愿意聽一下你的原因。
我將在這篇文章中分享一下我們的一些發(fā)現(xiàn)和一些關(guān)鍵問題的概括,如果你也有計(jì)劃實(shí)施使用Docker,這些問題你應(yīng)該會(huì)遇到的。
我們也希望從你們那里聽到:你認(rèn)為是什么驅(qū)動(dòng)你采用Docker的?你怎么看待未來工具的變化?你期望它們能做到什么地步?
1-你到底需要做多少?
Docker提供功能廣泛,這里有幾個(gè)的例子:
Images(鏡像):Docker可以通過Pull和Push命令構(gòu)建對(duì)象到服務(wù)中心
Containers(容器):Docker可以通過Start/Stop命令管理容器的生命周期
Logging(日志):Docker可以通過stdout,stderro捕獲輸出所有的容器內(nèi)部信息
Volumes(存儲(chǔ)):Docker可以創(chuàng)建和管理容器的相關(guān)文件存儲(chǔ)
Networking(網(wǎng)絡(luò)):Docker可以創(chuàng)建管理虛擬的接口和內(nèi)部所有容器之間的網(wǎng)絡(luò)橋接
RPC:Docker服務(wù)器提供允許外部程序去控制所有容器的行為的API
提供的功能越多必然會(huì)增加一定程度的復(fù)雜度,據(jù)使用sloccount 統(tǒng)計(jì),僅僅在main repo中就有97100行代碼。它們?cè)贒ocker中全有或者全部沒有關(guān)系。所有的特性被打包到一個(gè)二進(jìn)制的文件中,沒有方法可以實(shí)現(xiàn)只打進(jìn)去一半。所以,如果你準(zhǔn)備開始使用Docker,就應(yīng)該考慮是否需要它提供的這些功能。
2-搞這么復(fù)雜值得嗎?
一年前,我們?yōu)榱藢ふ曳椒ê喕瘶?gòu)建運(yùn)行時(shí)的管理,開始了Docker跟Jenkins結(jié)合使用。開始這個(gè)想法后我們不得不開始擔(dān)憂構(gòu)建依賴或同時(shí)構(gòu)建造成的環(huán)境污染等問題。每一次在新容器的構(gòu)建,Docker將被隔離。這個(gè)做法(指隔離Docker的操作,譯者注)在我們僅僅需要Java和Docker而不必處理其它的沖突依賴時(shí)簡化了我們的設(shè)置。
做了這些工作良好的運(yùn)行了一段時(shí)間后,也引入了不少的問題。管理運(yùn)行時(shí)容器并非是不重要的,我們要清理掉舊的容器會(huì)留下的文件目錄,否則可能最終引起機(jī)器故障。
為了解決這些問題,我們不得不構(gòu)建了一個(gè)包裝工作(參考cide)來管理Docker容器的每次構(gòu)建。
當(dāng)cide構(gòu)建時(shí),我們也會(huì)和Dockerfile構(gòu)建者關(guān)注一些靈活性問題,它不能較好的使用Gemfiles來適應(yīng)私有庫的依賴管理。僅僅是獲取運(yùn)行時(shí)和清理工作至少要花費(fèi)三次的不同迭代。
最終新的解決方案要比先前的好。但是我們覺到這些可以更加簡單 ,可以跟工具集更緊密的結(jié)合。像所有優(yōu)秀的開發(fā)者一樣,你可以在一個(gè)在抽象層尋找一個(gè)解決方案,但是它并不是那么***。
3–你能處理故障嗎?
Pusher的例子略微小眾化,因?yàn)槲覀冇虚L期運(yùn)行的客戶端連接,這些連接有償提供給我們的客戶以便可靠快速的使用。我們必須先限制分發(fā)用戶的數(shù)量。實(shí)際上,當(dāng)我們部署時(shí)就已經(jīng)采取額外的步驟去限制故障了(參考crank的實(shí)例)。
Docker是按一個(gè)月或者兩個(gè)月的頻次發(fā)布新的版本,你很可能像通過二進(jìn)制更新到***版。但是,由于Docker是結(jié)構(gòu)化層次的,要想升級(jí)就必須關(guān)閉宿主機(jī)上的所有的容器。這就必然會(huì)增加引入新的故障挑戰(zhàn)。
目前,這是我們放棄在主生產(chǎn)環(huán)境使用Docker***的原因。我們計(jì)劃通過替換整個(gè)機(jī)器環(huán)境,通過重定向轉(zhuǎn)換DNS流量,但是直到現(xiàn)在我們也沒有解決這個(gè)問題。依據(jù)你應(yīng)用程序的架構(gòu),這些經(jīng)驗(yàn)也可以為提供一些建議。
如果你在此處不太注意,就會(huì)發(fā)現(xiàn)自己重建整個(gè)應(yīng)用程序只是為了適應(yīng)這種模式而已。這也是我們決定放棄使用Docker的另一個(gè)原因。我們懷疑它能添加延遲和一些額外的開銷。
4–你有技術(shù)支持嗎?
最終還是想想看吧,你需要捫心自問你具有操作知識(shí)嗎?我們發(fā)現(xiàn)找到詳細(xì)的實(shí)例Docker部署信息非常困難。我們遇到的都是一些操作的問題以及如何處理它們。
一旦你深入發(fā)掘Docker的更多操作,你就發(fā)現(xiàn)網(wǎng)上的一點(diǎn)點(diǎn)文檔完全不夠的。所以有兩種方式獲得問題的解答:要么多花費(fèi)時(shí)間思考問題,多去論壇交流刷刷問題,或者你總是能搜索到Docker提供的專門支持問題。
本質(zhì)上,能搜索的是有很多的基礎(chǔ)入門信息,但是很少量的信息是在***解和可操作性上是可用的。超過現(xiàn)在的水平去理解它是一個(gè)長期的實(shí)用解決方案這個(gè)問題是很難做到的。我們想給正在做出決定的人提供一點(diǎn)力所能及的幫助,這也是我們分享這篇文章其中原因之一。
那么我們應(yīng)該部署Docker嗎?
***這是一個(gè)你自己能回答的問題。根據(jù)你的使用情況,Docker中無所不包的方法是***的。 如果說萬丈高樓平地起,它確實(shí)是一個(gè)不錯(cuò)的開端。
但是如果你已經(jīng)有一個(gè)已經(jīng)發(fā)布架構(gòu),你就應(yīng)該問一下自己到底是否真的合適了。我們建議先規(guī)劃好你的應(yīng)用程序藍(lán)圖,確認(rèn)你應(yīng)該需要什么功能,然后檢測這些功能Docker是否提供。如果你在構(gòu)建一些很簡單的應(yīng)用,它可能不是你的理想工具。如果上線的時(shí)間是一個(gè)障礙,它可能也不是你的理想工具。
對(duì)于那些已經(jīng)運(yùn)行在Docker生產(chǎn)環(huán)境的,我們很樂意想聽你們對(duì)于工具的發(fā)現(xiàn)和怎么在社區(qū)交流中得到一個(gè)真實(shí)的交流從而改善社區(qū)的經(jīng)驗(yàn)。