Docker 容器十誡
【編者按】本文作者為 Rafael Benevides,主要介紹使用 Docker 容器時應該注意的十個陷阱。
Docker 容器十誡
當你剛開始使用容器時,會發現容器能解決許多問題,而且好處很多:
首先:容器是不可變的 —— 操作系統、庫版本、配置、文件夾以及應用全都包裹在容器內。你可以確保,在 QA 階段測試的一張圖片,肯定會在生產環境中出現,並且行為保持一致。
其次:容器是輕量級的 —— 容器的內存佔用很小。容器只會給主進程分配內存,因此無需十幾萬個 MB 的內存空間。
最後:容器速度很快 —— 啟動容器就跟啟動典型的 linux 進程一樣快。無需好幾分鐘,一個新的容器可以在幾秒內啟動完畢。
然而,許多用戶仍然只是將容器視為典型的虛擬機。他們忘記了容器的一個重要特徵:容器是可丟棄的。
圍繞容器的咒語:「容器是臨時的」。
Docker 容器十誡
鑒於這一特徵,用戶必須轉變他們使用以及管理容器時的心態。下面,筆者將介紹為了充分利用 Docker 容器的好處,用戶應該避免的十個陷阱:
1)不要在容器內存儲數據 —— 容器可以被停止、銷毀或者取代。運行在容器中的應用1.0版本應該能夠輕易地被1.1版本所取代,且不產生任何影響或數據丟失。因此,如果你需要存儲數據,請將其存儲在卷組(volume)中。在這種情況下,你要格外小心兩個容器向同一卷組寫入數據的情況,因為這很容易導致數據污染。總之,要確保自己的應用向共享的數據存儲區填寫數據。
2)不要將應用分開發布 —— 有些人會將容器視為虛擬機,他們中的大部分人認為,應該在現有的運行容器中部署應用。在開發階段,因為需要不斷地修改配置並調試應用,這樣做無可厚非。但是,當持續交付管道行進至 QA 與生產階段時,不應該把鏡像和應用分開。記住:容器是不可變的。
3)不要創建太大的鏡像 —— 鏡像越大,越難以分發。確保只留有運行應用或進程所需的文件和庫。不要安裝不必要的包或運行「update」(yum update)指令下載太多文件到新的鏡像層。
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 公司,減少在系統監控上的人力和時間成本投入,讓運維工作更加高效、簡單。


※前端要不要學數據結構&演算法
※MySQL 性能調優的10個方法
TAG:千鋒JAVA開發學院 |