Docker is an open platform for developing,shipping, and running applications. Docker是PaaS提供商dotCloud開源的基于LXC的,源代碼托管在Github上的,基于go語言開發(fā)的,遵循Appache2.0協(xié)議的容器引擎。 Docker允許打包程序并附帶它所有的依賴成標準化的單元來進行部署軟件。 Docker具有輕量、開源、安全的特點。 Docker容器在資源隔離和可配額方面與VM相似,但是不同于 VM的架構(gòu),使Docker容易更便攜和高效。 一個VM包含有應(yīng)用、必要的二進制文件與庫和一個完整的操作系統(tǒng),以上所有加起可能有幾十G的大小。 Containers包含應(yīng)用和它所有的依賴,但是與其它containers共享內(nèi)核。像用戶空間獨立的進程一樣運行在主機操作系統(tǒng)上。Docker容器并不是只能運行在特定的架構(gòu)上,可以運行在任何計算機、任何架構(gòu)和任何云上。 Docker可以用來干什么 1、快速交付應(yīng)用 2、部署和擴展更容易 3、實現(xiàn)更高密度和運行更多負載 Docker重要組件 Docker:開源的容器化平臺 DockerHub:共享和管理docker容器的SaaS平臺 Docker采用C/S架構(gòu),Docker客戶端與進行創(chuàng)建、運行和分發(fā)容器的Docker守護進程進行會話。Docker客戶端和Docker守護進程可以運行在同一系統(tǒng),或者通過Docker客戶端連接到遠端Docker守護進程。Docker客戶端和Docker守護進程通過sockets或RESTful API進行通信。
Docker client docker二進制形式的Docker client是連接Docker的基本用戶接口。它接收來自客戶端的命令和與Docker daemon之間的會話。 Docker鏡像(building) Docker鏡像是一個只讀的模版,它可能是一個帶有apache的CentOS操作系統(tǒng)。Docker鏡像是用來創(chuàng)建Docker容器的,因此,Docker鏡像是Docker的build組件。 Docker倉庫(distributing) Docker倉庫是存儲鏡像的。是上傳或下載鏡像公共的或私有的倉庫。公共的倉庫由Docker Hub提供。因此Docker registries是Docker的distribution組件。 Docker containers(running) Docker容器和目錄很相似。一個Docker容器包含一個應(yīng)用程序運行的所需的東西。每個Docker容器都是使用Docker image創(chuàng)建的,可以運行、啟動、停止、移動和刪除。每個Docker容器都是一個獨立和安全的應(yīng)用平臺。因此,Docker containers是Docker的run組件 LXC LXC如何實現(xiàn)虛擬化 前面說過,Docker是基于LXC的操作系統(tǒng)級別的虛擬化。因此可以從以下幾個方面理解Docker是如何實現(xiàn)虛擬化的。 1、隔離型 LXC是通過container,具體是通過kerner namespace實現(xiàn)的 2、可配額 LXC是通過cgroups來控制資源的 3、移動性 Docker利用AUFS實現(xiàn) 4、安全性 對于LXC,用戶的進程是lxc-start進程的子進程,只是在kernel的namespace中隔離的,因此需要一些kernel的patch來保證用戶的運行環(huán)境不受來自host主機的惡意入侵。dotCloud主要利用Kernel grsecpatch解決的 命名空間(namespace) LXC能夠?qū)崿F(xiàn)隔離型,主要是靠kernel的namespace,期中的pid、net、ipc、mnt、uts等namespace將container的進程、網(wǎng)絡(luò)、消息、文件系統(tǒng)和host隔離開的。 Pid namespace 不同用戶的進程就是通過pid namespace隔離開的。不同的namespace可以有相同的pid namespace。具有以下特征:1、每個 namespace 中的 pid 是有自己的 pid=1 的進程(類似 /sbin/init 進程) 2、每個 namespace 中的進程只能影響自己的同一個 namespace 或子 namespace 中的進程 3、因為 /proc 包含正在運行的進程,因此在 container 中的 pseudo-filesystem 的 /proc 目錄只能看到自己 namespace 中的進程 4、因為 namespace 允許嵌套,父 namespace 可以影響子 namespace 的進程,所以子 namespace 的進程可以在父 namespace 中看到,但是具有不同的 pid uts namespace UTS (“UNIX Time-sharing System”)namespace 允許每個 container 擁有獨立的 hostname 和 domain name, 使其在網(wǎng)絡(luò)上可以被視作一個獨立的節(jié)點而非 Host 上的一個進程。 net namespace 網(wǎng)絡(luò)隔離是通過 net namespace 實現(xiàn)的,每個 net namespace 有獨立的network devices, IP addresses, IP routingtables, /proc/net 目錄。這樣每個 container 的網(wǎng)絡(luò)就能隔離開來。 docker 默認采用 veth 的方式將 container 中的虛擬網(wǎng)卡同 host 上的一個 docker bridge 連接在一起。 mnt namespace 類似chroot,將一個進程放到一個特定的目錄執(zhí)行。mnt namespace允許不同 namespace的進程看到的文件結(jié)構(gòu)不同,這樣每個namespace 中的進程所看到的文件目錄就被隔離開了。同chroot不同,每個namespace中的container在/proc/mounts的信息只包含所在namespace的mount point。 ipc namespace container 中進程交互還是采用 Linux 常見的進程間交互方法 (interprocess communication - IPC), 包括常見的信號量、消息隊列和共享內(nèi)存。然而同 VM 不同,container 的進程間交互實際上還是 host 上具有相同 pid namespace 中的進程間交互,因此需要在IPC資源申請時加入 namespace 信息 - 每個 IPC 資源有一個唯一的32bit ID。 user namespace 每個 container 可以有不同的 user 和 group id, 也就是說可以以 container 內(nèi)部的用戶在 container 內(nèi)部執(zhí)行程序而非 Host 上的用戶。 有了以上 6 種 namespace 從進程、網(wǎng)絡(luò)、IPC、文件系統(tǒng)、UTS 和用戶角度的隔離,一個 container 就可以對外展現(xiàn)出一個獨立計算機的能力,并且不同 container從 OS 層面實現(xiàn)了隔離。 然而不同 namespace 之間資源還是相互競爭的,仍然需要類似 ulimit 來管理每個 container 所能使用的資源 資源配額-Control Groups cgroups 實現(xiàn)了對資源的配額和度量。 cgroups 的使用非常簡單,提供類似文件的接口,在 /cgroup 目錄下新建一個文件夾即可新建一個 group,在此文件夾中新建 task 文件,并將 pid 寫入該文件,即可實現(xiàn)對該進程的資源控制。具體的資源配置選項可以在該文件夾中新建子 subsystem ,{子系統(tǒng)前綴}.{資源項} 是典型的配置方法, 如 memory.usage_in_bytes 就定義了該 group 在 subsystem memory 中的一個內(nèi)存限制選項。另外,cgroups 中的 subsystem 可以隨意組合,一個 subsystem 可以在不同的 group 中,也可以一個 group 包含多個 subsystem - 也就是說一個 subsystem。 1、memory (內(nèi)存相關(guān)的限制) 2、cpu 在 cgroup 中,并不能像硬件虛擬化方案一樣能夠定義 CPU 能力,但是能夠定義 CPU 輪轉(zhuǎn)的優(yōu)先級,因此具有較高 CPU 優(yōu)先級的進程會更可能得到 CPU 運算。 通過將參數(shù)寫入 cpu.shares ,即可定義改 cgroup 的 CPU 優(yōu)先級 - 這里是一個相對權(quán)重,而非絕對值 3、blkio block IO 相關(guān)的統(tǒng)計和限制,byte/operation 統(tǒng)計和限制 (IOPS 等),讀寫速度限制等,但是這里主要統(tǒng)計的都是同步 IO 4、devices(設(shè)備權(quán)限限制) 5、net_cls、cpuacct、freezer等其它管理項。 參考文獻: https://docs./engine/understanding-docker/ https://www./what-docker linuxcontainers.org http://tiewei./cloud/Docker-Getting-Start 作者:郝朝陽 |
|