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