十一條 Docker 守則

很多人最終還是決定使用 Docker 解決問題。 Docker 的優(yōu)點很多,比如:

  • 一體化——將操作系統(tǒng)、庫版本、配置文件、應用程序等全部?打包裝在容器里。?從而保證 QA 所測試的鏡像 (image) 會攜帶同樣的行為到達生產(chǎn)環(huán)境。
  • 輕量——內(nèi)存占用極小,只為主要過程分配內(nèi)存。
  • 快讀——一鍵啟動,就像啟動常見的 linux 過程一樣快。

盡管如此,眾多用戶仍然只是把容器當做常見的虛擬機,而忘記了容器的一個重要特性:

用后即棄

正因為這一特點,一些用戶需要改變他們對容器的觀念,為了更好的使用與發(fā)揮 Docker 容器的價值,有一些事情是絕對不應該做的: 1) Don’t store data in containers – A container can be stopped, destroyed, or replaced. An application version 1.0 running in container should be easily replaced by the version 1.1 without any impact or loss of data. For that reason, if you need to store data, do it in a volume. In this case, you should also take care if two containers write data on the same volume as it could cause corruption. Make sure your applications are designed to write to a shared data store.

  1. 不要在?容器(container)中存儲數(shù)據(jù) 容器可能會被中斷、被替換或遭到破壞。在容器中運行的 1.0 版應用程序很容易就會被 1.1 版取代,而不會對數(shù)據(jù)造成影響或?qū)е聰?shù)據(jù)丟失。因此,如果需要存儲數(shù)據(jù),請存儲在卷 (volume) 中。在這一情況下,還應注意兩個容器是否會在同一個卷上寫入數(shù)據(jù),這將導致?lián)p壞。請確保應用程序適用于寫入共享的數(shù)據(jù)存儲。

  2. 不要分兩部分傳送應用程序 有些人把容器當作虛擬機,所以他們大多會認為,應該將應用程序部署到現(xiàn)有正在運行的容器中。在需要不斷部署和調(diào)試的開發(fā)階段,可能確實如此;但對于 QA 和生產(chǎn)的持續(xù)交付 (CD) 渠道,應用程序應當是鏡像的一部分。切記:容器轉(zhuǎn)瞬即逝。

  3. 不要創(chuàng)建大尺寸鏡像 大尺寸的鏡像難以分配。請確保僅使用必需文件和庫來運行應用程序。不要安裝不必要的數(shù)據(jù)包,也不要運行“更新”(yum update),這些操作會把大量文件下載到新的鏡像層。

  4. 不要使用單層鏡像 為了有效利用多層文件系統(tǒng),請始終為操作系統(tǒng)創(chuàng)建屬于自己的基本鏡像層,然后為用戶名定義創(chuàng)建一個層,為運行時安裝創(chuàng)建一個層,為配置創(chuàng)建一個層,最后再為應用程序創(chuàng)建一個層。這樣,重新創(chuàng)建、管理和分配鏡像就會容易些。

  5. 不要從正在運行的容器中創(chuàng)建鏡像 換句話說,不要使用"docker commit"命令來創(chuàng)建鏡像。這一鏡像創(chuàng)建方法不可復制,因此應完全避免使用。請始終使用 Dockerfile 或其他任何可完全復制的 S21(從源代碼到鏡像)方法,如此一來,如果存儲在源代碼控制存儲庫 (GIT) 中,就可以跟蹤 Dockerfile 的變更情況。

  6. 不要只使用“最新版”標簽 最新版標簽就像 Maven 用戶的“快照”(SNAPSHOT) 一樣。容器具有多層文件系統(tǒng)這一基本特征,所以我們鼓勵使用標簽。相信誰也不愿意在構(gòu)建了幾個月的鏡像后,突然發(fā)現(xiàn)應用程序因為父層(即 Dockerfile 中的 FROM)被新版本取代而無法運行(新版本無法向后兼容或從構(gòu)建緩存中檢索的“最新“版有誤)這樣的意外吧?在生產(chǎn)過程中部署容器時也應避免使用”最新版“標簽,這是因為無法跟蹤當前運行的鏡像版本。

  7. 不要在單個容器中運行一個以上進程 容器只運行一個?進程(HTTP 守護進程、應用程序服務器、數(shù)據(jù)庫)時效果最佳,但如果運行一個以上進程,在管理和檢索日志以及單獨更新進程時就會遇到很多麻煩。

  8. 不要在鏡像中存儲?證書及使用環(huán)境變量。 不要在鏡像中對任何用戶名/密碼進行硬編碼操作。請使用環(huán)境變量從容器外部檢索信息。Postgres 鏡像就是這一原理的極佳詮釋。

  9. 不要以 root 權(quán)限運行進程 “默認情況下,Docker 容器以 root 用戶權(quán)限運行。(……)隨著 Docker 技術(shù)日趨成熟,能夠使用的安全默認選項越來越多。目前,要求 root 對其他用戶來說較為危險,另外,不是所有環(huán)境都能夠使用 root。鏡像應使用 USER 指令來為容器的運行指定非 root 用戶。”(摘自《Docker 鏡像作者指南》(Guidance for Docker Image Authors))

  10. 不要依賴 IP 地址 每個容器都有自己的內(nèi)部 IP 地址,如果啟動然后停止容器,內(nèi)部 IP 地址可能會發(fā)生變化。如果你的應用程序或微服務需要和另一個容器進行通信,請使用環(huán)境變量在容器之間傳遞相應的主機名和端口。

  11. 監(jiān)控容器 Docker 監(jiān)控已經(jīng)越來越受到開發(fā)者們的重視,實時監(jiān)控 Docker 的方法,這里推薦 Cloudinsight。 不同于一些需要自寫腳本的監(jiān)控手段,Cloudinsight 作為一家免費的 SaaS 服務,能夠一鍵監(jiān)控 Docker,?且擁有很棒的可視化界面。除此之外,Cloudinsight 還支持多種操作系統(tǒng)、數(shù)據(jù)庫等的監(jiān)控,能夠?一體化展示?所有被監(jiān)控的系統(tǒng)基礎組件的性能數(shù)據(jù)。


遵守這十一條,你就是 Docker 高手了! 不是的話,?去找原作者,科科。
本文翻譯改變自 Rafael Benevides 的文章10 things to avoid in docker containers。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關(guān)閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,502評論 19 139
  • Docker — 云時代的程序分發(fā)方式 要說最近一年云計算業(yè)界有什么大事件?Google Compute Engi...
    ahohoho閱讀 15,828評論 15 147
  • 轉(zhuǎn)載自 http://blog.opskumu.com/docker.html 一、Docker 簡介 Docke...
    極客圈閱讀 10,728評論 0 120
  • 1. 小H是我以前的一個同事,1米6身高,90斤,纖瘦,一襲長頭發(fā),給人柔弱的感覺。 小H痛經(jīng),痛到要去打止痛針,...
    做開心的自己閱讀 369評論 0 1
  • 作者劉斯佳,畢業(yè)于華東政法大學和澳大利亞國立大學,致力于講清楚和公司相關(guān)的那些法律事兒 編輯 劉婧媛,西南政法大學...
    樂樂樂樂樂樂樂閱讀 279評論 0 0

友情鏈接更多精彩內(nèi)容