1. 程式人生 > >【轉載】Docker 經驗之談

【轉載】Docker 經驗之談

com 適合 自動下載 roo static 包含 處理 library latest


本文來源:Ghostcloud原創

對於用戶來說,可能一開始在不了解的情況下會對容器報以拒絕的態度,但是在嘗到容器的甜頭、體驗到它的強大性能之後,相信大家最終是無法抵擋其魅力的。容器技術能夠解決IT業目前面臨的很多問題,而且優勢也很明顯,比如說:
1、容器具有不可變的特性。
容器將操作系統、程序庫、配置文件、路徑和應用程序打包在一起運行,也就是說,我們在做QA測試的時候整個鏡像是什麽樣,投入到產品環境以後就是什麽樣,其性能不會有任何差距。
2、容器都非常輕量。
單個容器的內存占用很小,不像其他進程動輒占用上萬MB的內存空間,容器只會給主進程分配內存,可以有效降低系統開銷。
3、容器的速度更快。


虛擬機的啟動時間一般都在分鐘級,容器的啟動速度可以達到秒級,啟動容器就跟啟動linux進程一樣快。

雖然容器的好處這麽多,但是有很多用戶還不了解,還認為容器跟一般的虛擬機沒什麽差別。實際上,容器是可銷毀的,這是容器跟虛擬機之間最大的差別。容器的存在周期很短,只要用戶使用完畢,就可以立即銷毀容器,所以用“朝生暮死”來形容也不算過分。
在對容器進行使用和維護時,我們應該充分利用容器的這個特性,不要再把容器當成一般的虛擬機來看待,不然就真的大材小用了。在實際使用過程中,為了最大限度地發揮容器的優勢,有些錯誤還是少犯為妙。我總結出了下面幾個要點供大家參考,在跑容器的時候大家最好還是盡量遵照這幾條原則:
1) 不要將數據儲存在容器中。

容器隨時都可以停止、銷毀或遷移,比方說,一個容器裏運行的應用版本是1.0,我們分分鐘就可以把這個應用升級到1.1,同時還不會對數據造成任何影響。所以如果用戶想要存數據的話,最好是用數據卷來存儲。不過在用卷存數據的時候大家還是要註意一點,如果有兩個容器共用一個數據卷,都往裏面寫數據的話,是有可能造成程序崩潰的。我們在設計應用程序的時候應該考慮到這一點,為保萬無一失,應用程序應該具備特定的機制,以確保在往共享數據存儲區寫入數據的時候不會出錯。
2) 不要把應用程序分塊交付。
在部分用戶看來,容器跟虛擬機沒什麽兩樣,所以有些人往往會把應用程序部署到當前運行的若幹個容器中。這種做法在開發階段沒有太大的問題,因為做開發的時候我們會很頻繁地進行部署和調試,但是到了持續交付(CD)階段,下一步就是QA測試和正式投產了,這種做法就不太適合了。在這一階段,我們應該充分考慮到容器的不可變特性,最好是將應用程序打包到一個鏡像中交付。
3) 不要把鏡像體積建得很大。

鏡像越大,就越難發布。鏡像中只包含必要的文件和library就可以了,能讓應用或者進程運行起來就行。千萬不要在鏡像中安裝些沒必要的東西,在構建鏡像的時候要避免使用yum這種update命令,免得系統自動下載很多不相幹的文件到新鏡像層中。
4) 建鏡像的時候不要只建一層。
大家都知道,Docker的文件系統是分層的,在建鏡像的時候我們應該這麽建,將操作系統單獨建一層,作為基礎鏡像,然後用戶名定義文件、運行時安裝環境、配置文件都要分別建一層鏡像,最後才是應用鏡像層。這麽做的話,我們以後重建、管理以及發布鏡像的時候就要輕省得多了。
5) 不要把本地運行的容器轉成鏡像。
換句話說就是創建鏡像的時候不要用“docker commit”命令來創建。用這種辦法建鏡像是完全不可取的,因為這種辦法是不能重復的。我們在建鏡像的時候應該從Dockerfile創建,或者用其他S2I(從源文件構建鏡像)的方式來創建,這樣鏡像才具有可再生性,而且如果我們把鏡像存在git之類提供版本控制能的系統裏的話,還可以對Dockerfile的改動進行跟蹤。
6) 給鏡像打tag的時候不要只打“latest”。
latest其實就相當於Maven裏頭的“快照”。因為容器的文件系統是分層的,我們最好是給鏡像多打幾個tag。如果只有latest的話,可能過段時間我們再來運行應用程序的時候就發現程序運行不起來了,因為應用的父層(就是Dockerfile裏面的跟在FROM命令後面的那一層)被更新的版本覆蓋了,而新版本又不能向下兼容,還有可能就是從build cache裏面取鏡像的時候取到了錯的“latest”鏡像。在產品環境中部署容器的時候也要避免使用latest,不然容易造成無法跟蹤記錄鏡像版本的問題。
7) 不要在單個容器裏面運行多個進程。
容器本來就是用來運行單個應用的(比如http daemon,應用服務器,數據庫等等),如果我們非要在一個容器裏跑幾個應用,那麽在管理每個應用進程、存取日誌、升級應用的時候就會很麻煩。
技術分享圖片不要把認證口令存在鏡像中,用環境變量比較好。
如果我們把用戶名/密碼值對存在鏡像裏的話,就只有采用硬編碼的方式來挨個處理,估計這種麻煩事沒人願意去幹。所以我們最好是用環境變量的方從容器外部獲取此類信息。
9) 不要用root用戶的角色來運行進程。
Docker容器默認是以root權限運行的。不過隨著技術的成熟,docker也會提供安全性更高的默認操作選項。在現有技術條件下,以root權限運行會對其他應用帶來安全隱患,而且在有些運行環境下root權限是取不到的,所以我們在跑容器的時候應該用USER命令來指定非root權限的用戶。
10) 不要過分依賴IP地址。
每個容器都有一個內部IP,這個IP不是固定的,我們啟動容器或者停止容器的時候IP都會變。如果我們要讓應用或者微服務模塊在容器之間進行通信的話,正確的做法是通過設置環境變量來傳遞主機名和端口號。

【轉載】Docker 經驗之談