Docker 容器十誡
【編者按】本文作者為 Rafael Benevides,主要介紹使用 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 地址,該地址可能因為啟動或停止容器而發生改變。如果你的應用或微服務需要與另一個容器交換訊息,應該使用環境變數在容器間傳送合適的主機名與埠號。
OneAPM Cloud Insight 產品集監控、管理、計算、協作、視覺化於一身,幫助所有 IT 公司,減少在系統監控上的人力和時間成本投入,讓運維工作更加高效、簡單。想閱讀更多技術文章,請訪問 OneAPM 官方技術部落格。
本文轉自 OneAPM 官方部落格
原文地址:http://developerblog.redhat.com/2016/02/24/10-things-to-avoid-in-docker-containers/
相關文章
- 入侵分析十誡
- 原始碼管理十誡原始碼
- 程式設計師十誡:第十誡:在規則中理解精意程式設計師
- Docker學習(十)Docker容器編排 Docker-composDocker
- 優質程式碼的十誡
- 程式設計師十誡:第二誡:不可把程式神聖化程式設計師
- 程式設計師十誡:第五誡:當認可你的工作程式設計師
- Docker最全教程——資料庫容器化(十)Docker資料庫
- [第十篇]——Docker 容器連線Docker
- 程式設計師十誡:第一誡:當熱愛軟體開發程式設計師
- 程式設計師十誡:第六誡:應專注一個領域程式設計師
- 程式設計師十誡:第八誡:當尊重公司領導和同事程式設計師
- 程式設計師十誡:第九誡:不可不堅持學習程式設計師
- 程式設計師十誡:第四誡:要有自己獨立的思考時間程式設計師
- 程式設計師十誡:第三誡:不要在休息時間談論程式碼程式設計師
- 禪修程式設計師十誡 [譯文]程式設計師
- 程式設計師十誡:第七誡:不可不關注生活和親近大自然程式設計師
- 爸爸和無私程式設計十條誡律程式設計
- Docker容器Docker
- docker 容器互通Docker
- Docker 容器操作Docker
- 操作Docker容器Docker
- Docker容器操作Docker
- 容器引擎-DockerDocker
- 程式設計師父親的遺產——程式設計十誡程式設計師
- 設計十誡:產品設計的10個原則
- Docker 容器基本操作[Docker 系列-2]Docker
- Docker 入門:容器Docker
- Docker 容器學習Docker
- Docker重要容器命令Docker
- docker容器儲存Docker
- Docker容器的搭建Docker
- 容器Docker詳解Docker
- Docker的容器管理Docker
- 進入Docker容器Docker
- docker建立lnmp容器DockerLNMP
- Docker 容器管理:rancherDocker
- 初識Docker容器Docker