編者按:Docker作為近幾年來(lái)最受歡迎的開(kāi)源技術(shù),操作簡(jiǎn)單是其迅速能流行起來(lái)的原因之一。寫(xiě)個(gè)Dockerfile,在本地build成鏡像,就能很快地運(yùn)行起來(lái)。但那是對(duì)于個(gè)人開(kāi)發(fā)者來(lái)說(shuō),對(duì)于公司或組織來(lái)說(shuō),在生產(chǎn)環(huán)境中應(yīng)用Docker并不容易,本文將為你細(xì)數(shù)在生產(chǎn)環(huán)境中應(yīng)用Docker之前,需要做的關(guān)鍵決策。以下為譯文:
>>>>
關(guān)鍵決策1:鏡像管理
在開(kāi)發(fā)環(huán)境中,寫(xiě)一個(gè)Dockerfile或docker-compose.yml文件來(lái)構(gòu)建鏡像是很簡(jiǎn)單的事情,但在生產(chǎn)環(huán)境中,你應(yīng)該創(chuàng)建一個(gè)可持續(xù)的流程來(lái)構(gòu)建Docker鏡像文件。這會(huì)減少對(duì)本地環(huán)境的依賴,同時(shí)避免開(kāi)發(fā)筆記本成為唯一構(gòu)建新鏡像的手段。還能讓你創(chuàng)建一個(gè)從代碼提交到Docker鏡像的持續(xù)部署的流程,這個(gè)流程還不需要任何人為的干預(yù)。
你可能還需要一個(gè)私有的Docker鏡像倉(cāng)庫(kù)。雖然Docker提供了私有的鏡像倉(cāng)庫(kù),你可以去部署和管理,但限于國(guó)內(nèi)的網(wǎng)絡(luò)環(huán)境,用起來(lái)會(huì)很不爽。
>>>>
關(guān)鍵決策2:云的選擇
大部分自建Docker生產(chǎn)環(huán)境的用戶,也還是要把Docker部署到IaaS上。雖然目前許多IaaS都支持Docker容器的部署,但是大部分的資源消耗都超出了容器實(shí)例本身所需的資源,在最開(kāi)始做好價(jià)格的調(diào)查很重要。
還要注意在不同平臺(tái)的容器部署流程也不盡相同,如果未來(lái)想更換云服務(wù)商會(huì)比較麻煩。如果你希望采用多個(gè)云避免被lock-in,還需要做一些額外的方案來(lái)保證流程的一致。這樣考慮的話,選擇一家CaaS服務(wù)更能直接達(dá)到目的。
>>>>
關(guān)鍵決策3:網(wǎng)絡(luò)訪問(wèn)和安全
在本地開(kāi)發(fā)環(huán)境中跑容器,是不會(huì)產(chǎn)生安全風(fēng)險(xiǎn)的。所有的進(jìn)程跑在單一的主機(jī)上,可以將常見(jiàn)的針對(duì)生產(chǎn)環(huán)境服務(wù)器的網(wǎng)絡(luò)入侵和攻擊的風(fēng)險(xiǎn)隔離在外。
為了方便在開(kāi)發(fā)過(guò)程中的故障檢修,開(kāi)發(fā)的配置是很開(kāi)放的。而在生產(chǎn)環(huán)境中的網(wǎng)絡(luò)設(shè)置需要更多的考慮。比如,一些特定的容器是不能被公網(wǎng)訪問(wèn)的,只能被一個(gè)私有網(wǎng)絡(luò)中的其它容器訪問(wèn)。網(wǎng)絡(luò)流量監(jiān)控,暴力破解等攻擊方式應(yīng)該都能被識(shí)別出來(lái),并能得到適當(dāng)?shù)奶幚怼?/p>
你還需要時(shí)刻關(guān)注新發(fā)布的安全包,決定你的主機(jī)和容器是否安全,或者是必須安裝的。將容器投入生產(chǎn)環(huán)境時(shí),需要考慮網(wǎng)絡(luò)訪問(wèn),還有你的容器和Docker主機(jī)是不是打了補(bǔ)丁,不要忽略了生產(chǎn)環(huán)境的關(guān)鍵步驟。
>>>>
關(guān)鍵決策4:容器和主機(jī)間的負(fù)載均衡
一旦服務(wù)從一個(gè)單獨(dú)的容器遷移到跨主機(jī)的多個(gè)容器上,就會(huì)有負(fù)載均衡的需求。使用類似Nginx或HAProxy的工具是最常用的做法,但要隨著容器的創(chuàng)建和部署,以及新的Docker主機(jī)的添加,保持配置的更新是很難的。
注意!要支持多版本同時(shí)運(yùn)行,除非你計(jì)劃在升級(jí)時(shí),離線部署應(yīng)用。你的負(fù)載均衡策略要考慮到這一點(diǎn),防止掉線或者網(wǎng)絡(luò)被路由到錯(cuò)誤的版本。
>>>>
關(guān)鍵決策5:部署流程
許多開(kāi)發(fā)者都認(rèn)為:在開(kāi)發(fā)環(huán)境中用起來(lái)沒(méi)問(wèn)題的工具,在生產(chǎn)環(huán)境中用起來(lái)肯定也沒(méi)問(wèn)題。但情況并不是這樣的,比如Docker Compose在開(kāi)發(fā)和生產(chǎn)環(huán)境配置就大相徑庭,從volume綁定到端口綁定和網(wǎng)絡(luò)配置都不一樣。在多主機(jī)的環(huán)境下,復(fù)雜度會(huì)更高。另外,生產(chǎn)環(huán)境中還會(huì)有很多開(kāi)發(fā)環(huán)境之外的容器,比如日志收集,外部數(shù)據(jù)庫(kù),和HA消息代理等。
協(xié)調(diào)環(huán)境配置的差異需要很多腳本的工作,它不像在生產(chǎn)環(huán)境中一行docker-compose up這么簡(jiǎn)單。從一個(gè)簡(jiǎn)單的,單容器的應(yīng)用到多個(gè)容器,通過(guò)負(fù)載均衡器分擔(dān)workload的環(huán)境中,要事先做好各種細(xì)節(jié)的考慮。隨著應(yīng)用的成熟和流量的上升,滾動(dòng)升級(jí)(rolling upgrade)和藍(lán)綠部署(Blue-green?deployment)的策略都可以預(yù)防網(wǎng)站宕機(jī)。
>>>>
關(guān)鍵決策6:服務(wù)發(fā)現(xiàn)
隨著容器數(shù)量的增長(zhǎng),管理這些容器的成本也在增加。許多工具可以管理這個(gè)過(guò)程,大部分需要被集成到你的Docker生產(chǎn)環(huán)境中。不管選擇什么都要保證服務(wù)注冊(cè)和容器實(shí)例的同步,以及容器被部署到多個(gè)Docker主機(jī)上時(shí)的負(fù)載均衡,這樣做可以保證你的應(yīng)用被路由到特定的容器實(shí)例。
>>>>
關(guān)鍵決策7:日志管理
在開(kāi)發(fā)環(huán)境中使用DockerCompose會(huì)讓日志變得瑣碎,跨主機(jī)的多容器環(huán)境會(huì)讓情況變得更復(fù)雜。分布式日志可以將多個(gè)服務(wù)器中的日志匯總起來(lái),你的生產(chǎn)環(huán)境基礎(chǔ)設(shè)施需要跨容器的日志收集器。還需要提供相應(yīng)的查看和搜索這些日志的功能。
>>>>
關(guān)鍵決策8:容器監(jiān)控
在生產(chǎn)環(huán)境中對(duì)容器的監(jiān)控相當(dāng)重要,從Docker主機(jī)到容器,你需要知道每個(gè)服務(wù)和整個(gè)系統(tǒng)的健康狀況。選擇正確的工具和監(jiān)控策略,可以減小宕機(jī)帶來(lái)的損失,還能最大化的利用主機(jī)資源,保證良好的用戶體驗(yàn)。
>>>>
關(guān)鍵決策9:數(shù)據(jù)庫(kù)管理
開(kāi)發(fā)環(huán)境中,數(shù)據(jù)庫(kù)可以跨容器托管,不用擔(dān)心I/O性能。在生產(chǎn)環(huán)境中,這個(gè)問(wèn)題就不容忽視了,尤其是當(dāng)我們的應(yīng)用有很高的用戶體驗(yàn)需求時(shí)。擴(kuò)展數(shù)據(jù)庫(kù)來(lái)按需處理I/O的增長(zhǎng),以保證高可用性和可靠的備份/存儲(chǔ)策略,是保證現(xiàn)代web應(yīng)用和移動(dòng)APP運(yùn)行的關(guān)鍵。選擇生產(chǎn)環(huán)境的策略會(huì)對(duì)你的用戶產(chǎn)生積極或消極的影響。
>>>>
以上缺一不可嗎?
是的!以上都是產(chǎn)品成功不可或缺的要素,除非你在部署一個(gè)流量不大的,不重要的應(yīng)用。要記住,Docker只是一個(gè)工具,并不是一個(gè)產(chǎn)品化的架構(gòu)解決方案。Docker提供了很多令人『驚艷』的功能,但想在開(kāi)發(fā)環(huán)境中使用Docker,要付出的努力并不亞于其它工具。
如果你的核心并不在這些技術(shù),而是業(yè)務(wù),建議選擇一家CaaS供應(yīng)商,而不是自己搭建整個(gè)Docker生產(chǎn)環(huán)境。(比如靈雀云)
via:http://www.alauda.cn/2016/07/20/production-docker/