版權聲明:本文為部落客原創文章,未經部落客允許不得轉載。 https://blog.csdn.net/qq1010885678/article/details/46290985
Container技術:
傳統的虛拟化技術:
通過對硬體層模拟,進而實作了能夠在一套硬體上面運作多個作業系統,因為通過硬體虛拟化,使得作業系統認為在它之下就是硬體層
但是實際情況是這樣的:虛拟機中的OS對硬體發出的請求都交給了虛拟的硬體,OS認為指令已經下達了,隻要等待硬體傳回資訊即可,其實OS下面的那層“硬體”是要将指令發送給真正的硬體層來執行的
系統級别的虛拟化技術:
不同于傳統的硬體虛拟化,它不需要模拟硬體層
多個虛拟機之間共享Host OS的Kernel核心,是以這些虛拟機是不可以像傳統虛拟化技術那種裝各種各樣的OS,但是它同樣可以讓跑在裡面的應用認為它就是處在一個獨立的OS之中,每個虛拟機就像一個容器,裡面可以裝各種各樣的應用,而不同容器中的應用總是認為他們是在一個獨立在OS環境下的,是以又稱為Container技術
兩種虛拟化技術各有優劣,對比如下圖:
下面是一張Container技術的結構圖:
從圖中可以看出,綠藍紅三種顔色的層組合起來就是一台Host主機,在Kernel層之上通過Container技術的三個要點:隔離(namespace),限制(cgroup),記錄(chroot)
來虛拟出一個個容器,并管理他們
隔離:
通過namespace機制來避免一些系統級的沖突。
因為每個容器都可以當做一個獨立的OS,那麼他們就擁有自己的pid程序号等資訊,如果這些東西和Host中的相沖突怎麼辦?畢竟容器不是自己在虛拟化的環境中獨立安裝一個OS,而是依賴于Host的OS
這時候就可以通過namespace來避免這些沖突,每個容器擁有自己的namespace來管理各自的系統資訊
限制:
在Host看來,每個Container都隻是一個普通的程序(當時在Container中的應用看來,這些Container都是一個OS),那麼怎麼來限制這些程序的CPU使用,時間片等資源呢?
cgroup是linux核心提供的限制,記錄和隔離程序組所用的資源
記錄:
上面說過,每個Container都可以當做一個獨立的OS,既然它是一個OS那麼肯定有自己的檔案系統,那麼問題又來了,每個Container都有自己的FS,Host也有自己的FS,這麼多獨立的FS要怎麼管理?
chroot隔離根檔案系統,怎麼個說法呢?例如Host的根目錄下有a,b目錄,并且分别被兩個Container當做其根目錄。在Host角度來看,ab隻是根目錄下的兩個普通檔案夾而已,而對于Container a來說/a就是其根目錄;對于Container b來說/b就是其根目錄
Docker:
什麼是Docker?
Docker是一種Container技術的實作,上面說到的Container技術也同樣可以用來描述Docker
想一想,我們在開發一個應用的時候
我們在自己的PC上完成了開發工作,并将項目交給測試人員進行測試,但是萬一測試的PC上的環境和開發的環境不一樣,可能會出現各種各樣的問題,同理應用釋出到伺服器上也是一樣的
應用每到一台新的PC中時就要求該PC要裝上它需要的所有東西,還要注意版本是不是一緻的
而Docker可以幫我們解決這些問題
Docker可以建立一個個Container,前面說過,每個Container都可以當做一個獨立的OS,那麼我們就可以在這個Container之中進行應用的開發。開發完成之後,我們可以将這個Container打包成一個Image(Image和Container的管理可以了解成:類和執行個體),可以将其看做是一個集裝箱,裡面裝着應用和應用的各種環境
在測試的PC上,通過Docker将這個集裝箱(Image)拿過來通過其建立一個Container就可以直接進行使用和測試,這個Container和開發時使用的Container的環境是一緻的(通過一個類執行個體化出來的各個對象)
Docker翻譯為搬運工,它所做的事情也是搬運工一樣的
我們可以将應用的各個元件,環境等都裝進一個集裝箱中,通過Docker運送到各個“碼頭上”
總結出一個Docker的最最簡單的介紹:友善打包釋出應用到容器中
我們來看看Docker的層次圖:
最底層的lxc,aufs都收kernel核心中運作的
lxc:Linux Container,是Linux上的一種實作Container虛拟化的技術,早期的Docker就基于lxc實作的,最新的版本中已經用libcontainer代替了
aufs:Advanced multi layer Unification FileSystem,翻譯成中文就是進階的,分層的,聯合的檔案系統,它最總要的内容就是可以将兩個目錄合并在一起,并可以設定操作權限(read-only/read-write)。Docker使用aufs來實作分層的檔案管理
倒數第二層的Debian和BusyBox都是在Kernel之上的Image,Image就是一個鏡像,可以通過這個鏡像來建立多個Container,Image在aufs中是隻讀的
中間層就是通過Image建立出來的Container,Container在aufs中是可讀可寫的,通過一個隻讀的Image建立出一個Container,可以對這個Container進行修改(如上圖中添加了一個emacs),然後在打包成一個不可讀的Image,而這個Image又可以建立出基于它的Container
通過上面的描述不難得出一個結論:Docker中的Image是層層關聯的,每個Image都有一個Parent Image(隻有一個除外,那就是Base Image,即最基本的鏡像,其他的Image都是在Base Image基礎上得到的),使用一個Image時,Docker會找到其Parent Image直到Base Image
Docker在啟動Container的時候, aufs會将下層的檔案系統設定成read-only,然後将Container的read-write挂載到下層的檔案系統之上,構成一個完整的檔案系統
在Container中所做的修改不會影響到其所屬的Image(因為它是隻讀的,通過COW技術将要修改的檔案複制到read-write層并改寫),如果沒有儲存這個Container(将其打包成一個新的Image),那麼當這個Container生命周期結束之後,所做的修改都會消失
這種機制的好處就是,每個階段的Image都可以進行大量的重用,在建立Container的時候隻需要加入不同的部分即可,而不用每次都将全部所需加載一遍
Docker Hub:
類似于Github的服務,用來分發Images,裡面有大量的Image提供Docker使用者下載下傳,基于這些Image,可以快速的搭建出我們自己所需要的Image
同時我們也可以将自做的Image push到Docker Hub中提供别人下載下傳
Docker安裝:
由于是基于Kernel核心的,是以Docker隻能跑在Linux上,而且是必須是64位的
在windows和mac系統上的Docker的主控端并不是windows或者mac,而是借助一個linux虛拟機作為其主控端
在這裡使用VM建立的一個Ubuntu來作為主控端,在Ubuntu中安裝很簡單
步驟如下:
sudo apt-get update
sudo apt-get install linux-image-generic-lts-raring linux-headers-generic-lts-raring
sudo reboot
sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 36A1D7869245C8950F966E92D8576A8BA88D21E9
sudo sh -c "echo deb https://get.docker.io/ubuntu docker main\
> /etc/apt/sources.list.d/docker.list"
sudo apt-get update
sudo apt-get install lxc-docker
期間可能因為網絡的原因會卡很久,完成之後輸入
docker
如果可以識别指令就是安裝成功了
另外,執行docker指令需要root權限,是以除了使用root使用者之外,每條指令都要加上sudo
或者也可以通過将目前的使用者加入docker使用者組(Docker提供的)就可以随時執行docker指令
sudo gpasswd -a ${USER} docker
sudo service docker restart
#如果沒有效果執行下列指令
newgrp - docker
#切換目前會話到新 group 因為 groups 指令擷取到的是緩存的組資訊,剛添加的組資訊未能生效,是以 docker images 執行時同樣有錯。