Docker 容器十誡

【編者按】本文做者爲 Rafael Benevides,主要介紹使用 Docker 容器時應該注意的十個陷阱。文章系國內 ITOM 管理平臺 OneAPM 編譯呈現,如下爲正文。html

Docker 容器十誡

當你剛開始使用容器時,會發現容器能解決許多問題,並且好處不少:linux

  1. 首先:容器是不可變的 —— 操做系統、庫版本、配置、文件夾以及應用全都包裹在容器內。你能夠確保,在 QA 階段測試的一張圖片,確定會在生產環境中出現,而且行爲保持一致。
  2. 其次:容器是輕量級的 —— 容器的內存佔用很小。容器只會給主進程分配內存,所以無需十幾萬個 MB 的內存空間。
  3. 最後:容器速度很快 —— 啓動容器就跟啓動典型的 linux 進程同樣快。無需好幾分鐘,一個新的容器能夠在幾秒內啓動完畢。

然而,許多用戶仍然只是將容器視爲典型的虛擬機。他們忘記了容器的一個重要特徵:容器是可丟棄的git

圍繞容器的咒語:「容器是臨時的」。github

Docker 容器十誡

鑑於這一特徵,用戶必須轉變他們使用以及管理容器時的心態。下面,筆者將介紹爲了充分利用 Docker 容器的好處,用戶應該避免的十個陷阱:docker

1)不要在容器內存儲數據 —— 容器能夠被中止、銷燬或者取代。運行在容器中的應用1.0版本應該可以輕易地被1.1版本所取代,且不產生任何影響或數據丟失。所以,若是你須要存儲數據,請將其存儲在卷組(volume)中。在這種狀況下,你要格外當心兩個容器向同一卷組寫入數據的狀況,由於這很容易致使數據污染。總之,要確保本身的應用向共享的數據存儲區填寫數據。數據庫

2)不要將應用分開發布 —— 有些人會將容器視爲虛擬機,他們中的大部分人認爲,應該在現有的運行容器中部署應用。在開發階段,由於須要不斷地修改配置並調試應用,這樣作無可厚非。可是,當持續交付管道行進至 QA 與生產階段時,不該該把鏡像和應用分開。記住:容器是不可變的。緩存

3)不要建立太大的鏡像 —— 鏡像越大,越難以分發。確保只留有運行應用或進程所需的文件和庫。不要安裝沒必要要的包或運行「update」(yum update)指令下載太多文件到新的鏡像層。安全

更新:關於這條建議,有一篇解釋更爲詳盡的文章:《保持小巧:細究 Docker 鏡像大小》服務器

4)不要使用單層鏡像 —— 爲了有效利用分層的文件系統,老是爲操做系統建立基礎鏡像層,此外,分別爲用戶名定義運行時安裝、配置、以及本身的應用建立不一樣的鏡像層。這樣一來,重現、管理以及傳送鏡像會變得更爲簡單。運維

5)不用爲運行中的容器建立鏡像 —— 換句話說,不要使用 「docker commit」 指令建立鏡像。這種建立鏡像的方法是不可重現的,應該徹底避免。相反,老是使用 Dockerfile 或任何 S2I (source-to-image,源碼到鏡像) —— 徹底可重現的方法來建立鏡像。這樣一來,若是你將 Dockerfile 保存在源碼存儲控制庫(git)內,就能夠追蹤其後續變化。

6)不要單獨使用「latest(最新)」標籤 —— 最新標籤就像 Maven 用戶眼中的 「SNAPSHOT(快照)」。由於容器自己的分層式文件系統,咱們鼓勵使用標籤。可是,你可不想在幾個月後正打算建立鏡像時,卻驚訝地發現應用沒法運行,而緣由竟然是一個父層(Dockerfile 中的 FROM)已經被沒法向後兼容的新版取代,或是建立緩存中檢索出的「最新」版本是錯的。此外,因爲你沒法追蹤當前運行鏡像的版本,「最新」標籤也不該該在生產環境中部署容器時使用。

7)不要在一個容器內運行多個進程 —— 容器在運行單一進程(http 後臺進程、應用服務器、數據庫)時幾乎無可挑剔,可是,若是運行多個進程,你可能會在管理、檢索日誌以及獨個更新進程時遇到麻煩。

8)不要在鏡像中存儲憑證 —— 使用環境變量。不要將鏡像中的任何用戶名或密碼寫死。使用環境變量從容器外部檢索這些信息。Postgress 鏡像就是踐行該準則的好榜樣。

9)不要以 root 用戶運行進程 —— 「默認狀況下,docker 容器以 root 權限運行。(…)隨着 Docker 的不斷完善,更多安全的默認選項會逐漸出現。就當下而言,要求 root 權限對有些用戶而言比較危險,可能沒法在全部環境中實現。你的鏡像應該使用 USER 指令爲容器肯定一個非 root 運行權限。」(摘自《Docker 鏡像做者指南》

10)不要依賴 IP 地址 —— 每一個容器都有其內部 IP 地址,該地址可能由於啓動或中止容器而發生改變。若是你的應用或微服務須要與另外一個容器交換消息,應該使用環境變量在容器間傳送合適的主機名與端口號。

OneAPM Cloud Insight 產品集監控、管理、計算、協做、可視化於一身,幫助全部 IT 公司,減小在系統監控上的人力和時間成本投入,讓運維工做更加高效、簡單。想閱讀更多技術文章,請訪問 OneAPM 官方技術博客

本文轉自 OneAPM 官方博客

原文地址:http://developerblog.redhat.com/2016/02/24/10-things-to-avoid-in-docker-containers/

相關文章
相關標籤/搜索