理解Docker技術

什麼是docker

   Docker is an open platform for developing,shipping, and running applications.

Docker是PaaS提供商dotCloud開源的基於LXC的,源代碼託管在Github上的,基於go語言開發的,遵循Appache2.0協議的容器引擎。

Docker允許打包程序並附帶它所有的依賴成標準化的單元來進行部署軟件。

Docker具有輕量、開源、安全的特點。

Docker VS VM

Docker容器在資源隔離和可配額方面與VM相似,但是不同於 VM的架構,使Docker容易更便攜和高效。

VM架構

一個VM包含有應用、必要的二進制文件與庫和一個完整的操作系統,以上所有加起可能有幾十G的大小。

wKioL1bC8hbAAYdSAACsVn96gUI853.png

Containers架構

       Containers包含應用和它所有的依賴,但是與其它containers共享內核。像用戶空間獨立的進程一樣運行在主機操作系統上。Docker容器並不是只能運行在特定的架構上,可以運行在任何計算機、任何架構和任何雲上。

wKioL1bC8mSBJCo0AACEZjvNIe4812.png

理解Docker架構

Docker可以用來幹什麼

1、快速交付應用

2、部署和擴展更容易

3、實現更高密度和運行更多負載

Docker重要組件

Docker:開源的容器化平臺

DockerHub:共享和管理docker容器的SaaS平臺

Docker架構

Docker採用C/S架構,Docker客戶端與進行創建、運行和分發容器的Docker守護進程進行會話。Docker客戶端和Docker守護進程可以運行在同一系統,或者通過Docker客戶端連接到遠端Docker守護進程。Docker客戶端和Docker守護進程通過sockets或RESTful API進行通信。

wKiom1bC8hryMLQeAAB6H6AJL2c652.png

Docker daemon

   如上圖所示,Docker daemon運行在一臺主機上。用戶並不是直接與docker deamon進行通信,而是通過Docker client。

Docker client

docker二進制形式的Docker client是連接Docker的基本用戶接口。它接收來自客戶端的命令和與Docker daemon之間的會話。

Docker內部

Docker鏡像(building)

Docker鏡像是一個只讀的模版,它可能是一個帶有apache的CentOS操作系統。Docker鏡像是用來創建Docker容器的,因此,Docker鏡像是Docker的build組件。

Docker倉庫(distributing)

   Docker倉庫是存儲鏡像的。是上傳或下載鏡像公共的或私有的倉庫。公共的倉庫由Docker Hub提供。因此Docker registries是Docker的distribution組件。

Docker  containers(running)

Docker容器和目錄很相似。一個Docker容器包含一個應用程序運行的所需的東西。每個Docker容器都是使用Docker p_w_picpath創建的,可以運行、啓動、停止、移動和刪除。每個Docker容器都是一個獨立和安全的應用平臺。因此,Docker containers是Docker的run組件

Docker使用的技術

LXC

LXC如何實現虛擬化

前面說過,Docker是基於LXC的操作系統級別的虛擬化。因此可以從以下幾個方面理解Docker是如何實現虛擬化的。

1、隔離型

LXC是通過container,具體是通過kerner namespace實現的

2、可配額

LXC是通過cgroups來控制資源的

3、移動性

   Docker利用AUFS實現

4、安全性

   對於LXC,用戶的進程是lxc-start進程的子進程,只是在kernel的namespace中隔離的,因此需要一些kernel的patch來保證用戶的運行環境不受來自host主機的惡意***。dotCloud主要利用Kernel grsecpatch解決的

命名空間(namespace)

LXC能夠實現隔離型,主要是靠kernel的namespace,期中的pid、net、ipc、mnt、uts等namespace將container的進程、網絡、消息、文件系統和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, 使其在網絡上可以被視作一個獨立的節點而非 Host 上的一個進程。

net namespace

網絡隔離是通過 net namespace 實現的,每個 net namespace 有獨立的network

devices, IP addresses, IP routingtables, /proc/net 目錄。這樣每個 container 的網絡

就能隔離開來。 docker 默認採用 veth 的方式將 container 中的虛擬網卡同 host 上的

一個 docker bridge 連接在一起。

mnt namespace

類似chroot,將一個進程放到一個特定的目錄執行。mnt namespace允許不同

namespace的進程看到的文件結構不同,這樣每個namespace 中的進程所看到的文件目錄就被隔離開了。同chroot不同,每個namespace中的container在/proc/mounts的信息只包含所在namespace的mount point。

ipc namespace

container 中進程交互還是採用 Linux 常見的進程間交互方法 (interprocess communication - IPC), 包括常見的信號量、消息隊列和共享內存。然而同 VM 不同,container 的進程間交互實際上還是 host 上具有相同 pid namespace 中的進程間交互,因此需要在IPC資源申請時加入 namespace 信息 - 每個 IPC 資源有一個唯一的32bit ID。

user namespace

每個 container 可以有不同的 user 和 group id, 也就是說可以以 container 內部的用戶在 container 內部執行程序而非 Host 上的用戶。

有了以上 6 種 namespace 從進程、網絡、IPC、文件系統、UTS 和用戶角度的隔離,一個 container 就可以對外展現出一個獨立計算機的能力,並且不同 container從 OS 層面實現了隔離。 然而不同 namespace 之間資源還是相互競爭的,仍然需要類似 ulimit 來管理每個 container 所能使用的資源 

資源配額-Control Groups

cgroups 實現了對資源的配額和度量。 cgroups 的使用非常簡單,提供類似文件的接口,在 /cgroup 目錄下新建一個文件夾即可新建一個 group,在此文件夾中新建 task 文件,並將 pid 寫入該文件,即可實現對該進程的資源控制。具體的資源配置選項可以在該文件夾中新建子 subsystem ,{子系統前綴}.{資源項} 是典型的配置方法, 如 memory.usage_in_bytes 就定義了該 group 在 subsystem memory 中的一個內存限制選項。另外,cgroups 中的 subsystem 可以隨意組合,一個 subsystem 可以在不同的 group 中,也可以一個 group 包含多個 subsystem - 也就是說一個 subsystem。

1、memory

內存相關的限制

2、cpu

在 cgroup 中,並不能像硬件虛擬化方案一樣能夠定義 CPU 能力,但是能夠定義 CPU 輪轉的優先級,因此具有較高 CPU 優先級的進程會更可能得到 CPU 運算。 通過將參數寫入 cpu.shares ,即可定義改 cgroup 的 CPU 優先級 - 這裏是一個相對權重,而非絕對值

3、blkio

block IO 相關的統計和限制,byte/operation 統計和限制 (IOPS 等),讀寫速度限制等,但是這裏主要統計的都是同步 IO

4、devices

設備權限限制

5、net_cls、cpuacct、freezer等其它管理項。

 

 

 

參考文獻:

https://docs.docker.com/engine/understanding-docker/

https://www.docker.com/what-docker

linuxcontainers.org

http://tiewei.github.io/cloud/Docker-Getting-Start

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章