1. 程式人生 > >docker核心技術預覽

docker核心技術預覽

核心技術預覽

Docker核心是一個作業系統級虛擬化方法, 理解起來可能並不像VM那樣直觀。我們從虛擬化方法的四個方面:隔離性、可配額/可度量、便攜性、安全性來詳細介紹Docker的技術細節。

2.1. 隔離性: Linux Namespace(ns)

每個使用者例項之間相互隔離, 互不影響。 一般的硬體虛擬化方法給出的方法是VM,而LXC給出的方法是container,更細一點講就是kernel namespace。其中pid、net、ipc、mnt、uts、user等namespace將container的程序、網路、訊息、檔案系統、UTS("UNIX Time-sharing System")和使用者空間隔離開。

1) pid namespace

不同使用者的程序就是通過pid namespace隔離開的,且不同 namespace 中可以有相同pid。所有的LXC程序在docker中的父程序為docker程序,每個lxc程序具有不同的namespace。同時由於允許巢狀,因此可以很方便的實現 Docker in Docker。

2) net namespace

有了 pid namespace, 每個namespace中的pid能夠相互隔離,但是網路埠還是共享host的埠。網路隔離是通過net namespace實現的, 每個net namespace有獨立的 network devices, IP addresses, IP routing tables, /proc/net 目錄。這樣每個container的網路就能隔離開來。docker預設採用veth的方式將container中的虛擬網絡卡同host上的一個docker bridge: docker0連線在一起。

3) ipc namespace

container中程序互動還是採用linux常見的程序間互動方法(interprocess communication - IPC), 包括常見的訊號量、訊息佇列和共享記憶體。然而同 VM 不同的是,container 的程序間互動實際上還是host上具有相同pid namespace中的程序間互動,因此需要在IPC資源申請時加入namespace資訊 - 每個IPC資源有一個唯一的 32 位 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上的使用者。

2.2 可配額/可度量 - Control Groups (cgroups)

cgroups 實現了對資源的配額和度量。 cgroups 的使用非常簡單,提供類似檔案的介面,在 /cgroup目錄下新建一個資料夾即可新建一個group,在此資料夾中新建task檔案,並將pid寫入該檔案,即可實現對該程序的資源控制。groups可以限制blkio、cpu、cpuacct、cpuset、devices、freezer、memory、net_cls、ns九大子系統的資源,以下是每個子系統的詳細說明:

  1. blkio 這個子系統設定限制每個塊裝置的輸入輸出控制。例如:磁碟,光碟以及usb等等。
  2. cpu 這個子系統使用排程程式為cgroup任務提供cpu的訪問。
  3. cpuacct 產生cgroup任務的cpu資源報告。
  4. cpuset 如果是多核心的cpu,這個子系統會為cgroup任務分配單獨的cpu和記憶體。
  5. devices 允許或拒絕cgroup任務對裝置的訪問。
  6. freezer 暫停和恢復cgroup任務。
  7. memory 設定每個cgroup的記憶體限制以及產生記憶體資源報告。
  8. net_cls 標記每個網路包以供cgroup方便使用。
  9. ns 名稱空間子系統。

以上九個子系統之間也存在著一定的關係.詳情請參閱官方文件

2.3 便攜性: AUFS

AUFS (AnotherUnionFS) 是一種 Union FS, 簡單來說就是支援將不同目錄掛載到同一個虛擬檔案系統下(unite several directories into a single virtual filesystem)的檔案系統, 更進一步的理解, AUFS支援為每一個成員目錄(類似Git Branch)設定readonly、readwrite 和 whiteout-able 許可權, 同時 AUFS 裡有一個類似分層的概念, 對 readonly 許可權的 branch 可以邏輯上進行修改(增量地, 不影響 readonly 部分的)。通常 Union FS 有兩個用途, 一方面可以實現不借助 LVM、RAID 將多個disk掛到同一個目錄下, 另一個更常用的就是將一個 readonly 的 branch 和一個 writeable 的 branch 聯合在一起,Live CD正是基於此方法可以允許在 OS image 不變的基礎上允許使用者在其上進行一些寫操作。Docker 在 AUFS 上構建的 container image 也正是如此,接下來我們從啟動 container 中的 linux 為例來介紹 docker 對AUFS特性的運用。

典型的啟動Linux執行需要兩個FS: bootfs + rootfs:

bootfs (boot file system) 主要包含 bootloader 和 kernel, bootloader主要是引導載入kernel, 當boot成功後 kernel 被載入到記憶體中後 bootfs就被umount了. rootfs (root file system) 包含的就是典型 Linux 系統中的 /dev, /proc,/bin, /etc 等標準目錄和檔案。

對於不同的linux發行版, bootfs基本是一致的, 但rootfs會有差別, 因此不同的發行版可以公用bootfs 如下圖:

典型的Linux在啟動後,首先將 rootfs 設定為 readonly, 進行一系列檢查, 然後將其切換為 "readwrite" 供使用者使用。在Docker中,初始化時也是將 rootfs 以readonly方式載入並檢查,然而接下來利用 union mount 的方式將一個 readwrite 檔案系統掛載在 readonly 的rootfs之上,並且允許再次將下層的 FS(file system) 設定為readonly 並且向上疊加, 這樣一組readonly和一個writeable的結構構成一個container的執行時態, 每一個FS被稱作一個FS層。如下圖:

得益於AUFS的特性, 每一個對readonly層檔案/目錄的修改都只會存在於上層的writeable層中。這樣由於不存在競爭, 多個container可以共享readonly的FS層。 所以Docker將readonly的FS層稱作 "image" - 對於container而言整個rootfs都是read-write的,但事實上所有的修改都寫入最上層的writeable層中, image不儲存使用者狀態,只用於模板、新建和複製使用。

上層的image依賴下層的image,因此Docker中把下層的image稱作父image,沒有父image的image稱作base image。因此想要從一個image啟動一個container,Docker會先載入這個image和依賴的父images以及base image,使用者的程序執行在writeable的layer中。所有parent image中的資料資訊以及 ID、網路和lxc管理的資源限制等具體container的配置,構成一個Docker概念上的container。如下圖:

2.4 安全性: AppArmor, SELinux, GRSEC

安全永遠是相對的,這裡有三個方面可以考慮Docker的安全特性:

  1. 由kernel namespaces和cgroups實現的Linux系統固有的安全標準;
  2. Docker Deamon的安全介面;
  3. Linux本身的安全加固解決方案,類如AppArmor, SELinux;

由於安全屬於非常具體的技術,這裡不在贅述,請直接參閱Docker官方文件

相關推薦

Docker(一):Docker核心技術

docker開始學習docker了,想寫一篇docker技術介紹的純理論文章,發現以下網站的文檔寫的特別好,就直接引用了,文章轉載自:http://www.infoq.com/cn/DockerDeep http://www.infoq.com/cn/articles/docker-core-technolo

docker核心技術

核心技術預覽 Docker核心是一個作業系統級虛擬化方法, 理解起來可能並不像VM那樣直觀。我們從虛擬化方法的四個方面:隔離性、可配額/可度量、便攜性、安全性來詳細介紹Docker的技術細節。 2.1. 隔離性: Linux Namespace(ns) 每個使用者例

深入淺出Docker(1)----Docker核心技術

本文為轉載文章http://www.infoq.com/cn/articles/docker-core-technology-preview/ 【編者按】Docker是PaaS供應商dotCloud開源的一個基於LXC 的高階容器引擎,原始碼託管在 GitHub 上,

消息:SQL Server 2017(vNext)的第三個公開的CTP(社區技術版)發布了

start spn system 看到了 一個 get creat 社區 目前 今天看到了一個新聞,跟大家分享一下,有興趣的可以去嘗試一下。 SQL Server 2017 CTP3於5月23日發布了,詳細版本號是6.7.55.0。 大家可以去安裝試試。在下載頁面,目前是S

微軟發布Azure Stack第一個技術

模式 net cto linux 第一個 企業 網絡 靈敏度 連接 為了提升商業靈敏度和加快創新步伐,各個企業都在迅速地轉向雲服務。在微軟,我們已經見到微軟智能雲Azure的飛速發展和使用,每月我們都有近十萬的新增訂閱量。然而,我們也了解到還有很多企業在完全移到公有雲這點上

Docker02:Docker核心技術探索(3)網絡命名空間和網絡隔離

net running all pack 網卡 roo span 命名空間 collision 在Docker中可以為Docker容器創建與原始宿主系統以及其它容器中的虛擬系統之間相互隔離的虛擬網絡環境。 Docker的網絡分為以下幾種模式: (1)bridge模式。這將配

2018年7月新品尚家docker核心技術教程--大牛編程吧-程序員編程入門聖地

教程 加速器 -c tomcat 自定義 安裝 uil 理念 file 2018年7月新品尚家docker核心技術教程--大牛編程吧-程序員編程入門聖地2018年7月新品尚家docker核心技術教程--大牛編程吧-程序員編程入門聖地 02_Docker_為什麽會出現.avi

Docker核心技術理解(一)

Docker的出現是近十年軟體工程領域最大的革命,Docker的技術完全可以重鑄整個軟體開發測試運維等軟體部署的各個方面。 以前的虛擬化技術如VMware,OpenStack一般都是重量級的虛擬化,以VMware為例,首先的需要VMware這套軟體,在這基礎之上安裝具體的作業系統(比如ubantu映

Docker核心技術(一)

Docker核心技術 1.Docker的簡介 1)前提知識和課程定位 2)什麼是Docker 3)Docker能幹什麼? (1)之前的虛擬機器技術 (2)容器虛擬化技術 (3)開發/運維(DevOp

Docker核心技術(二)

Docker核心技術 Docker的常用命令 幫助命令 映象命令 docker images docker search docker pull 容器命令 1.拉取映象

Docker核心技術(四)

Docker核心技術 DockerFile體系結構 自定義Tomcat9 Docker常用安裝 總體步驟: 安裝Mysql 安裝Redis 本地映象釋出到阿里雲 DockerFile體系結構

Docker核心技術(三)

Docker核心技術 Docker容器資料卷 Docker容器資料卷是什麼? Docker容器資料卷能幹嘛? Docker容器資料卷的實操 直接命令新增 DockerFile新增 資料卷容器

Docker 核心技術與實現原理

提到虛擬化技術,我們首先想到的一定是 Docker,經過四年的快速發展 Docker 已經成為了很多公司的標配,也不再是一個只能在開發階段使用的玩具了。作為在生產環境中廣泛應用的產品,Docker 有著非常成熟的社群以及大量的使用者,程式碼庫中的內容也變得非常龐

Docker核心技術以及實現原理

Docker的出現,為後端開發和運維提供了虛擬化技術,優雅地解決了開發環境和生產環境不一致的問題。本文總結了下Docker使用的核心技術和工作機理,為了往後能夠學習地更透徹。 Namespaces 名稱空間可以有效地幫助Docker分離程序樹

Docker學習總結(29)——Docker核心技術與實現原理

提到虛擬化技術,我們首先想到的一定是 Docker,經過四年的快速發展 Docker 已經成為了很多公司的標配,也不再是一個只能在開發階段使用的玩具了。作為在生產環境中廣泛應用的產品,Docker 有著非常成熟的社群以及大量的使用者,程式碼庫中的內容也變得非常龐大。同樣,由於

Docker 核心技術與實現原理(轉載)

原文地址:https://draveness.me/docker 提到虛擬化技術,我們首先想到的一定是 Docker,經過四年的快速發展 Docker 已經成為了很多公司的標配,也不再是一個只能在開發階段使用的玩具了。作為在生產環境中廣泛應用的產品,Docker 有著非常成熟的社群以及大量的使用

基於MPP架構的TERADATA技術

/***************************************/ 目錄: 第一部分:Teradata架構 第二部分:常見問題,及解決方法 第三部分:Teradata工具實用小技巧 第四部分:JOIN的實現機制 第五部分:JOIN的優化 /**************************

尚矽谷Docker核心技術視訊教程

01_尚矽谷_Docker_前提知識要求和課程簡介.avi 02_尚矽谷_Docker_為什麼會出現.avi03_尚矽谷_Docker_理念.avi04_尚矽谷_Docker_是什麼.avi05_尚矽谷_Docker_能幹什麼.avi06_尚矽谷_Docker_三要素.

Docker 核心技術之倉庫

daemon rdquo htpasswd 瀏覽器 trie 當前 point etc 倉庫搭建 Docker 倉庫簡介 什麽是Docker倉庫 Docker倉庫就是存放docker鏡像並有docker pull方法下載的雲環境 Docker倉庫分為公有倉庫和私

Docker 核心技術之Dockerfile

原本 環境變量 lis 使用 基礎 就會 uil 其他 windows Dockerfile 簡介 什麽是Dockerfile Dockerfile其實就是根據特定的語法格式撰寫出來的一個普通的文本文件 利用docker build命令依次執行在Dockerfile中