之前介紹過Docker透過Linux Namespace方式銜接實體網路取得外部對應IP位址的方式,也談到同一主機內透過預設的docker0主系統橋接介面可以進行互連,接著進行網路設定。本文將接力介紹Docker容器的進階管理技巧,包括不同主機之間Docker容器隔離獨立網路互連,以及如何限制Docker容器使用資源。
限制Docker容器使用資源—記憶體
使用虛擬化的另一議題是如何限制虛擬化使用的資源,首先是限制記憶體的使用,如下指令是建立一個有限制記憶體使用的容器:
指令中使用-m選項來限制名稱為debian72的Docker容器記憶體使用的上限是256MB,啟動後,要查詢限制是否生效,因為Docker容器是Linux系統下用行程模擬出來的一個環境,因此不能用傳統的free指令去檢視,可以使用「docker inspect debian72 | grep Memory」指令進行檢視,如圖16所示。
|
▲圖16 檢視Docker容器的記憶體限制設定。 |
圖16是以bytes為單位,256MB剛好就是268,435,456位元組,而這裡的MemorySwap值為0,表示虛擬記憶體(Swap Memory)大小是沒有限制,而如果要設定虛擬記憶體大小的限制,可以使用下列指令:
這個時候再執行「docker inspect debian72 | grep MemorySwap」指令來檢視,輸出則會變成如圖17
所示。
|
▲圖17 檢視Docker容器的虛擬記憶體限制設定。 |
另外要注意的是,因為Docker預設在容器內若是發生記憶體使用超出限制(Out-of-memory,OOM)的問題時,則會開始清理刪除容器內的行程(Process),如果要取消這動作,可以在建立容器時加上「--oom-kill-disable」參數。
限制Docker容器使用資源—CPU與磁碟空間
如果要限制Docker容器使用的中央處理器(CPU)資源,有幾種方式可以辦到,譬如下列指令:
-c是設定CPU分享(CPU Shares)參數,預設是1024,可以接受的值是2到1024,而利用「docker inspect debian72 | grep CpuShares」指令可以檢視設定是否生效,如圖18所示。
|
▲圖18 檢視Docker容器的CPU分享參數設定。 |
系統會依照容器設定的CPU分享參數在所有容器分享參數總和的百分比來分配CPU運算週期(CPU Cycles)的分配比例。
假設一個主機有四個Docker容器,A與B容器設置的CPU分享參數為1024,而C及D容器設置的CPU分享參數為512,那A及B所取得的CPU運算週期就是33%,而C及D則分別是16.5%。
此時若有另一個新容器E加進來,設定的CPU分享參數也是1024的話,那麼此分配比例就會重新改寫為A、B及C占25%,而C與D則各占12.5%,因此分配比例會隨著系統容器的多寡與分享參數所占的權重動態進行調整。在多CPU核心的系統中,也是所有CPU核心總數來進行比例配置。
另外,可使用「--cpu-set-cpus」參數來限制容器使用的CPU,譬如下列的指令:
該指令就是限制容器只能使用CPU1及CPU3,同樣可以使用「docker inspect debian72 | grep Cpuset」指令來檢視CPU使用集合限制的設定狀況,如圖19所示。
|
▲圖19 檢視CPU使用集合限制的設定狀況。 |
而「docker run --name debian72 -t -i --cpuset-cpus="0-2" dsw88/debian7:latest /bin/bash」指令,則是限制容器只能使用CPU0、CPU1及CPU2。
倘若要限制容器的磁碟使用,只能由調整Docker啟動的參數著手,目前Docker預設建立容器映像檔的大小限制是10G,當然10G是Sparse File,也就是一開始並不會配置到10G大小,而是隨著使用者的使用量成長檔案大小才會成長,另一個名詞是稱為Thin-provisioning。
這個大小只有一個值,設定後所有新建立的容器映像檔就是這個大小,目前還沒有其他調整彈性,因此若希望限制新建容器的磁碟大小,則必須在Docker的啟動參數內加入底下這一行:
這一行限制了新建容器的磁碟大小最大是5G,設定完畢,重新啟動Docker服務,接著新建立的容器映像檔就會是這個新設定的限制大小。
如此一來,在CentOS 7中就可以調整「/etc/sysconfig/docker」檔案,如圖20所示。
|
▲圖20 在Docker的啟動參數中加入設定,以限制新建容器磁碟
大小。 |
結語
筆者用了兩期的篇幅來介紹目前業界熱門的輕量級虛擬化技術Docker,涵蓋了入門的觀念介紹操作與比較深入搭配軟體定義網路(SDN)相關軟體的應用,希望讓大家對Docker有比較清楚的了解。關於Docker還有其他有趣的議題,像是Docker最近收購的一個軟體SocketPlane,就是專注於簡化Docker在網路上的建置與銜接,後續有機會再談到這些新的發展。
開放原始碼軟體進展相當地快速,正當Docker在快速發展的同時,Ubuntu也發表自己開發的Linux容器技術「LXD」,全名為The Linux Container Hypervisor,而因應虛擬化發展的新興Linux發行版廠商CoreOS也發表了「rkt」這個自己的Linux容器技術。
不過,這些技術其實都還是以Linux本身提供的作業系統層級虛擬化技術為基礎。主要就是Linux核心內負責限制控制及分隔行程群組的控制群組(Control Groups)以及命名空間(Name Space)兩大主題。只要能了解清楚這兩個主題,那對於掌控這些容器相關技術就比較不會有什麼問題。
<本文作者:黃明華,目前主要擔任雲端及儲存技術顧問,負責協助開發相關應用產品。擅長研究各式系統及程式技術,並提供相關技術支援、諮詢、導入及評估服務,特別是自由軟體/開放原始碼相關系統與技術。>