1. 程式人生 > >深入淺出Docker(1)----Docker核心技術預覽

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

本文為轉載文章http://www.infoq.com/cn/articles/docker-core-technology-preview/

【編者按】Docker是PaaS供應商dotCloud開源的一個基於LXC 的高階容器引擎,原始碼託管在 GitHub 上, 基於Go語言開發並遵從Apache 2.0協議開源。Docker提供了一種在安全、可重複的環境中自動部署軟體的方式,它的出現拉開了基於雲端計算平臺釋出產品方式的變革序幕。為了更好的促進Docker在國內的發展以及傳播,我們決定開設《深入淺出Docker》專欄,邀請Docker相關的佈道師、開發人員、技術專家來講述Docker的各方面內容,讓讀者對Docker有更深入的瞭解,並且能夠積極投入到新技術的討論和實踐中。另外,歡迎加入InfoQ Docker技術交流群交流Docker的最佳實踐,QQ群號:365601355。470910357.

1. 背景

1.1. 由PaaS到Container

2013年2月,前Gluster的CEO Ben Golub和dotCloud的CEO Solomon Hykes坐在一起聊天時,Solomon談到想把dotCloud內部使用的Container容器技術單獨拿出來開源,然後圍繞這個技術開一家新公司提供技術支援。28歲的Solomon在使用python開發dotCloud的PaaS雲時發現,使用 LXC(Linux Container) 技術可以打破產品釋出過程中應用開發工程師和系統工程師兩者之間無法輕鬆協作釋出產品的難題。這個Container容器技術可以把開發者從日常部署應用的繁雜工作中解脫出來,讓開發者能專心寫好程式;從系統工程師的角度來看也是一樣,他們迫切需要從各種混亂的部署文件中解脫出來,讓系統工程師專注在應用的水平擴充套件、穩定釋出的解決方案上。他們越深入交談,越覺得這是一次雲技術的變革,緊接著在2013年3月Docker 0.1釋出,拉開了基於雲端計算平臺釋出產品方式的變革序幕。

1.2 Docker簡介

Docker 是 Docker.Inc 公司開源的一個基於 LXC技術之上構建的Container容器引擎, 原始碼託管在 GitHub 上, 基於Go語言並遵從Apache2.0協議開源。 Docker在2014年6月召開DockerConf 2014技術大會吸引了IBM、Google、RedHat等業界知名公司的關注和技術支援,無論是從 GitHub 上的程式碼活躍度,還是Redhat宣佈在RHEL7中正式支援Docker, 都給業界一個訊號,這是一項創新型的技術解決方案。 就連 Google 公司的 Compute Engine 也支援 docker 在其之上執行

, 國內“BAT”先鋒企業百度Baidu App Engine(BAE)平臺也是以Docker作為其PaaS雲基礎

Docker產生的目的就是為了解決以下問題:

1) 環境管理複雜: 從各種OS到各種中介軟體再到各種App,一款產品能夠成功釋出,作為開發者需要關心的東西太多,且難於管理,這個問題在軟體行業中普遍存在並需要直接面對。Docker可以簡化部署多種應用例項工作,比如Web應用、後臺應用、資料庫應用、大資料應用比如Hadoop叢集、訊息佇列等等都可以打包成一個Image部署。如圖所示:

2) 雲端計算時代的到來: AWS的成功, 引導開發者將應用轉移到雲上, 解決了硬體管理的問題,然而軟體配置和管理相關的問題依然存在 (AWS cloudformation是這個方向的業界標準, 樣例模板可參考這裡)。Docker的出現正好能幫助軟體開發者開闊思路,嘗試新的軟體管理方法來解決這個問題。

3) 虛擬化手段的變化: 雲時代採用標配硬體來降低成本,採用虛擬化手段來滿足使用者按需分配的資源需求以及保證可用性和隔離性。然而無論是KVM還是Xen,在 Docker 看來都在浪費資源,因為使用者需要的是高效執行環境而非OS, GuestOS既浪費資源又難於管理, 更加輕量級的LXC更加靈活和快速。如圖所示:

4) LXC的便攜性: LXC在 Linux 2.6 的 Kernel 裡就已經存在了,但是其設計之初並非為雲端計算考慮的,缺少標準化的描述手段和容器的可便攜性,決定其構建出的環境難於分發和標準化管理(相對於KVM之類image和snapshot的概念)。Docker就在這個問題上做出了實質性的創新方法。

1.3 Docker的Hello World

以Fedora 20作為主機為例,直接安裝docker-io:

$ sudo yum -y install docker-io

啟動docker後臺Daemon:

$ sudo systemctl start docker

跑我們第一個Hello World容器:

$ sudo docker run -i -t fedora /bin/echo hello world
Hello world

可以看到在執行命令列後的下一行會打印出經典的Hello World字串。

2. 核心技術預覽

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官方文件

3. 最新子專案介紹

我們再來看看Docker社群還有哪些子專案值得我們去好好研究和學習。基於這個目的,我把有趣的核心專案給大家羅列出來,讓熱心的讀者能快速跟進自己感興趣的專案:

  1. Libswarm,是Solomon Hykes (Docker的CTO) 在DockerCon 2014峰會上向社群介紹的新“樂高積木”工具: 它是用來統一分散式系統的網路介面的API。Libswarm要解決的問題是,基於Docker構建的分散式應用已經催生了多個基於Docker的服務發現(Serivce Discovery)專案,例如etcd, fleet, geard, mesos, shipyard, serf等等,每一套解決方案都有自己的通訊協議和使用方法,使用其中的任意一款都會侷限在某一個特定的技術範圍內。所以Docker的CTO就想用libswarm暴露出通用的API介面給分散式系統使用,打破既定的協議限制。目前專案還在早期發展階段,值得參與。
  2. Libchan,是一個底層的網路庫,為上層 Libswarm 提供支援。相當於給Docker加上了ZeroMQ或RabbitMQ,這裡自己實現網路庫的好處是對Docker做了特別優化,更加輕量級。一般開發者不會直接用到它,大家更多的還是使用Libswarm來和容器互動。喜歡底層實現的網路工程師可能對此感興趣,不妨一看。
  3. Libcontainer,Docker技術的核心部分,單獨列出來也是因為這一塊的功能相對獨立,功能程式碼的迭代升級非常快。想了解Docker最新的支援特性應該多關注這個模組。

4. 總結

Docker社群一直在面對技術挑戰,從容地給出自己的解決方案。雲計算髮展至今,有很多重要的問題沒有得到妥善解決,Docker正在嘗試讓主流廠商接受並應用它。至此,以上Docker技術的預覽到此告一段落,筆者也希望讀者能結合自己的實際情況,嘗試使用Docker技術。因為只有在親自體會的基礎之上,像Docker這樣的雲技術才會產生更大的價值。

5. 作者簡介

肖德時, Red Hat Engineering Service/HSS 內部工具組Team Lead. Nodejs開源專案nodejs-cantas Lead Developer。擅長企業內部工具的設計以及實現。開源課程Rails Starter的發起人。rubygem: lazy_high_charts的Maintainer。twitter賬號:xds2000,郵箱:[email protected]

6. 參考文獻:

感謝郭蕾對本文的審校。

給InfoQ中文站投稿或者參與內容翻譯工作,請郵件至[email protected]。也歡迎大家通過新浪微博(@InfoQ)或者騰訊微博(@InfoQ)關注我們,並與我們的編輯和其他讀者朋友交流。


相關推薦

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

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

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) 每個使用者例

消息: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的飛速發展和使用,每月我們都有近十萬的新增訂閱量。然而,我們也了解到還有很多企業在完全移到公有雲這點上

1.移動端圖片

# 安裝 npm install vue-photo-preview --save # 引入 import preview from 'vue-photo-preview' import 'vue-photo-preview/dist/skin.css' Vue.use(p

[從零開始學Docker]1. Docker是什麼?為什麼要使用Docker

前言 Docker是什麼? Docker 是一個開源的應用容器引擎,你可以將其理解為一個輕量級的虛擬機器,開發者可以打包他們的應用以及依賴包到一個可移植的容器中,然後釋出到任何流行的 Linux 機器上。 為什麼要使用Docker,Docker的好

基於MPP架構的TERADATA技術

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

Elasticsearch核心技術(1)--- Docker容器中執行ES、Kibana、Cerebro

Docker容器中執行ES,Kibana,Cerebro和Logstash安裝與資料匯入ES 想加強ES有關的知識,看了阮一鳴老師講的《Elasticsearch核心技術與實戰》收穫很大,所以接下來會跟著他來更加深入的學習ES。 這篇部落格的目的就是部署好ES和跟ES相關的輔助工具,同時通過Logstash

深入淺出”來解讀Docker網絡核心原理

docker docker容器 docker network docker網絡原理 甘兵 前言 之前筆者寫了有些關於dokcer的各種相關技術的文章,唯獨Docker網絡這一塊沒有具體的來分享。後期筆者會陸續更新Docker集群以及Docker高級實踐的文章,所以在此之前必須要和大家一起

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學習總結】1.Docker容器技術介紹

一般來說,我們編寫好的應用程式,需要部署在響應的伺服器中,而伺服器則是一臺安裝了OS作業系統的計算機。 在該計算機中,執行我們的應用程式,通過網路對外提供服務。期間我們的應用程式在不停的使用伺服器計算機的軟體 和硬體,來滿足它的計算和執行。 在介紹Docker之前,我們先來介紹一下容器技術。

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新增 資料卷容器

1.01 容器技術docker簡介

1.部署演變 在一臺物理機部署Application 在windows或者linux作業系統部署Application Operating System作業系統如win10,Physical server如機器 部署比較慢,要準備物理伺服器

Docker學習(2)-核心技術

Docker學習(1)-Docker思想以及解決了什麼問題   一句話概括:去倉庫把映象拉到本地,然後用一條命令把映象執行起來,變成容器。   Build:構建映象 Ship:運輸映象 Run:執行映象 1.Docker映象(集裝箱)1   映象就是一系列