1.docker介紹
容器技術和虛擬化技術的區別
從下圖可以看出,VM是一個執行在宿主機之上的完整的作業系統,VM執行自身作業系統會佔用較多的CPU、記憶體、硬碟資源。Docker不同於VM,只包含應用程式以及依賴庫,基於libcontainer執行在宿主機上,並處於一個隔離的環境中,這使得Docker更加輕量高效,啟動容器只需幾秒鐘之內完成。由於Docker輕量、資源佔用少,使得Docker可以輕易的應用到構建標準化的應用中。但Docker目前還不夠完善,比如隔離效果不如VM,共享宿主機作業系統的一些基礎庫等;網路配置功能相對簡單,主要以橋接方式為主;檢視日誌也不夠方便靈活。
1.Linux Namespace
名稱 | 作用 | 核心版本 |
---|---|---|
Mount | 提供磁碟掛載點和檔案系統的隔離能力 | linux 2.4.19 |
IPC | 程序間通訊隔離 | linux 2.6.19 |
UTS | 主機名隔離 | linux 2.6.19 |
PID | 程序隔離 | linux 2.6.24 |
Net | 網路隔離 | linux 2.6.29 |
User | 使用者隔離 | linux 3.8 |
LXC所實現的隔離性主要是來自kernel的namespace, 其中pid, net, ipc, mnt, uts 等namespace將container的程序, 網路, 訊息, 檔案系統和hostname 隔離開。
1) pid namespace
之前提到使用者的程序是lxc-start程序的子程序, 不同使用者的程序就是通過pidnamespace隔離開的,且不同 namespace 中可以有相同PID。具有以下特徵:
每個namespace中的pid是有自己的pid=1的程序(類似/sbin/init程序)
每個namespace中的程序只能影響自己的同一個namespace或子namespace中的程序
因為/proc包含正在執行的程序,因此在container中的pseudo-filesystem的/proc目錄只能看到自己namespace中的程序
因為namespace允許巢狀,父namespace可以影響子namespace的程序,所以子namespace的程序可以在父namespace中看到,但是具有不同的pid
正是因為以上的特徵,所有的LXC程序在docker中的父程序為docker程序,每個lxc程序具有不同的namespace。同時由於允許巢狀,因此可以很方便的實現 LXC in LXC
2) net namespace
有了 pid namespace, 每個namespace中的pid能夠相互隔離,但是網路埠還是共享host的埠。網路隔離是通過netnamespace實現的,
每個net namespace有獨立的 network devices, IP addresses, IP routing tables, /proc/net 目錄。這樣每個container的網路就能隔離開來。
LXC在此基礎上有5種網路型別,docker預設採用veth的方式將container中的虛擬網絡卡同host上的一個docker bridge連線在一起。
3) ipc namespace
container中程序互動還是採用linux常見的程序間互動方法(interprocess communication - IPC), 包括常見的訊號量、訊息佇列和共享記憶體。然而同VM不同,container 的程序間互動實際上還是host上具有相同pid namespace中的程序間互動,因此需要在IPC資源申請時加入namespace資訊 - 每個IPC資源有一個的 32bit ID。
4) mnt namespace
類似chroot,將一個程序放到一個特定的目錄執行。mnt namespace允許不同namespace的程序看到的檔案結構不同,這樣每個 namespace 中的程序所看到的檔案目錄就被隔離開了。同chroot不同,每個namespace中的container在/proc/mounts的資訊只包含所在namespace的mount point。
5) uts namespace
UTS(“UNIX Time-sharing System”) namespace允許每個container擁有獨立的hostname和domain name,
使其在網路上可以被視作一個獨立的節點而非Host上的一個程序。
6) user namespace
每個container可以有不同的 user 和 group id, 也就是說可以以container內部的使用者在container內部執行程式而非Host上的使用者。
有了以上6種namespace從程序、網路、IPC、檔案系統、UTS和使用者角度的隔離,一個container就可以對外展現出一個獨立計算機的能力,並且不同container從OS層面實現了隔離。
然而不同namespace之間資源還是相互競爭的,仍然需要類似ulimit來管理每個container所能使用的資源 - LXC 採用的是cgroup.
2.docker架構
1)映象 image
通過映象可以建立容器
2)容器
容器就是一個簡單的作業系統 程式執行在容器內
3) 倉庫
存放映象的地方 有公有倉庫 docerk hub 私有倉庫 harbor registry