1. 程式人生 > 其它 >1.docker介紹

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