Docker應(yīng)用及核心技術(shù)_第1頁
Docker應(yīng)用及核心技術(shù)_第2頁
Docker應(yīng)用及核心技術(shù)_第3頁
Docker應(yīng)用及核心技術(shù)_第4頁
Docker應(yīng)用及核心技術(shù)_第5頁
已閱讀5頁,還剩29頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

Docker應(yīng)用及核心技術(shù)鄧云鵬

營銷研發(fā)部2016年08月

目錄Docker應(yīng)用簡介Docker簡介Docker應(yīng)用Docker使用場景Docker核心技術(shù)CgroupLinuxNamespace文件系統(tǒng)Aufs和DeviceMapper其他關(guān)鍵技術(shù)Docker生態(tài)圈現(xiàn)狀及開展

1.1、Docker簡介Docker是Docker.Inc公司開源的一個基于LXC技術(shù)之上構(gòu)建的Container容器引擎,源代碼托管在GitHub上,基于Go語言并遵從Apache2.0協(xié)議開源協(xié)議。

1.1Docker運(yùn)行結(jié)構(gòu)

Docker使用客戶端-效勞器(C/S)架構(gòu)模式,使用遠(yuǎn)程API來管理和創(chuàng)立Docker容器。Docker容器通過Docker鏡像來創(chuàng)立。C/S架構(gòu)Dockerdaemon作為效勞端接受來自客戶的請求,并處理這些請求〔創(chuàng)立、運(yùn)行、分發(fā)容器〕??蛻舳撕托诙思瓤梢赃\(yùn)行在一個機(jī)器上,也可通過socket或者RESTfulAPI來進(jìn)行通信。Dockerdaemon一般在宿主主機(jī)后臺運(yùn)行,等待接收來自客戶端的消息。Docker客戶端那么為用戶提供一系列可執(zhí)行命令,用戶用這些命令實(shí)現(xiàn)跟Dockerdaemon交互。1.1Docker根本元素Docker鏡像Docker鏡像是Docker容器運(yùn)行時的只讀模板,每一個鏡像由一系列的層(layers)組成。Docker使用UnionFS來將這些層聯(lián)合到單獨(dú)的鏡像中。Docker倉庫Docker倉庫用來保存鏡像,可以理解為代碼控制中的代碼倉庫。Docker倉庫也有公有和私有的概念,公有的Docker倉庫是DockerHub。Docker容器一個Docker容器包含了所有的某個應(yīng)用運(yùn)行所需要的環(huán)境。每一個Docker容器都是從Docker鏡像創(chuàng)建的。每一個Docker容器都是獨(dú)立和安全的應(yīng)用平臺,Docker容器是Docker的運(yùn)行部分。1.2

Docker命令國內(nèi)下載安裝Docker,可參考://啟動dockerdaemon:docker-d-bip/24&從共有倉庫搜索鏡像:docker

search

ubuntu

dockersearch–s100ubuntu#查找星表個數(shù)大于100的鏡像,一般認(rèn)為是官方的鏡像。獲取鏡像:docker

pull

ubuntu列出當(dāng)前鏡像列表:dockerimages列出鏡像歷史: dockerhistory刪除鏡像Dockerrmi1.2

Docker命令運(yùn)行容器:dockerrundockerrun–i-t<imageid>命令行方式交互模式啟動鏡像。dockerrun–d<imageid>daemon方式運(yùn)行鏡像dockerrun–itd–p80:8080<imageid>把宿主機(jī)的80端口映射到啟動容器的8080端口。dockerrun–itd–P<imageid>自動映射容器對外提供效勞的全部端口。dockerrun-itd–name=dennis_machine–hmyhost<imageid>給啟動的容易命名為dennis_machine,制定容器的hostname為myhostdockerrun–itd-v/mnt:/mnt<imageid>把宿主機(jī)的/mnt目錄mount到容器的/mnt目錄dockerrun–itd–net=bridge<imageid>啟動容器使用虛擬網(wǎng)橋模式。Dockerrun–td–namenew_machine–linkdennis_machine<imageid>啟動容期間聯(lián)結(jié),新容器new_machine能直接訪問dennis_machine中的效勞。1.2Docker

命令dockerstart#運(yùn)行一個或多個停止的容器dockerstop#停掉一個或多個運(yùn)行的容器-t選項(xiàng)可指定超時時間dockerrestart#重啟一個或多個運(yùn)行的容器dockerpause#暫停一個容器dockerunpause#繼續(xù)暫停的容器dockerrm#移除一個或多個容器dockercommit#提交指定容器為鏡像dockerinspect#查看容器或者鏡像的詳細(xì)信息dockerexec#在一個容器上執(zhí)行一個命令dockerlogin#docker用戶注冊或者登錄dockerlogout#docker用戶注銷dockerpush#上傳image到dockerregistry

1.2

Dockfile和docker

build Dockerfile是一個包含創(chuàng)立鏡像所有命令的文本文件,通過dockerbuild命令可以根據(jù)Dockerfile的內(nèi)容構(gòu)建鏡像.Dockerfile指令選項(xiàng):FROM指定構(gòu)建鏡像的基礎(chǔ)源鏡像,FROM必須是Dockerfile

中非注釋行的第一個指令MAINTAINER指定創(chuàng)建鏡像的用戶RUN在當(dāng)前鏡像基礎(chǔ)上執(zhí)行指定命令,并提交為新的鏡像CMD語法和RUN類似,但在Dockerfile

中只能使用一次,如果有多個,則只有最后一個會生效。CMD只在啟動容器的時候執(zhí)行,而RUN只在build的時候執(zhí)行。EXPOSE告訴Docker

服務(wù)端容器對外映射的本地端口ENV指定一個環(huán)節(jié)變量ADD復(fù)制本地主機(jī)文件、目錄或者遠(yuǎn)程文件到容器指定路徑COPY用法同ADD,唯一的不同是不能指定遠(yuǎn)程文件URLSENTRYPOINT配置容器啟動后執(zhí)行的命令,并且不可被Docker

run

提供的參數(shù)覆蓋,而CMD是可以被覆蓋的。VOLUME創(chuàng)建一個可以從本地主機(jī)的掛載點(diǎn)USER指定運(yùn)行容器時的用戶名或UIDWORKDIR為后續(xù)的RUN、CMD、ENTRYPOINT指令配置工作目錄。DockerFile例如#NginxFROMubuntuMAINTAINERDennisDengdennis_deng@docker#installsoftwaresRUNapt-getupdate&&apt-getinstall-yinotify-toolsnginxapache2openssh-server#expose80and443porttohostmachineEXPOSE80443#mounthostmachine‘sdirectoriesVOLUME["/var/www","/var/log/apache2","/etc/apache2"]#theapacheafterthecontainerstartupsENTRYPOINT["/usr/sbin/apache2ctl","-D","FOREGROUND"]1.3DockerVSVM

1.3Docker應(yīng)用場景以下是Docker官方給出的應(yīng)用場景 Automatingthepackaginganddeploymentofapplications Creationoflightweight,privatePAASenvironments Automatedtestingandcontinuousintegration/deployment

Deployingandscalingwebapps,databasesandbackendservices

二、Docker核心技術(shù) Docker

0.9

版本開始使用

libcontainer

替代了lxc,libcontainer幾乎囊括了docker的全部核心技術(shù)。

2.1

Cgroup簡介 Cgroups是controlgroups的縮寫,是Linux內(nèi)核提供的一種可以限制、記錄、隔離進(jìn)程組〔processgroups〕所使用的物理資源〔如:cpu,memory,IO等等〕的機(jī)制。最初由google的工程師提出,后來被整合進(jìn)Linux內(nèi)核。Cgroups也是LXC為實(shí)現(xiàn)虛擬化所使用的資源管理手段,可以說沒有cgroups就沒有LXC。1.限制進(jìn)程組可以使用的資源數(shù)量〔Resourcelimiting〕。比方:memory子系統(tǒng)可以為進(jìn)程組設(shè)定一個memory使用上限,一旦進(jìn)程組使用的內(nèi)存到達(dá)限額再申請內(nèi)存,就會觸發(fā)OOM。2.進(jìn)程組的優(yōu)先級控制〔Prioritization〕。比方:可以使用cpu子系統(tǒng)為某個進(jìn)程組分配特定cpushare。3.記錄進(jìn)程組使用的資源數(shù)量〔Accounting〕。比方:可以使用cpuacct子系統(tǒng)記錄某個進(jìn)程組使用的cpu時間4.進(jìn)程組隔離〔Isolation〕。比方:使用ns子系統(tǒng)可以使不同的進(jìn)程組使用不同的namespace,以到達(dá)隔離的目的,不同的進(jìn)程組有各自的進(jìn)程、網(wǎng)絡(luò)、文件系統(tǒng)掛載空間。5.進(jìn)程組控制〔Control〕。比方:使用freezer子系統(tǒng)可以將進(jìn)程組掛起和恢復(fù)。 Cgroups的使用簡單,提供類似文件的接口,在/cgroup目錄下新建一個文件夾即可新建一個group,在此文件夾中新建task文件,并將pid寫入該文件,即可實(shí)現(xiàn)對該進(jìn)程的資源控制。

2.1Cgroup子系統(tǒng)子系統(tǒng)描述blkio為塊設(shè)備設(shè)定輸入/輸出限制,比如物理設(shè)備(磁盤,固態(tài)硬盤,USB等等)cpu調(diào)度程序提供對CPU的cgroup任務(wù)訪問。cpuacct自動生成cgroup中任務(wù)所使用的CPU報告cpuset為cgroup中的任務(wù)分配獨(dú)立CPU(在多核系統(tǒng))和內(nèi)存節(jié)點(diǎn)。devices允許或者拒絕cgroup中的任務(wù)訪問設(shè)備freezer掛起或者恢復(fù)cgroup中的任務(wù)。memory設(shè)定cgroup中任務(wù)使用的內(nèi)存限制,并自動生成由那些任務(wù)使用的內(nèi)存資源報告。net_cls使用等級識別符(classid)標(biāo)記網(wǎng)絡(luò)數(shù)據(jù)包,可允許Linux流量控制程序(tc)識別從具體cgroup中生成的數(shù)據(jù)包。ns名稱空間子系統(tǒng)2.1DockerCgroup例如dockerrun-tid–cpu-shares100ubuntu:指定容器進(jìn)程對CPU使用的權(quán)制(相對數(shù)值).dockerrun-tid–cpu-period100000–cpu-quota200000ubuntu:指定該容器在1秒的時間間隔內(nèi),最多使用0.2秒的cpu.〔period和quota都是微秒單位,絕對值〕。dockerrun-tid–namecpu1–cpuset-cpus0-2ubuntu表示創(chuàng)立的容器只能用0、1、2這三個內(nèi)核。dockerrun-tid—namemem1—memory128mubuntu限制容器最多使用128M的內(nèi)存。dockerrun-tid–namedisk1–device-write-bps/dev/sda:1mbubuntu限制容器的指定磁盤的寫入速度不超過1Mbytes/秒2.2

LinuxNamespace

個用戶實(shí)例之間相互隔離,互不影響。一般的硬件虛擬化方法給出的方法是VM,而LXC給出的方法是container,更細(xì)一點(diǎn)講就是kernelnamespace。其中pid、net、ipc、mnt、uts、user等namespace將container的進(jìn)程、網(wǎng)絡(luò)、消息、文件系統(tǒng)、UTS(“UNIXTime-sharingSystem”)和用戶空間隔離開。pidnamespace不同用戶的進(jìn)程就是通過pidnamespace隔離開的,且不同namespace中可以有相同pid。所有的Container進(jìn)程在docker中的父進(jìn)程為docker進(jìn)程,每個container進(jìn)程具有不同的namespace。允許嵌套,可以實(shí)現(xiàn)DockerinDocker。netnamespace網(wǎng)絡(luò)隔離是通過netnamespace實(shí)現(xiàn)的,每個netnamespace有獨(dú)立的networkdevices,IPaddresses,IProutingtables,/proc/net目錄。docker默認(rèn)采用veth的方式將container中的虛擬網(wǎng)卡同host上的一個dockerbridge:docker0連接在一起。ipcnamespacecontainer中進(jìn)程交互還是采用linux常見的進(jìn)程間交互方法(iIPC),但加入了namespace信息,每個IPC資源具備獨(dú)立的32位IDmntnamespace類似chroot,將一個進(jìn)程放到一個特定的目錄執(zhí)行。mntnamespace允許不同namespace的進(jìn)程看到的文件結(jié)構(gòu)不同,這樣每個namespace中的進(jìn)程所看到的文件目錄就被隔離開了。同chroot不同,每個namespace中的container在/proc/mounts的信息只包含所在namespace的mountpoint。utsnamespaceUTS("UNIXTime-sharingSystem")namespace允許每個container擁有獨(dú)立的hostname和domainname,使其在網(wǎng)絡(luò)上可以被視作一個獨(dú)立的節(jié)點(diǎn)而非Host上的一個進(jìn)程。usernamespace每個container可以有不同的user和groupid,也就是說可以在container內(nèi)部用container內(nèi)部的用戶執(zhí)行程序而非Host上的用戶。2.3

Aufs

AUFS(Another

Union

File

System)

簡單說就是一個文件系統(tǒng),可以把不同的目錄聯(lián)合在一起。這種文件系統(tǒng)不用格式化,直接掛載即可。支持將不同目錄掛載到同一個虛擬文件系統(tǒng)下的文件系統(tǒng)AUFS支持為每一個成員目錄設(shè)定readonly、readwrite和whiteout-able權(quán)限.

AUFS里有一個類似分層的概念,對readonly權(quán)限的branch可以邏輯上進(jìn)行修改,通常是把一個readonly的分支和一個writable的分支mount到一起,對writable分支實(shí)現(xiàn)copy-on-write的策略。2.3

Booting

in

Normal

Linux

典型的啟動Linux運(yùn)行需要兩個FS:bootfs+rootfs.

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

Linux在啟動后,首先將rootfs設(shè)置為readonly,進(jìn)行一系列檢查,然后將其切換為"readwrite"供用戶使用。

2.3

Aufs

in

Docker

(1)

在Docker中,初始化時也是將rootfs以readonly方式加載并檢查,然而接下來利用unionmount的方式將一個readwrite文件系統(tǒng)掛載在readonly的rootfs之上,并且允許再次將下層的FS(filesystem)設(shè)定為readonly并且向上疊加,這樣一組readonly和一個writeable的結(jié)構(gòu)構(gòu)成一個container的運(yùn)行時態(tài),每一個FS被稱作一個FS層。2.3

Aufs

in

Docker

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

Aufs

in

Docker

(3)上層的image依賴下層的image,因此Docker中把下層的image稱作父image,沒有父image的image稱作baseimage。因此想要從一個image啟動一個container,Docker會先加載這個image和依賴的父images以及baseimage,用戶的進(jìn)程運(yùn)行在writeable的layer中。所有parentimage中的數(shù)據(jù)信息以及ID、網(wǎng)絡(luò)和lxc管理的資源限制等具體container的配置,構(gòu)成一個Docker概念上的container。2.4

Device

mapperAufs是Docker最初采用的文件系統(tǒng),由于Aufs未能參加到大多Linux的內(nèi)核,考慮到兼容性問題,參加了Devicemapper的支持。目前,除少數(shù)版本如Ubuntu,Docker根本運(yùn)行在Devicemapper根底上。Devicemapper是Linux2.6內(nèi)核中提供的一種從邏輯設(shè)備到物理設(shè)備的映射框架機(jī)制,在該機(jī)制下,用戶可以很方便的根據(jù)自己的需要制定實(shí)現(xiàn)存儲資源的管理策略,當(dāng)前比較流行的Linux下的邏輯卷管理器如LVM2〔LinuxVolumeManager2version)、EVMS(EnterpriseVolumeManagementSystem)、dmraid(DeviceMapperRaidTool)等都是基于該機(jī)制實(shí)現(xiàn)的。

2.4Devicemapper根本概念Devicemapper在內(nèi)核中作為一個塊設(shè)備驅(qū)動被注冊的,它包含三個重要的對象概念:〔1〕mappeddevice:是一個邏輯抽象,可以理解成為內(nèi)核向外提供的邏輯設(shè)備,它通過映射表描述的映射關(guān)系和targetdevice建立映射?!?〕映射表:從Mappeddevice到一個targetdevice的映射表由一個多元組表示,該多元組由表示mappeddevice邏輯的起始地址、范圍、和表示在targetdevice所在物理設(shè)備的地址偏移量以及target類型等變量組成?!?〕targetdevice:是mappeddevice所映射的物理空間段。Devicemapper中這三個對象和targetdriver插件一起構(gòu)成了一個可迭代的設(shè)備樹。在該樹型結(jié)構(gòu)中的頂層根節(jié)點(diǎn)是最終作為邏輯設(shè)備向外提供的mappeddevice,葉子節(jié)點(diǎn)是targetdevice所表示的底層物理設(shè)備。最小的設(shè)備樹由單個mappeddevice和targetdevice組成。每個targetdevice都是被mappeddevice獨(dú)占的,只能被一個mappeddevice使用。一個mappeddevice可以映射到一個或者多個targetdevice上,而一個mappeddevice又可以作為它上層mappeddevice的targetdevice被使用,該層次在理論上可以在devicemapper架構(gòu)下無限迭代下去。2.4Thinly-ProvisionedSnapshotThinly-ProvisionedSnapshot=Snapshot技術(shù)+Thin-ProvisionedSnapshot.Snapshot技術(shù):可以在不中斷效勞運(yùn)行的情況下為邏輯數(shù)據(jù)源創(chuàng)立一個虛擬快照(Snapshot),snapshot只對源數(shù)據(jù)變化的局部做拷備。而對數(shù)據(jù)源進(jìn)行寫入操作的時候,丟棄原始數(shù)據(jù)源。有些Linux內(nèi)核支持把寫入后的數(shù)據(jù)merge到源數(shù)據(jù)。Thin-ProvisionedSnapshot技術(shù):是一項(xiàng)利用虛擬化方法減少物理存儲部署的技術(shù),可最大限度提升存儲空間利用率。

Thin-provisioningSnapshot結(jié)合Thin-Provisioning和Snapshot兩種技術(shù),允許多個虛擬設(shè)備同時掛載到一個數(shù)據(jù)卷以到達(dá)數(shù)據(jù)共享的目的。2.4Device

Mapper

In

Docker

在不支持AUFS的Linux上,Docker使用Device

Mapper技術(shù)實(shí)現(xiàn)和Aufs一樣的功能。在Docker中:

一個Thinly-ProvisionedSnapshot

相當(dāng)于Device

Mapper結(jié)構(gòu)中的一個Target-device.

Snapshot天生的Copy-on-write特性,snapshot相當(dāng)于AUFS的image分層關(guān)系。AUFS是文件級別存儲,而Devicemapper是數(shù)據(jù)塊級存儲。2.4Docker

其他存儲驅(qū)動除了AUFS和DeviceMapper,Docker還支持以下三種存儲驅(qū)動:overlay:Linux內(nèi)核3.18后支持的,也是一種UnionFS,和AUFS的多層不同的是overlay只有兩層:一個upper文件系統(tǒng)和一個lower文件系統(tǒng),分別代表Docker的鏡像層和容器層。Btrfs:被稱為下一代寫時復(fù)制文件系統(tǒng),并入Linux內(nèi)核,也是文件級級存儲,但可以像Devicemapper一直接操作底層設(shè)備。Btrfs把文件系統(tǒng)的一局部配置為一個完整的子文件系統(tǒng),稱之為subvolume。ZFS:文件系統(tǒng)是一個革命性的全新的文件系統(tǒng),它從根本上改變了文件系統(tǒng)的管理方式,ZFS完全拋棄了“卷管理”,不再創(chuàng)立虛擬的卷,而是把所有設(shè)備集中到一個存儲池中來進(jìn)行管理,用“存儲池”的概念來管理物理存儲空間。2.5

NetworkingDokcer

通過使用Linux

橋接提供容器之間的通信,docker0

橋接接口的目的就是方便Docker

管理:

2.5

Networkingdocker

run

創(chuàng)立Docker

容器時,可以用

--net

選項(xiàng)指定容器的網(wǎng)絡(luò)模式,Docker

有以下4

種網(wǎng)絡(luò)模式:Host

模式(--net=host):容器將不會獲得一個獨(dú)立的NetworkNamespace,而是和宿主機(jī)共用一個NetworkNamespace。容器將不會虛擬出自己的網(wǎng)卡,配置自己的IP等,而是使用宿主機(jī)的IP和端口。container模式(--net=container:NAMEorID):這個模式指定新創(chuàng)立的容器和已經(jīng)存在的一個容器共享一個NetworkNamespace,而不是和宿主機(jī)共享。新創(chuàng)立的容器不會創(chuàng)立自己>的網(wǎng)卡,配置自己的IP,而是和一個指定的容器共享IP、端口范圍等。none模式(-net=none):Docker容器擁有自己的NetworkNamespace,但是,并不為Docker容器進(jìn)行任何網(wǎng)絡(luò)配置。bridge模式(--net=bridge):Docker默認(rèn)的網(wǎng)絡(luò)設(shè)置,此模式會為每一個容器分配NetworkNamespace、設(shè)置IP等,并將一個主機(jī)上的Docker容器連接到一個虛擬網(wǎng)橋上。當(dāng)Dockerserver啟動時,會在主機(jī)上創(chuàng)立一個名為docker0的虛擬網(wǎng)橋,此主機(jī)上啟動的Docker容器會連接到這個虛擬網(wǎng)橋上。虛擬網(wǎng)橋的工作方式和物理交換機(jī)類似,這樣主機(jī)上的所有容器就通過交換機(jī)連在了一個二層網(wǎng)絡(luò)中。

2.6

selinux和AppArmorSeli

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論