国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

Docker核心技術(shù)預(yù)覽【轉(zhuǎn)+改】

Batkid / 479人閱讀

摘要:一般的硬件虛擬化方法給出的方法是,而給出的方法是,更細(xì)一點講就是。在中,并不能像硬件虛擬化方案一樣能夠定義能力,但是能夠定義輪轉(zhuǎn)的優(yōu)先級,因此具有較高優(yōu)先級的進(jìn)程會更可能得到運算。

本文簡單介紹docker使用到的部分核心技術(shù),但不做深入探究,因為每一個技術(shù)都是一個獨立的項目,有機會再分別詳細(xì)介紹。
來源地址:http://www.infoq.com/cn/articles/docker-core-technology-preview

Linux Namespace (實例隔離)
  

The purpose of each namespace is to wrap a particular global system resource in an abstraction that makes it appear to the processes within the namespace that they have their own isolated instance of the global resource.

每個用戶實例之間相互隔離,互不影響。一般的硬件虛擬化方法給出的方法是VM,而LXC給出的方法是container,更細(xì)一點講就是kernel namespace。其中pid、net、ipc、mnt、uts、user等namespace將container的進(jìn)程、網(wǎng)絡(luò)、消息、文件系統(tǒng)、UTS("UNIX Time-sharing System")和用戶空間隔離開。

pid namespace

不同用戶的進(jìn)程就是通過pid namespace隔離開的,且不同 namespace 中可以有相同pid。所有的LXC進(jìn)程在docker中的父進(jìn)程為docker進(jìn)程,每個lxc進(jìn)程具有不同的namespace。同時由于允許嵌套,因此可以很方便的實現(xiàn) Docker in Docker。

** net namespace **

有了 pid namespace, 每個namespace中的pid能夠相互隔離,但是網(wǎng)絡(luò)端口還是共享host的端口。網(wǎng)絡(luò)隔離是通過net namespace實現(xiàn)的, 每個net namespace有獨立的 network devices, IP addresses, IP routing tables, /proc/net 目錄。這樣每個container的網(wǎng)絡(luò)就能隔離開來。LXC在此基礎(chǔ)上有5種網(wǎng)絡(luò)類型,docker默認(rèn)采用veth的方式將container中的虛擬網(wǎng)卡同host上的一個docker bridge—docker0連接在一起。

** ipc namespace **

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

** mnt namespace **

類似chroot,將一個進(jìn)程放到一個特定的目錄執(zhí)行。mnt namespace允許不同namespace的進(jìn)程看到的文件結(jié)構(gòu)不同,這樣每個 namespace 中的進(jìn)程所看到的文件目錄就被隔離開了。同chroot不同,每個namespace中的container在/proc/mounts`的信息只包含所在namespace的mount point。

** uts namespace **

UTS("UNIX Time-sharing System") namespace允許每個container擁有獨立的hostname和domain name, 使其在網(wǎng)絡(luò)上可以被視作一個獨立的節(jié)點而非Host上的一個進(jìn)程。

** user namespace **

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

有了以上6種namespace從進(jìn)程、網(wǎng)絡(luò)、IPC、文件系統(tǒng)、UTS和用戶角度的隔離,一個container就可以對外展現(xiàn)出一個獨立計算機的能力,并且不同container從OS層面實現(xiàn)了隔離。 然而不同namespace之間資源還是相互競爭的,仍然需要類似ulimit來管理每個container所能使用的資源——LXC 采用的是cgroup。

參考

PaaS under the hood, episode 1: kernel namespaces, [中文]

http://blog.blackwhite.tw/2013/12/docker.html

cgroup (資源配額)

cgroups 實現(xiàn)了對資源的配額和度量。cgroups 的使用非常簡單,提供類似文件的接口,在 /cgroup目錄下新建一個文件夾即可新建一個group,在此文件夾中新建task文件,并將pid寫入該文件,即可實現(xiàn)對該進(jìn)程的資源控制。具體的資源配置選項可以在該文件夾中新建子subsystem,{子系統(tǒng)前綴}.{資源項} 是典型的配置方法, 如memory.usage_in_bytes就定義了該group 在subsystem memory中的一個內(nèi)存限制選項。

我們主要關(guān)心cgroups可以限制哪些資源,即有哪些subsystem是我們關(guān)心。

cpu
在cgroup中,并不能像硬件虛擬化方案一樣能夠定義CPU能力,但是能夠定義CPU輪轉(zhuǎn)的優(yōu)先級,因此具有較高CPU優(yōu)先級的進(jìn)程會更可能得到CPU運算。 通過將參數(shù)寫入cpu.shares,即可定義改cgroup的CPU優(yōu)先級 - 這里是一個相對權(quán)重,而非絕對值。當(dāng)然在cpu這個subsystem中還有其他可配置項,手冊中有詳細(xì)說明。

cpuacct
產(chǎn)生cgroup任務(wù)的cpu資源報告

cpuset
cpusets 定義了有幾個CPU可以被這個group使用,或者哪幾個CPU可以供這個group使用。在某些場景下,單CPU綁定可以防止多核間緩存切換,從而提高效率

memory
設(shè)置每個cgroup的內(nèi)存限制以及產(chǎn)生內(nèi)存資源報告

blkio
block IO相關(guān)的統(tǒng)計和限制,byte/operation統(tǒng)計和限制(IOPS等),讀寫速度限制等,但是這里主要統(tǒng)計的都是同步IO

net_cls
標(biāo)記每個網(wǎng)絡(luò)包以供cgroup方便使用

devices
允許或拒絕cgroup任務(wù)對設(shè)備的訪問

freezer
暫停和恢復(fù)cgroup任務(wù)

參考

PaaS Under the Hood, Episode 2: cgroups

https://www.kernel.org/doc/Documentation/cgroups/

http://en.wikipedia.org/wiki/Cgroups

LXC(LinuX Container)
  

LXC (LinuX Container) is an operating system-level virtualization method for running multiple isolated Linux systems (containers) on a single control host. This is accomplished through kernel level isolation.

借助于namespace的隔離機制和cgroup限額功能,LXC提供了一套統(tǒng)一的API和工具來建立和管理container,LXC利用了如下 kernel 的特性:

Kernel namespaces (ipc, uts, mount, pid, network and user)

Apparmor and SELinux profiles (security)

Seccomp policies

Chroots (using pivot_root)

Kernel capabilities

Control groups (cgroups)

LXC 旨在提供一個共享kernel的 OS 級虛擬化方法,在執(zhí)行時不用重復(fù)加載Kernel,且container的kernel與host共享,因此可以大大加快container的 啟動過程,并顯著減少內(nèi)存消耗。

這篇stackoverflow上的問題和答案很好地詮釋了Docker和LXC的區(qū)別,能夠讓你更好的了解什么是Docker, 簡單翻譯下就是以下幾點:

Portable deployment across machines
Docker提供了一種可移植的配置標(biāo)準(zhǔn)化機制,允許你一致性地在不同的機器上運行同一個Container;而LXC本身可能因為不同機器的不同配置而無法方便地移植運行;

Application-centric
Docker以App為中心,為應(yīng)用的部署做了很多優(yōu)化,而LXC的幫助腳本主要是聚焦于如何機器啟動地更快和耗更少的內(nèi)存;

Automatic build
Docker為App提供了一種自動化構(gòu)建機制(Dockerfile),包括打包,基礎(chǔ)設(shè)施依賴管理和安裝等等;

Versioning
Docker提供了一種類似git的Container版本化的機制,允許你對你創(chuàng)建過的容器進(jìn)行版本管理,依靠這種機制,你還可以下載別人創(chuàng)建的Container,甚至像git那樣進(jìn)行合并;

Component reuse
Docker Container是可重用的,依賴于版本化機制,你很容易重用別人的Container(叫Image),作為基礎(chǔ)版本進(jìn)行擴(kuò)展;

Sharing
Docker Container是可共享的,有點類似github一樣,Docker有自己的INDEX,你可以創(chuàng)建自己的Docker用戶并上傳和下載Docker Image;

Tool ecosystem
Docker提供了很多的工具鏈,形成了一個生態(tài)系統(tǒng);這些工具的目標(biāo)是自動化、個性化和集成化,包括對PAAS平臺的支持等。

參考

http://linuxcontainers.org/

http://en.wikipedia.org/wiki/LXC

http://marceloneves.org/papers/pdp2013-containers.pdf (性能測試)

http://article.sciencepublishinggroup.com/pdf/10.11648.j.ajnc.20130204.11.pdf

AUFS

Docker對container的使用基本是建立在LXC基礎(chǔ)之上的,然而LXC存在的問題是難以移動——難以通過標(biāo)準(zhǔn)化的模板制作、重建、復(fù)制和移動 container。在以VM為基礎(chǔ)的虛擬化手段中,有image和snapshot可以用于VM的復(fù)制、重建以及移動的功能。想要通過container來實現(xiàn)快速的大規(guī)模部署和更新, 這些功能不可或缺。Docker正是利用AUFS來實現(xiàn)對container的快速更新——在docker0.7中引入了storage driver, 支持AUFS, VFS, device mapper, 也為BTRFS以及ZFS引入提供了可能。

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

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

bootfs(boot file system)主要包含 bootloader 和 kernel, bootloader主要是引導(dǎo)加載kernel, 當(dāng)boot成功后 kernel 被加載到內(nèi)存中后 bootfs就被umount了。rootfs (root file system) 包含的就是典型 Linux 系統(tǒng)中的 /dev, /proc, /bin, /etc等標(biāo)準(zhǔn)目錄和文件。

由此可見對于不同的linux發(fā)行版, bootfs基本是一致的, rootfs會有差別, 因此不同的發(fā)行版可以公用bootfs 如下圖:

典型的Linux在啟動后,首先將 rootfs 置為 readonly,進(jìn)行一系列檢查,然后將其切換為 "readwrite" 供用戶使用。在docker中,起初也是將 rootfs 以readonly方式加載并檢查,然而接下來利用 union mount 的將一個 readwrite 文件系統(tǒng)掛載在 readonly 的rootfs之上,并且允許再次將下層的 file system設(shè)定為readonly 并且向上疊加,這樣一組readonly和一個writeable的結(jié)構(gòu)構(gòu)成一個container的運行目錄,每一個被稱作一個Layer。如下圖:

得益于AUFS的特性,每一個對readonly層文件/目錄的修改都只會存在于上層的writeable層中。這樣由于不存在競爭,多個container可以共享readonly的layer。所以docker將readonly的層稱作 "image"——對于container而言整個rootfs都是read-write的,但事實上所有的修改都寫入最上層的writeable層中,image不保存用戶狀態(tài),可以用于模板、重建和復(fù)制。


上層的image依賴下層的image,因此docker中把下層的image稱作父image,沒有父image的image稱作base image。

因此想要從一個image啟動一個container,docker會先加載其父image直到base image,用戶的進(jìn)程運行在writeable的layer中。所有parent image中的數(shù)據(jù)信息以及 ID、網(wǎng)絡(luò)和lxc管理的資源限制等具體container的配置,構(gòu)成一個docker概念上的container。如下圖:

由此可見,采用AUFS作為docker的container的文件系統(tǒng),能夠提供如下好處:

節(jié)省存儲空間:多個container可以共享base image存儲

快速部署:如果要部署多個container,base image可以避免多次拷貝

內(nèi)存更?。阂驗槎鄠€container共享base image, 以及OS的disk緩存機制,多個container中的進(jìn)程命中緩存內(nèi)容的幾率大大增加

升級更方便:相比于 copy-on-write 類型的FS,base-image也是可以掛載為可writeable的,可以通過更新base image而一次性更新其之上的container

允許在不更改base-image的同時修改其目錄中的文件:所有寫操作都發(fā)生在最上層的writeable層中,這樣可以大大增加base image能共享的文件內(nèi)容。

以上5條 1-3 條可以通過 copy-on-write 的FS實現(xiàn),4可以利用其他的union mount方式實現(xiàn), 5只有AUFS實現(xiàn)的很好,這也是為什么Docker一開始就建立在AUFS之上。

由于AUFS并不會進(jìn)入linux主干 (According to Christoph Hellwig, linux rejects all union-type filesystems but UnionMount.), 同時要求kernel版本3.0以上(docker推薦3.8及以上),因此在RedHat工程師的幫助下在docker0.7版本中實現(xiàn)了driver機制, AUFS只是其中的一個driver, 在RHEL中采用的則是Device Mapper的方式實現(xiàn)的container文件系統(tǒng)。

參考

PAAS Under the Hood, Episode 3: AUFS

http://docs.docker.com/terms/layer/

http://docs.docker.com/terms/filesystem/

全文參考

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

https://docker.cn/a/1

http://blog.dotcloud.com/category/under-the-hood

http://www.slideshare.net/BodenRussell/realizing-linux-containerslxc


原文鏈接地址:http://seanlook.com/2014/12/18/docker-core-technology-preview/


文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/26369.html

相關(guān)文章

  • 數(shù)人云CTO解讀Docker 1.12和金融業(yè)容器化

    摘要:月日數(shù)人云在上海舉辦金融沙龍,邀請上交所和近二十家來自銀行保險證券的技術(shù)專家一同探討容器技術(shù)在金融業(yè)中的最佳實踐。數(shù)人云肖德時在會上將傳統(tǒng)金融行業(yè)通過容器可以解決的四大問題做了逐一解讀。如何動態(tài)的分配,就是剛才上交所介紹的一些治理的方法。 7月29日數(shù)人云在上海舉辦金融沙龍,邀請上交所和近二十家來自銀行、保險、證券的IT技術(shù)專家一同探討容器技術(shù)在金融業(yè)中的最佳實踐。數(shù)人云CTO肖德時在...

    Gemini 評論0 收藏0
  • Windows Server2016上Docker Engine技術(shù)預(yù)覽版介紹

    摘要:通過這個過程,我們已經(jīng)與微軟開發(fā)人員密切合作。兩個世界的碰撞這項工作始于年月,對于一個開源項目,它讓我們保持與微軟不可思議的互動。對于容器,微軟團(tuán)隊將其融入。 作為Docker Engine團(tuán)隊的核心工程師,我在Linux上自然花了大部分時間。這種情況最近已經(jīng)改變:今年4月,我們發(fā)布了一個Docker客戶端的Windows版本。通過這個過程,我們已經(jīng)與微軟開發(fā)人員密切合作。 我被問到的...

    張紅新 評論0 收藏0
  • 容器化 — 基于Docker技術(shù)容器云

    摘要:導(dǎo)讀本文介紹了基于技術(shù)的企業(yè)級應(yīng)用容器平臺,從云的定義云服務(wù)分類,到用友云基礎(chǔ)平臺平臺總體架構(gòu)架構(gòu)預(yù)覽部署架構(gòu)平臺核心價值和核心競爭力,闡述基礎(chǔ)平臺成為廣大傳統(tǒng)企業(yè)數(shù)字化轉(zhuǎn)型的一把尖刀。   導(dǎo)讀:本文介紹了基于Docker技術(shù)的企業(yè)級應(yīng)用容器平臺,從云的定義、云服務(wù)分類,到用友云PaaS基礎(chǔ)平臺、平臺總體架構(gòu)、架構(gòu)預(yù)覽、部署架構(gòu)、平臺核心價值和核心競爭力,闡述PaaS基礎(chǔ)平臺成為廣大...

    wapeyang 評論0 收藏0
  • 轉(zhuǎn)Docker那些事(一)

    摘要:而實際上在宿主機中也會同步啟動一個進(jìn)程,其在宿主機中是。如果其中的某一個容器正在執(zhí)行密集型的任務(wù),那么它就會影響其他容器的任務(wù)執(zhí)行效率,導(dǎo)致多個容器相互影響并且搶占資源。 作者:榮幸 為什么是容器 如果問你現(xiàn)在最熱門的服務(wù)器端技術(shù)什么?想必很多人會不假思索的說是容器! 容器技術(shù)實際上并不是一個新鮮的名詞,現(xiàn)在大家一提到容器馬上想到的就是Docker,但是容器這個詞并不是Docker公司...

    William_Sang 評論0 收藏0
  • 關(guān)于微軟容器戰(zhàn)略,你需要知道的十件事

    摘要:自從微軟和宣布合作以來,微軟一直在容器上面的戰(zhàn)略可謂穩(wěn)扎穩(wěn)打。最近,微軟加入,并作為創(chuàng)始成員承諾支持常見容器的格式和運行。這種定位導(dǎo)致大家對于微軟容器戰(zhàn)略的認(rèn)識模糊。微軟的容器策略并不是可移植性說的直白一點。 自從微軟和Docker宣布合作以來,微軟Redmond一直在容器上面的戰(zhàn)略可謂穩(wěn)扎穩(wěn)打。最近,微軟加入Open Container Initiative (OCI),并作為創(chuàng)始成...

    Kerr1Gan 評論0 收藏0

發(fā)表評論

0條評論

Batkid

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<