Docker解析及轻量级PaaS平台演练(一)--Docker简介与安装
Container技術(shù):
傳統(tǒng)的虛擬化技術(shù):
通過(guò)對(duì)硬件層模擬,從而實(shí)現(xiàn)了能夠在一套硬件上面運(yùn)行多個(gè)操作系統(tǒng),因?yàn)橥ㄟ^(guò)硬件虛擬化,使得操作系統(tǒng)認(rèn)為在它之下就是硬件層
但是實(shí)際情況是這樣的:虛擬機(jī)中的OS對(duì)硬件發(fā)出的請(qǐng)求都交給了虛擬的硬件,OS認(rèn)為指令已經(jīng)下達(dá)了,只要等待硬件返回信息即可,其實(shí)OS下面的那層“硬件”是要將指令發(fā)送給真正的硬件層來(lái)執(zhí)行的
系統(tǒng)級(jí)別的虛擬化技術(shù):
不同于傳統(tǒng)的硬件虛擬化,它不需要模擬硬件層
多個(gè)虛擬機(jī)之間共享Host OS的Kernel內(nèi)核,所以這些虛擬機(jī)是不可以像傳統(tǒng)虛擬化技術(shù)那種裝各種各樣的OS,但是它同樣可以讓跑在里面的應(yīng)用認(rèn)為它就是處在一個(gè)獨(dú)立的OS之中,每個(gè)虛擬機(jī)就像一個(gè)容器,里面可以裝各種各樣的應(yīng)用,而不同容器中的應(yīng)用總是認(rèn)為他們是在一個(gè)獨(dú)立在OS環(huán)境下的,所以又稱為Container技術(shù)
兩種虛擬化技術(shù)各有優(yōu)劣,對(duì)比如下圖:
下面是一張Container技術(shù)的結(jié)構(gòu)圖:
從圖中可以看出,綠藍(lán)紅三種顏色的層組合起來(lái)就是一臺(tái)Host主機(jī),在Kernel層之上通過(guò)Container技術(shù)的三個(gè)要點(diǎn):隔離(namespace),限制(cgroup),記錄(chroot)
來(lái)虛擬出一個(gè)個(gè)容器,并管理他們
隔離:
通過(guò)namespace機(jī)制來(lái)避免一些系統(tǒng)級(jí)的沖突。
因?yàn)槊總€(gè)容器都可以當(dāng)做一個(gè)獨(dú)立的OS,那么他們就擁有自己的pid進(jìn)程號(hào)等信息,如果這些東西和Host中的相沖突怎么辦?畢竟容器不是自己在虛擬化的環(huán)境中獨(dú)立安裝一個(gè)OS,而是依賴于Host的OS
這時(shí)候就可以通過(guò)namespace來(lái)避免這些沖突,每個(gè)容器擁有自己的namespace來(lái)管理各自的系統(tǒng)信息
限制:
在Host看來(lái),每個(gè)Container都只是一個(gè)普通的進(jìn)程(當(dāng)時(shí)在Container中的應(yīng)用看來(lái),這些Container都是一個(gè)OS),那么怎么來(lái)限制這些進(jìn)程的CPU使用,時(shí)間片等資源呢?
cgroup是linux內(nèi)核提供的限制,記錄和隔離進(jìn)程組所用的資源
記錄:
上面說(shuō)過(guò),每個(gè)Container都可以當(dāng)做一個(gè)獨(dú)立的OS,既然它是一個(gè)OS那么肯定有自己的文件系統(tǒng),那么問(wèn)題又來(lái)了,每個(gè)Container都有自己的FS,Host也有自己的FS,這么多獨(dú)立的FS要怎么管理?
chroot隔離根文件系統(tǒng),怎么個(gè)說(shuō)法呢?例如Host的根目錄下有a,b目錄,并且分別被兩個(gè)Container當(dāng)做其根目錄。在Host角度來(lái)看,ab只是根目錄下的兩個(gè)普通文件夾而已,而對(duì)于Container a來(lái)說(shuō)/a就是其根目錄;對(duì)于Container b來(lái)說(shuō)/b就是其根目錄
Docker:
什么是Docker?
Docker是一種Container技術(shù)的實(shí)現(xiàn),上面說(shuō)到的Container技術(shù)也同樣可以用來(lái)描述Docker
想一想,我們?cè)陂_(kāi)發(fā)一個(gè)應(yīng)用的時(shí)候
我們?cè)谧约旱腜C上完成了開(kāi)發(fā)工作,并將項(xiàng)目交給測(cè)試人員進(jìn)行測(cè)試,但是萬(wàn)一測(cè)試的PC上的環(huán)境和開(kāi)發(fā)的環(huán)境不一樣,可能會(huì)出現(xiàn)各種各樣的問(wèn)題,同理應(yīng)用發(fā)布到服務(wù)器上也是一樣的
應(yīng)用每到一臺(tái)新的PC中時(shí)就要求該P(yáng)C要裝上它需要的所有東西,還要注意版本是不是一致的
而Docker可以幫我們解決這些問(wèn)題
Docker可以創(chuàng)建一個(gè)個(gè)Container,前面說(shuō)過(guò),每個(gè)Container都可以當(dāng)做一個(gè)獨(dú)立的OS,那么我們就可以在這個(gè)Container之中進(jìn)行應(yīng)用的開(kāi)發(fā)。開(kāi)發(fā)完成之后,我們可以將這個(gè)Container打包成一個(gè)Image(Image和Container的管理可以理解成:類和實(shí)例),可以將其看做是一個(gè)集裝箱,里面裝著應(yīng)用和應(yīng)用的各種環(huán)境
在測(cè)試的PC上,通過(guò)Docker將這個(gè)集裝箱(Image)拿過(guò)來(lái)通過(guò)其創(chuàng)建一個(gè)Container就可以直接進(jìn)行使用和測(cè)試,這個(gè)Container和開(kāi)發(fā)時(shí)使用的Container的環(huán)境是一致的(通過(guò)一個(gè)類實(shí)例化出來(lái)的各個(gè)對(duì)象)
Docker翻譯為搬運(yùn)工,它所做的事情也是搬運(yùn)工一樣的
我們可以將應(yīng)用的各個(gè)組件,環(huán)境等都裝進(jìn)一個(gè)集裝箱中,通過(guò)Docker運(yùn)送到各個(gè)“碼頭上”
總結(jié)出一個(gè)Docker的最最簡(jiǎn)單的介紹:方便打包發(fā)布應(yīng)用到容器中
我們來(lái)看看Docker的層次圖:
最底層的lxc,aufs都收kernel內(nèi)核中運(yùn)行的
lxc:Linux Container,是Linux上的一種實(shí)現(xiàn)Container虛擬化的技術(shù),早期的Docker就基于lxc實(shí)現(xiàn)的,最新的版本中已經(jīng)用libcontainer代替了
aufs:Advanced multi layer Unification FileSystem,翻譯成中文就是高級(jí)的,分層的,聯(lián)合的文件系統(tǒng),它最總要的內(nèi)容就是可以將兩個(gè)目錄合并在一起,并可以設(shè)置操作權(quán)限(read-only/read-write)。Docker使用aufs來(lái)實(shí)現(xiàn)分層的文件管理
倒數(shù)第二層的Debian和BusyBox都是在Kernel之上的Image,Image就是一個(gè)鏡像,可以通過(guò)這個(gè)鏡像來(lái)創(chuàng)建多個(gè)Container,Image在aufs中是只讀的
中間層就是通過(guò)Image創(chuàng)建出來(lái)的Container,Container在aufs中是可讀可寫的,通過(guò)一個(gè)只讀的Image創(chuàng)建出一個(gè)Container,可以對(duì)這個(gè)Container進(jìn)行修改(如上圖中添加了一個(gè)emacs),然后在打包成一個(gè)不可讀的Image,而這個(gè)Image又可以創(chuàng)建出基于它的Container
通過(guò)上面的描述不難得出一個(gè)結(jié)論:Docker中的Image是層層關(guān)聯(lián)的,每個(gè)Image都有一個(gè)Parent Image(只有一個(gè)除外,那就是Base Image,即最基本的鏡像,其他的Image都是在Base Image基礎(chǔ)上得到的),使用一個(gè)Image時(shí),Docker會(huì)找到其Parent Image直到Base Image
Docker在啟動(dòng)Container的時(shí)候, aufs會(huì)將下層的文件系統(tǒng)設(shè)置成read-only,然后將Container的read-write掛載到下層的文件系統(tǒng)之上,構(gòu)成一個(gè)完整的文件系統(tǒng)
在Container中所做的修改不會(huì)影響到其所屬的Image(因?yàn)樗侵蛔x的,通過(guò)COW技術(shù)將要修改的文件復(fù)制到read-write層并改寫),如果沒(méi)有保存這個(gè)Container(將其打包成一個(gè)新的Image),那么當(dāng)這個(gè)Container生命周期結(jié)束之后,所做的修改都會(huì)消失
這種機(jī)制的好處就是,每個(gè)階段的Image都可以進(jìn)行大量的重用,在創(chuàng)建Container的時(shí)候只需要加入不同的部分即可,而不用每次都將全部所需加載一遍
Docker Hub:
類似于Github的服務(wù),用來(lái)分發(fā)Images,里面有大量的Image提供Docker用戶下載,基于這些Image,可以快速的搭建出我們自己所需要的Image
同時(shí)我們也可以將自做的Image push到Docker Hub中提供別人下載
Docker安裝:
由于是基于Kernel內(nèi)核的,所以Docker只能跑在Linux上,而且是必須是64位的
在windows和mac系統(tǒng)上的Docker的宿主機(jī)并不是windows或者mac,而是借助一個(gè)linux虛擬機(jī)作為其宿主機(jī)
在這里使用VM創(chuàng)建的一個(gè)Ubuntu來(lái)作為宿主機(jī),在Ubuntu中安裝很簡(jiǎn)單
步驟如下:
期間可能因?yàn)榫W(wǎng)絡(luò)的原因會(huì)卡很久,完成之后輸入
docker如果可以識(shí)別命令就是安裝成功了
另外,執(zhí)行docker命令需要root權(quán)限,所以除了使用root用戶之外,每條命令都要加上sudo
或者也可以通過(guò)將當(dāng)前的用戶加入docker用戶組(Docker提供的)就可以隨時(shí)執(zhí)行docker命令
總結(jié)
以上是生活随笔為你收集整理的Docker解析及轻量级PaaS平台演练(一)--Docker简介与安装的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: C语言及程序设计进阶例程-17 认识链表
- 下一篇: 团队作业-第二周-测试计划