【轉載】Docker 經驗之談


本文來源:Ghostcloud原創

    對於用戶來講,可能一開始在不瞭解的狀況下會對容器報以拒絕的態度,可是在嚐到容器的甜頭、體驗到它的強大性能以後,相信你們最終是沒法抵擋其魅力的。容器技術可以解決IT業目前面臨的不少問題,並且優點也很明顯,好比說:
一、容器具備不可變的特性。
    容器將操做系統、程序庫、配置文件、路徑和應用程序打包在一塊兒運行,也就是說,咱們在作QA測試的時候整個鏡像是什麼樣,投入到產品環境之後就是什麼樣,其性能不會有任何差距。
二、容器都很是輕量。
    單個容器的內存佔用很小,不像其餘進程動輒佔用上萬MB的內存空間,容器只會給主進程分配內存,能夠有效下降系統開銷。
三、容器的速度更快。
   虛擬機的啓動時間通常都在分鐘級,容器的啓動速度能夠達到秒級,啓動容器就跟啓動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都會變。若是咱們要讓應用或者微服務模塊在容器之間進行通訊的話,正確的作法是經過設置環境變量來傳遞主機名和端口號。
 
linux

相關文章
相關標籤/搜索