Docker 容器十誡

OneAPM官方技術部落格發表於2016-05-13

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

Docker 容器十誡

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

  1. 首先:容器是不可變的 —— 作業系統、庫版本、配置、資料夾以及應用全都包裹在容器內。你可以確保,在 QA 階段測試的一張圖片,肯定會在生產環境中出現,並且行為保持一致。
  2. 其次:容器是輕量級的 —— 容器的記憶體佔用很小。容器只會給主程式分配記憶體,因此無需十幾萬個 MB 的記憶體空間。
  3. 最後:容器速度很快 —— 啟動容器就跟啟動典型的 linux 程式一樣快。無需好幾分鐘,一個新的容器可以在幾秒內啟動完畢。

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

圍繞容器的咒語:“容器是臨時的”。

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/

相關文章