Docker 容器十誡

KenFrench 7年前發布 | 9K 次閱讀 Docker

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

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

首先:容器是不可變的 —— 操作系統、庫版本、配置、文件夾以及應用全都包裹在容器內。你可以確保,在 QA 階段測試的一張圖片,肯定會在生產環境中出現,并且行為保持一致。

其次:容器是輕量級的 —— 容器的內存占用很小。容器只會給主進程分配內存,因此無需十幾萬個 MB 的內存空間。

最后:容器速度很快 —— 啟動容器就跟啟動典型的 Linux 進程一樣快。無需好幾分鐘,一個新的容器可以在幾秒內啟動完畢。

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

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

鑒于這一特征,用戶必須轉變他們使用以及管理容器時的心態。下面,筆者將介紹為了充分利用 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 地址,該地址可能因為啟動或停止容器而發生改變。如果你的應用或微服務需要與另一個容器交換消息,應該使用環境變量在容器間傳送合適的主機名與端口號。

原文鏈接:

 

來自:http://dockone.io/article/1982

 

 本文由用戶 KenFrench 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!