1、什麼是容器
linux
容器是一種基礎工具,泛指任何能夠用於容納其餘物品的工具,能夠部分或徹底封閉,被用於容納、儲存、運輸物品;物體能夠被放置在容器中,而容器能夠保護內容物;docker
人類使用容器的歷史至少有十萬年。
服務器
2、虛擬化的實現網絡
一、主機級虛擬化ide
此實現是在宿主機上安裝虛擬機管理軟件,然後虛擬出N個完整的系統,每個系統都有本身的內核。有兩種類型的實現工具
1.一、Type-I類型(在宿主機上直接安裝Virtual machine Manager,不須要在宿主機上安裝操做系統)性能
xen、ESX/ESXI測試
1.二、Type-II類型(須要基於宿主機的操做系統之上安裝Virtual Machine Manager)spa
VMware Workstation、kvm、VirtualBox操作系統
二、容器級別虛擬化
此實現不在爲每個虛擬機建立單獨的內核,而是經過在宿主機的內核上將6種資源經過內核機制(namespaces)隔離出來,每個namespace是一個單獨的容器(虛擬機)
至今位置,整個linux領域的容器技術,就是靠內核級的6個namespaces、chroot和Cgroups共同實現
2.一、Linux Namespaces
namespace | 系統調用參數 | 隔離內容 | 內核版本 |
UTS |
CLONE_NEWUTS |
主機名和域名 | 2.6.19 |
IPC |
CLONE_NEWIPC | 信號量、消息隊列和共享內存 |
2.6.19 |
PID | CLONE_NEWPID | 進程編號 | 2.6.24 |
Network | CLONE_NEWNET | 網絡設備、網絡棧、端口等 | 2.6.29 |
Mount | CLONE_NEWNS | 掛載點,文件系統 | 2.4.19 |
User | CLONE_NEWUSER |
用戶和用戶組 | 3.8 |
2.二、Control Groups(CGroups)的做用
容器化技術的隔離機制是靠namespaces實現,而容器化的資源分配靠的是在內核級經過CGroups機制實現,它會把系統級的資源分紅多個組,而後把每個組內的資源量指派分配到特定的namespace的進程上去來實現
2.2.一、CGroups的功能
blkio |
塊設備IO |
cpu |
CPU |
cpuacct |
CPU資源使用報告 |
cpuset |
多處理器平臺上的CPU集合,有兩種分派方式,一種是比例,一種是分核數 |
devices |
設備訪問 |
freezer |
掛起或恢復任務 |
memory |
內存用量及報告 |
perf_event |
對cgroup中的任務進行統一性能測試 |
net_cls |
cgroup中的任務建立的數據報文的類別標識符 |
2.三、LXC(Linux Container)
LXC是最先除了Vserver以外,真正把完整的容器技術用一組簡易使用的工具和模板來極大的簡化了容器技術使用的一個方案。LXC靠一組工具包幫咱們快速的實現了建立名稱空間,利用模板完成內部所須要的各類文件的安裝。同時,還有些工具可以自動完成chroot切換,因而,就可使用多個並行的用戶空間,而每個用戶空間,就像咱們以前使用的虛擬機,是一個獨立的系統。
3、Docker的誕生
LXC雖然極大的簡化了容器技術的使用,但比起過去使用虛擬機來說,它的複雜程度是沒有多大下降的,隔離性也沒有虛擬機好、在大規模使用上和分發上都不方便。但好處是它可以讓每個用戶空間的進程直接使用宿主機的性能,中間沒有額外開銷。因而就出現了Docker
3.一、Docker是LXC的加強版,它自己不是容器,而是容器的易用工具。容器是linux內核中的技術,Docker只是把這種技術在使用上簡易普及了。Docker在早期的版本其核心就是LXC的二次封裝發行版。Docker利用LXC作容器管理引擎,可是在建立容器時,不在使用模板去安裝生成。而是經過鏡像技術(把一個操做系統用戶空間所須要使用到的組件事先編排好,並總體打包成一個文件,image文件),鏡像文件集中放在一個倉庫中。當須要建立容器時,Docker調用LXC的工具lxc-create。可是不在經過lxc的模板去安裝,而是鏈接到鏡像服務器上下載匹配的鏡像文件,然後基於鏡像啓動容器。因此,Docker極大的簡化了容器的使用難度。之後咱們建立啓動容器,只須要一個命令,docker-run,docker-stop就能夠啓動中止一個容器了。爲了使整個容器使用更加易於管理,Docker採用了一種更精巧的限制機制,在一個容器內,只運行一個進程。而LXC是把一個容器當一個用戶空間使用,能夠運行N個進程,因此使得咱們管理容器進程極爲不便。Docker在鏡像構建底層使用了分層構建,聯合掛載。這種好處就是在之後的鏡像分發上就沒有那麼龐大。能夠自由組合鏡像實現不一樣環境的掛載
2.三、Docker容器引擎的更迭
Docker早起是基於LXC容器管理引擎實現,當後來成熟以後,Docker自建了一個容器引擎叫libcontainer,後來CNCF的介入,Docker又研發了一個工業化標準的容器引擎,叫runC,目前所使用的新版Docker,所使用的容器引擎就是RunC。