您好,登錄后才能下訂單哦!
一、什么是容器
容器是一種基礎工具,泛指任何可以用于容納其他物品的工具,可以部分或完全封閉,被用于容納、儲存、運輸物品;物體可以被放置在容器中,而容器可以保護內容物;
人類使用容器的歷史至少有十萬年。
二、虛擬化的實現
1、主機級虛擬化
此實現是在宿主機上安裝虛擬機管理軟件,而后虛擬出N個完整的系統,每一個系統都有自己的內核。有兩種類型的實現
1.1、Type-I類型(在宿主機上直接安裝Virtual machine Manager,不需要在宿主機上安裝操作系統)
xen、ESX/ESXI
1.2、Type-II類型(需要基于宿主機的操作系統之上安裝Virtual Machine Manager)
VMware Workstation、kvm、VirtualBox
2、容器級別虛擬化
此實現不在為每一個虛擬機創建單獨的內核,而是通過在宿主機的內核上將6種資源通過內核機制(namespaces)隔離出來,每一個namespace是一個單獨的容器(虛擬機)
至今位置,整個linux領域的容器技術,就是靠內核級的6個namespaces、chroot和Cgroups共同實現
2.1、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.2、Control Groups(CGroups)的作用
容器化技術的隔離機制是靠namespaces實現,而容器化的資源分配靠的是在內核級通過CGroups機制實現,它會把系統級的資源分成多個組,然后把每一個組內的資源量指派分配到特定的namespace的進程上去來實現
2.2.1、CGroups的功能
blkio | 塊設備IO |
cpu | CPU |
cpuacct | CPU資源使用報告 |
cpuset | 多處理器平臺上的CPU集合,有兩種分派方式,一種是比例,一種是分核數 |
devices | 設備訪問 |
freezer | 掛起或恢復任務 |
memory | 內存用量及報告 |
perf_event | 對cgroup中的任務進行統一性能測試 |
net_cls | cgroup中的任務創建的數據報文的類別標識符 |
2.3、LXC(Linux Container)
LXC是最早除了Vserver之外,真正把完整的容器技術用一組簡易使用的工具和模板來極大的簡化了容器技術使用的一個方案。LXC靠一組工具包幫我們快速的實現了創建名稱空間,利用模板完成內部所需要的各種文件的安裝。同時,還有些工具能夠自動完成chroot切換,于是,就可以使用多個并行的用戶空間,而每一個用戶空間,就像我們之前使用的虛擬機,是一個獨立的系統。
三、Docker的誕生
LXC雖然極大的簡化了容器技術的使用,但比起過去使用虛擬機來講,它的復雜程度是沒有多大降低的,隔離性也沒有虛擬機好、在大規模使用上和分發上都不方便。但好處是它能夠讓每一個用戶空間的進程直接使用宿主機的性能,中間沒有額外開銷。于是就出現了Docker
3.1、Docker是LXC的增強版,它本身不是容器,而是容器的易用工具。容器是linux內核中的技術,Docker只是把這種技術在使用上簡易普及了。Docker在早期的版本其核心就是LXC的二次封裝發行版。Docker利用LXC做容器管理引擎,但是在創建容器時,不在使用模板去安裝生成。而是通過鏡像技術(把一個操作系統用戶空間所需要使用到的組件事先編排好,并整體打包成一個文件,image文件),鏡像文件集中放在一個倉庫中。當需要創建容器時,Docker調用LXC的工具lxc-create。但是不在通過lxc的模板去安裝,而是連接到鏡像服務器上下載匹配的鏡像文件,而后基于鏡像啟動容器。所以,Docker極大的簡化了容器的使用難度。以后我們創建啟動容器,只需要一個命令,docker-run,docker-stop就可以啟動停止一個容器了。為了使整個容器使用更加易于管理,Docker采用了一種更精巧的限制機制,在一個容器內,只運行一個進程。而LXC是把一個容器當一個用戶空間使用,可以運行N個進程,所以使得我們管理容器進程極為不便。Docker在鏡像構建底層使用了分層構建,聯合掛載。這種好處就是在以后的鏡像分發上就沒有那么龐大。可以自由組合鏡像實現不同環境的掛載
2.3、Docker容器引擎的更迭
Docker早起是基于LXC容器管理引擎實現,當后來成熟之后,Docker自建了一個容器引擎叫libcontainer,后來CNCF的介入,Docker又研發了一個工業化標準的容器引擎,叫runC,目前所使用的新版Docker,所使用的容器引擎就是RunC。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。