概述
Docker 使用Linux Namespace 和 Cgroups 的虛擬化工具薪丁。
Linux Namespace 是kernel 的一個(gè)功能,它可以隔離一系列系統(tǒng)的資源瞎疼,比如PID(Process ID),User ID, Network等等畸悬。一般看到這里,很多人會(huì)想到一個(gè)命令chroot委煤,就像chroot允許把當(dāng)前目錄變成根目錄一樣(被隔離開來(lái)的),Namesapce也可以在一些資源上修档,將進(jìn)程隔離起來(lái)碧绞,這些資源包括進(jìn)程樹,網(wǎng)絡(luò)接口吱窝,掛載點(diǎn)等等讥邻。
比如一家公司向外界出售自己的計(jì)算資源。公司有一臺(tái)性能還不錯(cuò)的服務(wù)器院峡,每個(gè)用戶買到一個(gè)tomcat實(shí)例用來(lái)運(yùn)行它們自己的應(yīng)用兴使。有些調(diào)皮的客戶可能不小心進(jìn)入了別人的tomcat實(shí)例,修改或者關(guān)閉了其中的某些資源照激,這樣就會(huì)導(dǎo)致各個(gè)客戶之間互相干擾发魄。也許你會(huì)說(shuō),我們可以限制不同用戶的權(quán)限俩垃,讓用戶只能訪問(wèn)自己名下的tomcat励幼,但是有些操作可能需要系統(tǒng)級(jí)別的權(quán)限,比如root吆寨。我們不可能給每個(gè)用戶都授予root權(quán)限赏淌,也不可能給每個(gè)用戶都提供一臺(tái)全新的物理主機(jī)讓他們互相隔離踩寇,因此這里L(fēng)inux Namespace就派上了用場(chǎng)啄清。使用Namespace, 我們就可以做到UID級(jí)別的隔離俺孙,也就是說(shuō)辣卒,我們可以以UID為n的用戶,虛擬化出來(lái)一個(gè)namespace睛榄,在這個(gè)namespace里面荣茫,用戶是具有root權(quán)限的。但是在真實(shí)的物理機(jī)器上场靴,他還是那個(gè)UID為n的用戶啡莉,這樣就解決了用戶之間隔離的問(wèn)題。當(dāng)然這個(gè)只是Namespace其中一個(gè)簡(jiǎn)單的功能旨剥。
除了User Namespace ,PID也是可以被虛擬的咧欣。命名空間建立系統(tǒng)的不同視圖, 對(duì)于每一個(gè)命名空間轨帜,從用戶看起來(lái)魄咕,應(yīng)該像一臺(tái)單獨(dú)的Linux計(jì)算機(jī)一樣,有自己的init進(jìn)程(PID為1)蚌父,其他進(jìn)程的PID依次遞增哮兰,A和B空間都有PID為1的init進(jìn)程毛萌,子容器的進(jìn)程映射到父容器的進(jìn)程上,父容器可以知道每一個(gè)子容器的運(yùn)行狀態(tài)喝滞,而子容器與子容器之間是隔離的阁将。從圖中我們可以看到,進(jìn)程3在父命名空間里面PID 為3囤躁,但是在子命名空間內(nèi)冀痕,他就是1.也就是說(shuō)用戶從子命名空間 A 內(nèi)看進(jìn)程3就像 init 進(jìn)程一樣,以為這個(gè)進(jìn)程是自己的初始化進(jìn)程狸演,但是從整個(gè) host 來(lái)看言蛇,他其實(shí)只是3號(hào)進(jìn)程虛擬化出來(lái)的一個(gè)空間而已。
當(dāng)前Linux一共實(shí)現(xiàn)六種不同類型的namespace:
Namespace類型 系統(tǒng)調(diào)用參數(shù) 內(nèi)核版本
Mount CLONE_NEWNS 2.4.19
UTS CLONE_NEWUTS 2.6.19
IPC CLONE_NEWIPC 2.6.19
PID CLONE_NEWPID 2.6.24
Network CLONE_NEWNET 2.6.29
User CLONE_NEWUSER 3.8
Namesapce 的API主要使用三個(gè)系統(tǒng)調(diào)用:
clone() - 創(chuàng)建新進(jìn)程宵距。根據(jù)系統(tǒng)調(diào)用參數(shù)來(lái)判斷哪種類型的namespace被創(chuàng)建腊尚,而且它們的子進(jìn)程也會(huì)被包含到namespace中
unshare() - 將進(jìn)程移出某個(gè)namespace
setns() - 將進(jìn)程加入到namesp中
參考
本人學(xué)習(xí)實(shí)踐的記錄均來(lái)自<<自己動(dòng)手寫docker>>,后面不在標(biāo)注满哪。
安裝go開發(fā)環(huán)境
跟參考教材保持一致:
wget https://golang.google.cn/dl/go1.7.1.linux-amd64.tar.gz
tar -C /usr/local -xzf go1.7.1.linux-amd64.tar.gz
vim /etc/profile
export PATH=$PATH:/usr/local/go/bin
source /etc/profile
go version