1、Redhat系列操做系統下的Dockergit
Redhat系列操做系統(redhat、centos、fedora)與ubuntu是目前最爲流行的兩款Linux操做系統。因爲ubuntu更爲桌面化,一般生產環境中更多使用Redhat系OS。可是因爲Redhat系內核版本較低,對虛擬化的支持老是落後一步。例如本文要分析的Docker,就是先支持ubuntu,直到2013年年末才支持redhat系OS。這就形成了一個略顯尷尬的現實,雖然(截止目前)ubuntu對Docker支持更好,可是不少時候咱們仍是要在Redhat環境下使用Docker。github
目前,Redhat已與Docker深度合做,解決兼容性、安全等Docker的核心問題。考慮到兩者的技術實力,我以爲他們的合做前景是比較樂觀的。不過目前,若是在Redhat或Centos下實際操做Docker,會發現坑仍是比較多的。今天,我就來嘗試介紹其中的一個坑——Redhat下Docker、LXC、CGroup的協同配置。docker
2、Docker、LXC、CGroup三者的關係ubuntu
根據Docker佈道師Jerome Petazzoni的說法,Docker約等於LXC+AUFS(以前只支持ubuntu時)。其中LXC負責資源管理,AUFS負責鏡像管理;而LXC又包括cgroup、namespace、chroot等組件,並經過cgroup進行資源管理。因此只從資源管理這條線來看的話,Docker、LXC、CGroup三者的關係是:Cgroup在最底層落實資源管理,LXC在cgroup上封裝了一層,Docker又在LXC封裝了一層,關係圖如圖1.b所示。centos
(a) (b)安全
圖1 Docker-LXC-CGroup結構圖bash
3、Docker、LXC、CGroup三者的協同部署與配置ide
因爲Docker、LXC、Cgroup的關係爲嵌套依賴,因此若是須要實際部署使用Docker,須要搞定三者的協同配置。Docker沒什麼可說的,直接使用最新版本便可。LXC則有不一樣版本,且不一樣版本的運行狀況明顯不一樣。經常使用穩定版本有http://sourceforge.net/projects/lxc/files/lxc/網站上的0.7.五、0.9.0,除此以外,還有git上lxc的最新版本 https://github.com/lxc/lxc,目前爲1.0.0beta2(未正式發佈)。cgroup也有不一樣的掛載方法:「多掛載點」和「單掛載點」。瞭解cgroup的朋友都知道,cgroup有不一樣的子系統,例如cpu、memory、cpuset等等,「多掛載點」就是指不一樣子系統的文件掛載在不一樣的目錄下,每一個子系統各有一個掛載點,目錄結構如圖2所示。cgroup對應服務cgconfig默認使用的就是「多掛載點」的方法。「單掛載點」則是指全部子系統的文件都掛載在同一個目錄下,全部子系統都統一掛載在一個掛載點,目錄結構如圖3所示。測試
圖2 多掛載點目錄示意圖網站
圖3 單掛載點目錄示意圖
結合上述不一樣版本和不一樣掛載方法,Docker、LXC、CGroup在Redhat/CentOS上的部署方法彙總如表1所示。
表1
Docker |
LXC |
Cgroup |
運行狀況 |
0.7 |
0.7.5 |
單掛載點 |
正常 |
多掛載點 |
報錯,形如 lxc-execute: nons_cgroup option specified lxc-execute: failed to spawn 'xxx' lxc-execute: Nosuch file or directory - failed to remove cgroup '/cgroup/cpuset/xxx' |
||
0.9.0 |
單掛載點 |
報錯,形如 lxc-execute: Error creating cgroups lxc-execute: failed to spawn 'xxx'。結合Docker運行將致使docker阻塞(卡主) |
|
多掛載點 |
看似正常運行,但沒法實現資源管理。cgroup中lxc上層參數異常,沒法經過lxc-cgroup等命令設置參數 |
||
1.0.0Beta2 Git最新版,未正式發佈 |
單掛載點 |
正常 |
|
多掛載點 |
報錯,形如 lxc-execute: Device or resource busy - cgroup_rmdir: failed to delete /cgroup/ns/ … lxc-execute: failed creating cgroups lxc-execute: failed to spawn 'lxc1' |
先看錶1前四行,其實在正式使用Docker以前,我已發現了這些問題。不過因爲LXC的中文資料較少(介紹性資料有一些,實戰性、有些深度的就比較少了),LXC英文社區又比較冷清,因此只發現一些朋友和我遇到了一樣的問題,卻沒有靠譜的解決方法。好在「lxc-0.7.5 + cgroup單掛載點」是能夠work的,我就是用這種配置方法進行工做。
後來使用Docker,因爲docker-0.7.2默認使用lxc-0.9.0.2,沒法正常運行,我又從新撿起了這個問題。因爲Docker社區比較熱,在一篇來來每每十幾個回合的帖子裏找到了另外一種解決方案,方法就是更新lxc。經實際測試,「Docker + lxc-1.0.0Beta2 + cgroup單掛載點」的方法能夠正常運行。
4、Centos下Docker、LXC、CGroup的安裝配置方法
第三部分彙總了不一樣部署方法的運行狀況,本節(第四部分)着重梳理下可行方法的步驟。實驗證實,「Docker + lxc-0.7.5 + 單掛載點」與「Docker + lxc-1.0.0Beta2 + 單掛載點」方法都可行。
實驗環境:Centos6.3 + 內核2.6.32
一、按照官方文檔(http://docs.docker.io/en/latest/installation/rhel/),在Centos上安裝docker。
二、更新lxc。
在lxc網站(http://sourceforge.net/projects/lxc/files/lxc/)下載lxc-0.7.5,或者在git(https://github.com/lxc/lxc)上 ,下載最新版的lxc,我下載時是1.0.0Beta2。下載後進行安裝。因爲Docker按照絕對路徑/usr/bin/lxc-xxxx調用lxc命令,因此要把最新的lxc安裝到/usr/bin目錄下,或者安裝後cp到/usr/bin/下。
三、從新掛載cgroup。
cgroup會默認採用「多掛載點」方式,並開機啓動,因此首先禁用相應服務cgconfig,操做以下:
sudo service cgconfig stop sudo chkconfig cgconfig off
而後採用「單掛載點方式」從新掛載cgroup。能夠直接手動掛載,這樣當次掛載成功。
mount -t cgroup none /cgroup
也能夠編輯/etc/fstab/,以後每次開機後都會自動掛載。輸入下列內容,重啓就OK了。
none /cgroup cgroup defaults 0 0
在Redhat/Centos環境下安裝Docker的具體方法,也可參見本人的另外一篇博客《在Redhat/Centos下安裝Docker(不升級內核)》