天天看點

Docker 容器十誡

Docker 容器十誡

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

首先:容器是不可變的 —— 作業系統、庫版本、配置、檔案夾以及應用全都包裹在容器内。你可以確定,在 qa 階段測試的一張圖檔,肯定會在生産環境中出現,并且行為保持一緻。

其次:容器是輕量級的 —— 容器的記憶體占用很小。容器隻會給主程序配置設定記憶體,是以無需十幾萬個 mb 的記憶體空間。

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

然而,許多使用者仍然隻是将容器視為典型的虛拟機。他們忘記了容器的一個重要特征:容器是可丢棄的。

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

Docker 容器十誡

鑒于這一特征,使用者必須轉變他們使用以及管理容器時的心态。下面,筆者将介紹為了充分利用 docker 容器的好處,使用者應該避免的十個陷阱:

1)不要在容器記憶體儲資料 —— 容器可以被停止、銷毀或者取代。運作在容器中的應用1.0版本應該能夠輕易地被1.1版本所取代,且不産生任何影響或資料丢失。是以,如果你需要存儲資料,請将其存儲在卷組(volume)中。在這種情況下,你要格外小心兩個容器向同一卷組寫入資料的情況,因為這很容易導緻資料污染。總之,要確定自己的應用向共享的資料存儲區填寫資料。

2)不要将應用分開釋出 —— 有些人會将容器視為虛拟機,他們中的大部分人認為,應該在現有的運作容器中部署應用。在開發階段,因為需要不斷地修改配置并調試應用,這樣做無可厚非。但是,當持續傳遞管道行進至 qa 與生産階段時,不應該把鏡像和應用分開。記住:容器是不可變的。

3)不要建立太大的鏡像 —— 鏡像越大,越難以分發。確定隻留有運作應用或程序所需的檔案和庫。不要安裝不必要的包或運作“update”(yum update)指令下載下傳太多檔案到新的鏡像層。

5)不用為運作中的容器建立鏡像 —— 換句話說,不要使用 “docker commit” 指令建立鏡像。這種建立鏡像的方法是不可重制的,應該完全避免。相反,總是使用 dockerfile 或任何 s2i (source-to-image,源碼到鏡像) —— 完全可重制的方法來建立鏡像。這樣一來,如果你将 dockerfile 儲存在源碼存儲控制庫(git)内,就可以追蹤其後續變化。

6)不要單獨使用“latest(最新)”标簽 —— 最新标簽就像 maven 使用者眼中的 “snapshot(快照)”。因為容器本身的分層式檔案系統,我們鼓勵使用标簽。但是,你可不想在幾個月後正打算建立鏡像時,卻驚訝地發現應用無法運作,而原因居然是一個父層(dockerfile 中的 from)已經被無法向後相容的新版取代,或是建立緩存中檢索出的“最新”版本是錯的。此外,由于你無法追蹤目前運作鏡像的版本,“最新”标簽也不應該在生産環境中部署容器時使用。

7)不要在一個容器内運作多個程序 —— 容器在運作單一程序(http 背景程序、應用伺服器、資料庫)時幾乎無可挑剔,但是,如果運作多個程序,你可能會在管理、檢索日志以及獨個更新程序時遇到麻煩。

10)不要依賴 ip 位址 —— 每個容器都有其内部 ip 位址,該位址可能因為啟動或停止容器而發生改變。如果你的應用或微服務需要與另一個容器交換消息,應該使用環境變量在容器間傳送合适的主機名與端口号。