容器技術反例:哪些不適合利用Docker實現?
譯文【51CTO.com快譯】 此篇文章,將為大家詳細介紹那些不適合利用Docker實現的技術。
一)容器中的數據或者日志
容器適合處理無狀態且僅需要短期運行的應用。這意味著我們不應將數據或者日志存儲在容器內——否則其會在容器終止時一并消失。相反,利用分卷映射將其持久存儲于容器之外。ELK堆??捎糜诖鎯疤幚砣罩?。如果所管理分卷曾在測試流程中使用,那么請在dockerrm命令中添加-v將其移除。
二)容器IP地址
每套容器都擁有自己的IP地址。多套容器彼此通信以創建同一應用,例如部署在應用服務器上的應用即需要與數據庫對話。在運行過程中,會不斷有舊容器關閉,新容器開啟。依靠容器IP地址意味著我們需要不斷更新應用配置方能保持這種通信能力。相反,我們應當為其創建專門的服務,用于容納動態變化的容器引用邏輯名稱,并借此實現基本的負載均衡功能。
三)容器中運行單一進程
每個Dockerfile都會使用一個CMD與ENTRYPOINT。通常來講,CMD會利用腳本以執行部分鏡像配置,而后啟動該容器。不要嘗試在該腳本中使用多個進程。大家應當在創建Docker鏡像時遵循分離原則的方針,否則會令容器在管理、日志收集以及更新方面遭遇更多難題。大家可以考慮將應用拆分成多套容器,并對其進行逐一管理。
四)不要使用docker exec
docker exec命令會在運行中的容器內開始一條新命令。其適用于利用docker exec -it {cid} bash實現shell附加。然而除此之外,容器本身應該已經運行有該進程。
五)保持鏡像精簡
創建一個新目錄,并將Dockerfile及其它相關文件保存在其中。另外,考慮使用.dockeringore以移除任何日志、源代碼等,而后再進行鏡像創建。確保移除一切已經被解壓的下載軟件包。
六)利用運行中的容器創建鏡像
應使用docker commit命令創建新鏡像。這種方式適用于容器已經發生改變的情況。不過由此創建的鏡像不可重現。相反,我們應在Dockerfile中進行修改,終止現有容器,并利用更新后的鏡像啟動新容器。
七)Docker鏡像中的安全憑證
不要將安全憑證存儲在Dockerfile當中。其將以明文形式存在并被檢入存儲庫內,這將引發潛在的安全威脅。使用-e將密碼指定為環境變更。而后,可利用--env-file讀取文件中的環境變量。另一種方案是利用CMD或者ENTRYPOINT指定一套腳本。該腳本負責將憑證由第三方處提取出來并用于配置應用。
八)latest標簽
很多朋友可能習慣利用couchbase啟動鏡像。如果未指定標簽,那么容器會默認使用couchbase:latest鏡像。此鏡像可能并非最新,而是引用某個陳舊版本。需要強調的是,將應用引入生產流程要求配合一套采用特定鏡像版本的完全受控環境。確保始終使用正確的標簽以運行容器——例如使用couchbase:enterprise-4.5.1而非couchbase。
九)鏡像不匹配
不要在開發、測試、分段以及生產環境內使用不同的圖像或者標簽。作為“選定來源”的鏡像應僅創建一次,并被推送至存儲庫內。該鏡像應被用于各類不同環境。在某些情況下,大家可以考慮在WAR文件上運行單元測試,而后再創建鏡像。不過請注意,任何系統集成測試都應當在生產環境實際使用的鏡像中完成。
十)發布端口
不要利用-P以發布全部公開端口,因為如此一來大家將能夠運行多套容器并發布其公開端口。這樣做亦意味著全部端口都將公開發布。相反,請使用-p以發布特定端口。
原文標題:Docker Container Anti-Patterns,原文作者:Arun Gupta
【51CTO譯稿,合作站點轉載請注明原文譯者和出處為51CTO.com】