從 Docker 的新手村出發(fā)?那么你需要這11條守則
很多人最終還是決定使用 Docker 解決問(wèn)題。 Docker 的優(yōu)點(diǎn)很多,比如:
- 一體化——將操作系統(tǒng)、庫(kù)版本、配置文件、應(yīng)用程序等全部打包裝在容器里。從而保證 QA 所測(cè)試的鏡像 (image) 會(huì)攜帶同樣的行為到達(dá)生產(chǎn)環(huán)境。
- 輕量——內(nèi)存占用極小,只為主要過(guò)程分配內(nèi)存。
- 快讀——一鍵啟動(dòng),就像啟動(dòng)常見(jiàn)的 linux 過(guò)程一樣快。
盡管如此,眾多用戶仍然只是把容器當(dāng)做常見(jiàn)的虛擬機(jī),而忘記了容器的一個(gè)重要特性:
用后即棄
正因?yàn)檫@一特點(diǎn),一些用戶需要改變他們對(duì)容器的觀念,為了更好的使用與發(fā)揮 Docker 容器的價(jià)值,有一些事情是絕對(duì)不應(yīng)該做的:
1.不要在容器(container)中存儲(chǔ)數(shù)據(jù) 容器可能會(huì)被中斷、被替換或遭到破壞。在容器中運(yùn)行的 1.0 版應(yīng)用程序很容易就會(huì)被 1.1 版取代,而不會(huì)對(duì)數(shù)據(jù)造成影響或?qū)е聰?shù)據(jù)丟失。因此,如果需要存儲(chǔ)數(shù)據(jù),請(qǐng)存儲(chǔ)在卷 (volume) 中。在這一情況下,還應(yīng)注意兩個(gè)容器是否會(huì)在同一個(gè)卷上寫入數(shù)據(jù),這將導(dǎo)致?lián)p壞。請(qǐng)確保應(yīng)用程序適用于寫入共享的數(shù)據(jù)存儲(chǔ)。
2. 不要分兩部分傳送應(yīng)用程序 有些人把容器當(dāng)作虛擬機(jī),所以他們大多會(huì)認(rèn)為,應(yīng)該將應(yīng)用程序部署到現(xiàn)有正在運(yùn)行的容器中。在需要不斷部署和調(diào)試的開(kāi)發(fā)階段,可能確實(shí)如此;但對(duì)于 QA 和生產(chǎn)的持續(xù)交付 (CD) 渠道,應(yīng)用程序應(yīng)當(dāng)是鏡像的一部分。切記:容器轉(zhuǎn)瞬即逝。
3. 不要?jiǎng)?chuàng)建大尺寸鏡像 大尺寸的鏡像難以分配。請(qǐng)確保僅使用必需文件和庫(kù)來(lái)運(yùn)行應(yīng)用程序。不要安裝不必要的數(shù)據(jù)包,也不要運(yùn)行“更新”(yum update),這些操作會(huì)把大量文件下載到新的鏡像層。
4. 不要使用單層鏡像 為了有效利用多層文件系統(tǒng),請(qǐng)始終為操作系統(tǒng)創(chuàng)建屬于自己的基本鏡像層,然后為用戶名定義創(chuàng)建一個(gè)層,為運(yùn)行時(shí)安裝創(chuàng)建一個(gè)層,為配置創(chuàng)建一個(gè)層,最后再為應(yīng)用程序創(chuàng)建一個(gè)層。這樣,重新創(chuàng)建、管理和分配鏡像就會(huì)容易些。
5. 不要從正在運(yùn)行的容器中創(chuàng)建鏡像 換句話說(shuō),不要使用"docker commit"命令來(lái)創(chuàng)建鏡像。這一鏡像創(chuàng)建方法不可復(fù)制,因此應(yīng)完全避免使用。請(qǐng)始終使用 Dockerfile 或其他任何可完全復(fù)制的 S21(從源代碼到鏡像)方法,如此一來(lái),如果存儲(chǔ)在源代碼控制存儲(chǔ)庫(kù) (GIT) 中,就可以跟蹤 Dockerfile 的變更情況。
6. 不要只使用“最新版”標(biāo)簽 最新版標(biāo)簽就像 Maven 用戶的“快照”(SNAPSHOT) 一樣。容器具有多層文件系統(tǒng)這一基本特征,所以我們鼓勵(lì)使用標(biāo)簽。相信誰(shuí)也不愿意在構(gòu)建了幾個(gè)月的鏡像后,突然發(fā)現(xiàn)應(yīng)用程序因?yàn)楦笇樱?Dockerfile 中的 FROM)被新版本取代而無(wú)法運(yùn)行(新版本無(wú)法向后兼容或從構(gòu)建緩存中檢索的“最新“版有誤)這樣的意外吧?在生產(chǎn)過(guò)程中部署容器時(shí)也應(yīng)避免使用”最新版“標(biāo)簽,這是因?yàn)闊o(wú)法跟蹤當(dāng)前運(yùn)行的鏡像版本。
7. 不要在單個(gè)容器中運(yùn)行一個(gè)以上進(jìn)程 容器只運(yùn)行一個(gè)進(jìn)程(HTTP 守護(hù)進(jìn)程、應(yīng)用程序服務(wù)器、數(shù)據(jù)庫(kù))時(shí)效果最佳,但如果運(yùn)行一個(gè)以上進(jìn)程,在管理和檢索日志以及單獨(dú)更新進(jìn)程時(shí)就會(huì)遇到很多麻煩。
8. 不要在鏡像中存儲(chǔ)證書(shū)及使用環(huán)境變量。 不要在鏡像中對(duì)任何用戶名/密碼進(jìn)行硬編碼操作。請(qǐng)使用環(huán)境變量從容器外部檢索信息。Postgres 鏡像就是這一原理的極佳詮釋。
9. 不要以 root 權(quán)限運(yùn)行進(jìn)程 “默認(rèn)情況下,Docker 容器以 root 用戶權(quán)限運(yùn)行。(……)隨著 Docker 技術(shù)日趨成熟,能夠使用的安全默認(rèn)選項(xiàng)越來(lái)越多。目前,要求 root 對(duì)其他用戶來(lái)說(shuō)較為危險(xiǎn),另外,不是所有環(huán)境都能夠使用 root。鏡像應(yīng)使用 USER 指令來(lái)為容器的運(yùn)行指定非 root 用戶。”(摘自《Docker 鏡像作者指南》(Guidance for Docker Image Authors))
10. 不要依賴 IP 地址 每個(gè)容器都有自己的內(nèi)部 IP 地址,如果啟動(dòng)然后停止容器,內(nèi)部 IP 地址可能會(huì)發(fā)生變化。如果你的應(yīng)用程序或微服務(wù)需要和另一個(gè)容器進(jìn)行通信,請(qǐng)使用環(huán)境變量在容器之間傳遞相應(yīng)的主機(jī)名和端口。
11. 監(jiān)控容器 Docker 監(jiān)控已經(jīng)越來(lái)越受到開(kāi)發(fā)者們的重視,實(shí)時(shí)監(jiān)控 Docker 的方法,這里推薦 Cloudinsight。 不同于一些需要自寫腳本的監(jiān)控手段,Cloudinsight 作為一家免費(fèi)的 SaaS 服務(wù),能夠一鍵監(jiān)控 Docker,且擁有很棒的可視化界面。除此之外,Cloudinsight 還支持多種操作系統(tǒng)、數(shù)據(jù)庫(kù)等的監(jiān)控,能夠一體化展示所有被監(jiān)控的系統(tǒng)基礎(chǔ)組件的性能數(shù)據(jù)。