ker容器技術(shù)與微服務(wù)解決方案_第1頁
ker容器技術(shù)與微服務(wù)解決方案_第2頁
ker容器技術(shù)與微服務(wù)解決方案_第3頁
ker容器技術(shù)與微服務(wù)解決方案_第4頁
ker容器技術(shù)與微服務(wù)解決方案_第5頁
已閱讀5頁,還剩13頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

Docker容器技術(shù)與微服務(wù)解決方案TOC\o"1-5"\h\z、前言 3\o"CurrentDocument"二、容器技術(shù)簡介 3\o"CurrentDocument"三、 Docker簡介 4\o"CurrentDocument"四、Docker的組成 6\o"CurrentDocument"五、Docker的實現(xiàn) 8\o"CurrentDocument"六、Docker的生態(tài)圈 15\o"CurrentDocument"七、總結(jié) 16一、前言Docker是最近在云計算領(lǐng)域出現(xiàn)的新技術(shù)。目前2戊1^「和以其為代表的容器技術(shù)的熱度已經(jīng)改過了之前的OpenStack。Docker以及其所代表的容器技術(shù)的流行,即使因為軟件技術(shù)的進步,更是由于其符合云計算對軟件領(lǐng)域所帶來新思想。在如今的互聯(lián)網(wǎng)和企業(yè)應(yīng)用開發(fā)領(lǐng)域,微服務(wù)和DevOps是兩個思想頗為深入人心。而Docker技術(shù)的出現(xiàn)和其對整個容器技術(shù)及其生態(tài)圈發(fā)展的促進,解決了這個微服務(wù)和DevOps這兩個思想實踐中的很多難題,使得前面兩種思想大規(guī)模地實現(xiàn)成為了可能。所以,我們有必要地深入了解一下Docker這個技術(shù),看看它會對云計算時代的軟件開發(fā)產(chǎn)生什么樣的影響。本文將介紹如下內(nèi)容.什么是容器技術(shù).什么是Docker.Docker是如何實現(xiàn)的.為什么要使用Docker至于Docker的用法,不在這里做介紹。Docker的入門使用,可以前往Docker官網(wǎng)。各種高級用法、技巧、經(jīng)驗,可以前往技術(shù)網(wǎng)站CSDN、InfoQ和CoreOS、CenturylinkLabs等這些使用Docker的云計算廠商的網(wǎng)站。二、容器技術(shù)簡介容器技術(shù)有時會被稱為輕量化虛擬技術(shù)。但不同于基于Hypervisor的傳統(tǒng)虛擬化技術(shù),容器技術(shù)并不會虛擬硬件。容器本身和容器內(nèi)的進程都是運行在宿主Linux系統(tǒng)的內(nèi)核之

上。但與直接運行的進程不同,運行在容器內(nèi)的進程會被隔離和約束。從而以直接運行的高效實現(xiàn)了虛擬技術(shù)的大部分效果。Containersvs.VMsHot05Containersareis柏血d.butshareOSand,whereapriropriat^bins/libraries口寓意rHot05Containersareis柏血d.butshareOSand,whereapriropriat^bins/libraries口寓意r容器技術(shù)的歷史容器技術(shù)并不是一個新鮮事物,早在1979年出現(xiàn)的在Unix系統(tǒng)中的chroot便是容器技術(shù)的雛形。而隨后出現(xiàn)的BSDJail、SolarisContainers和OpenVZ都算是容器技術(shù)的先驅(qū)。但容器技術(shù)開始普及卻是在2007年,這一年Google貢獻出cgroups,并且從2.6.4開始,Linux內(nèi)核包含了這一組件,隨后容器技術(shù)開始逐漸普及。但容器技術(shù)真正大放異彩則要等到2013年Docker0.10版本發(fā)布。三、Docker簡介在Docker出現(xiàn)之前,不僅Google大量使用容器技術(shù),國內(nèi)的如淘寶也使用容器技術(shù)搭建了自己的應(yīng)用平臺。影響力最大的開源PaaS解決方案CloudFoundry,也在使用自己的容器解決方案Warden。而Docker發(fā)布之后,因其極有可能成為未來企業(yè)應(yīng)用、互聯(lián)網(wǎng)應(yīng)用和云計算應(yīng)用的開發(fā)、部署的中心角色,所以得到了幾乎所有的業(yè)界大佬的追捧,Google、VMware、微軟、RedHat等等都已全力推動Docker技術(shù)的發(fā)展。同時,圍繞Docker,出現(xiàn)了一系列以CoreOS為代表的新技術(shù)。Docker的出現(xiàn)并非創(chuàng)造了一個新的容器技術(shù),而是在LXC(LinuXContainer)a1、cgroups、namespaces技術(shù)之上所構(gòu)建的一種技術(shù):Docker簡化了容器的運行:它通過一個簡單的命令就能夠運行起一個容器dockerrun[params][image][command(optional)]Docker簡化了容器鏡像的構(gòu)建和分發(fā):Docker提供了Dockerfile和dockercommit兩種方式構(gòu)建鏡像,并且提供了Dockerimageregistry機制以保存和分發(fā)鏡像形象地解釋打一個比方,集裝箱(容器)對于遠洋運輸(應(yīng)用運行)來說十分重要。集裝箱(容器)能保護貨物(應(yīng)用),讓其不會相互碰撞(應(yīng)用沖突)而損壞,也能保障當一些危險貨物發(fā)生規(guī)模不大的爆炸(應(yīng)用崩潰)時不會波及其它貨物(應(yīng)用)但是把貨物(應(yīng)用)裝載在集裝箱(容器)中并不是一件簡單的事情。而出色的碼頭工人(Docker)的出現(xiàn)解決了這一問題。它(Docker)使得貨物裝載到集裝箱(容器)這一過程變得輕而易舉。對于遠洋運輸(應(yīng)用運行)而言,用多艘小貨輪(虛擬機)代替原來的大貨輪(實體機)也能保證貨物(應(yīng)用)彼此之間的安全,但是和集裝箱(容器)比,成本過高,但適合運輸某些重要貨物(應(yīng)用)。

Docker的組成Docker

RegistryImiago1Imago2ImagesImageNDocker主要有DockerHub和Docker引擎組成。前者是DockerDocker

RegistryImiago1Imago2ImagesImageNHostDocker

Clientpull門"mDocker

Clientpull門"mrrjn...Comtalrwr1Corrta4mir2Corrtolnar善CcnfainerIN除了這兩部分,Dockerfile也是不得不提的,它雖然不能算作一個獨立的組件,但是卻是Docker中很重要的部分。通過Dockerfile,技術(shù)人員可以創(chuàng)建自己的Docker容器鏡像。Dockerfile起到了連接開發(fā)與運維的橋梁的作用,非常符合現(xiàn)在DevOps的潮流。DockerHubDockerHub是Docker官方所提供的一個鏡像倉庫。在運行Docker容器或構(gòu)建自己的容器鏡像時,都會直接或間接地使用到DockerHub中的鏡像。DockerEngineDockerEngine承載了Docker容器在宿主機上運行啟停、Docker鏡像的構(gòu)建等功能等功能。是我們接觸最多的組件。接下來簡單介紹一下Docker常見的命令:run運行一個容器,如果鏡像不存在則先下載。常用參數(shù)有-d、-t、-i等pull下載容器鏡像start/stop啟動/停止一^個Docker容器rm刪除一個容器rmi刪除一個容器鏡像commit將容器中的修改提交至鏡像中l(wèi)ogs顯示容器運行的控制臺輸出build從Dockerfile構(gòu)建一個鏡像inspect顯示容器運行參數(shù),通過輸入一個JSON格式的值來顯示相應(yīng)的結(jié)果images顯示當前宿主機上的所有鏡像Dockerfile通過編寫Dockerfile,我們可以構(gòu)建自己的鏡像。看一個Dockerfile的例子:FROMdockerfile/java:oracle-java8MAINTAINERLifanYang<yanglifan@>ADDdevice.jar/device.jarEXPOSE8080ENTRYPOINTjava-jar/device.jarFROM指令的意思是說你的鏡像是基于一個什么鏡像。dockerfile/java:oracle-java8是一個鏡像的名字,它也是有一個基礎(chǔ)鏡像狗狗見。其實它也是基于例如Ubuntu、CentOS這樣的Base鏡像。關(guān)于Base鏡像的制作方法,Docker官網(wǎng)上有介紹,需要專門的工具,這里不再作介紹。MAINTAINER指令是可選的。ADD指令是用來將一個文件或目錄添加到Docker鏡像中,前面是源文件,后面是目標文件。源文件必須使用相對路徑。EXPOSE指令用來容器間暴露端口,其指定的端口也會被-P參數(shù)映射給宿主機的一個隨機端口上。ENTRYPOINT可以用來指定運行Docker容器時,在容器中執(zhí)行的命令是什么。如果需要運行多個命令,可以通過Supervisor來執(zhí)行。除了這些指令,還有一些常用的指令。例如,用于在構(gòu)建過程中執(zhí)行命a^CMD指令;用于在容器中設(shè)置環(huán)境變量的ENV指令。詳細請見DockerfileReference五、Docker的實現(xiàn)接下來要介紹Docker所使用的幾個重要技術(shù):namespaces、cgroups、LXC和AUFS。namespacesLinux容器通過Kernel的namespaces技術(shù),為一^個或一組進程創(chuàng)建獨立的pid、net等namespaces,從而與其它進程相互隔離。下面將介紹namespaces都會對哪些資源進行分組控制以實現(xiàn)相互隔離:pidnamespace不同容器中進程是通過pidnamespace隔離開的,且不同容器中可以有相同pid。具有以下特征:.每個namespace中的pid是有自己的pid=1的初始進程.每個namespace中的進程只能影響自己的同一個namespace或子namespace中的進程.因為/proc包含正在運行的進程,因此在容器中的/proc目錄只能看到自己namespace中的進程.因為namespace允許嵌套,父namespace可以影響子namespace的進程,所以子namespace的進程可以在父namespace中看到,但是具有不同的pidnetnamespace如果僅僅隔離了進程空間,還是會有問題。比如如果你在多個容器中運行Apache服務(wù)器,那只能有一個服務(wù)器使用80端口。對此你有兩個選擇,讓每個Apache服務(wù)器使用不同的端口,或者隔離網(wǎng)絡(luò)空間。netnamespace使得每個容器都有自己的loloopback接口。同時,還有一個通常被命名為eth0的網(wǎng)絡(luò)接口通過這個接口容器可以和host或其它容器進行通信。eth0interface會被分配一個172.17.0.XXX的IP地址,容器之間可以通過這個IP地址相互通信。raot@fl2913af29c3:/#ifconfigethflLirkencap:TtFiemet_HWaddrd2:2b:el:ef:03:ceinetaddr:Beast:Mask:inetGaddr:fe80::dfl2b:elff:feef:3ce/64Scope:LinkJUPBROADCASTRUNNINGHTU:15S9Metric:1RXpackets:8err0rs:0dropped:0overrins:0frame:0TXpackets:11errors:0dropped:0overruns:9carrier:0collisions:0txqueuelen:1000RXbytes:648(648.0B)IXbytes:906(996.9B)la Lirkencap:LocalLoopbackinetaddr:Mask:inetQaddr:::1/128scope:HostUPLOOPBACKRUNNINGMTU:65536Metric:lRXpackets:0errors:odropped:0overruns:0frame:0TXpackets:0errors:0dropped:Eaverrins:0carrier:Qcollisions:0txqueuelen:8RXbytes:0(0.0B)TXbytes:3(fl.QB)同時,容器的這個eth0網(wǎng)卡在Host中的名字是一個類似vethdfb7的略顯古怪的名字。這個網(wǎng)卡會和docker0網(wǎng)卡橋接在一起。ipcnamespaceipcnamepace對于不熟悉Unix的人(包括之前的我)吸引力不是很大。畢竟,現(xiàn)在進程之間的通信多數(shù)是通過網(wǎng)絡(luò)實現(xiàn)的。但實際上,Unixipc有著十分廣泛的應(yīng)用,比如管道就是ipc的一種。對ipc就不做過多介紹了,總之LinuxKernelnamespaces可以讓不同容器的ipc相互隔離。mntnamespace如名所示,mntnamespace是處理掛載點的。mntnamespace可以使不同容器擁有不同的掛載的文件系統(tǒng)和root目錄。在一個mntnamespace掛載的文件系統(tǒng)只能被同一個namespace里的進程所見。utsnamespace10utsnamespace用于控制hostname的隔離。有了以上幾種隔離,一個容器就可以對外展現(xiàn)出一個獨立計算機的能力,并且不同容器內(nèi)的資源在操作系統(tǒng)層面實現(xiàn)了隔離。然而不同namespace之間資源還是相互競爭的,仍然需要類似ulimit來管理每個容器所能使用的資源-Docker采用的是cgroup。參考文獻/under-the-hood-linux-kernels-on-dotcloud-partcgroupsnamespaces對進程分組以實現(xiàn)資源隔離,但這隔離還是不夠的。一個進程可以通過占用過度的硬件資源的方式去影響另一個分組中的進程。所以,要想實現(xiàn)完善的資源隔離,不僅要對資源分組,還要能對這一組內(nèi)的進程所使用的資源進行約束。cgroups就是用來實現(xiàn)這個目的的。cgroups的全稱是ControlGroups,在2003年由Google的工程師實現(xiàn),在2007年加入LinuxKernel。cgroups可限制進程對CPU、內(nèi)存、塊存儲和網(wǎng)絡(luò)的使用。這里不對cgroups的使用方法作介紹,感興趣的同學(xué)可以參考如下:SysAdminC:IntroductiontoLinuxControlGroups(Cgroups)D:RuntimeMetrics雖然cgroups提供了對IO資源使用的約束的功能但Docker目前(1.3)尚未提供支持。內(nèi)存11cgroups可以控制進程所能使用的內(nèi)存和swap空間的大小。通過-m參數(shù),Docker可以限制容器所能使用的最大內(nèi)存數(shù):dockerrun-m128m-dcontainer_imgcmd_nameCPUDocker可以通過cgroups限制容器所能使用的CPU資源。在執(zhí)行dockerrun命令時可以通過參數(shù)--cpu-shares(-c)、--cpuset對CPU做出限制。--cpu-shares(-c)-c設(shè)置的是一個相對值,這個值將影響到此容器內(nèi)的進程所能使用的CPU時間片。新運行的Docker容器默認使用1024,對一個單獨的Docker的容器來說,這個值沒有任何意義。當啟動兩個Docker容器的時候,這兩個容器將平分CPU時間片。如果兩個容器,一個不指定-c,另一個設(shè)置為-c512,那前者將使用大致2/3的計算能力,另一個將使用大致1/3的計算能力。但是-c對容器所能使用CPU的運行頻率等沒有任何影響。--cpuset可讓你指定Docker容器中的進程運行在第幾塊CPU上。后面跟一個數(shù)組或用逗號分隔的多個數(shù)字0,1,2。比如下列命令將會使你的容器運行在第一個CPU核心上。dockerrun-i-t--cpuset0ubuntu:14.0412注:cgroups使用的是一種偽文件系統(tǒng)形式的接口。這個偽文件系統(tǒng)實際存在于內(nèi)存中,但映射在目錄中。用戶通過在這個目錄中寫入文件來對cgroups進行操作。AUFS注:最新的Docker使用BTRFS替代AUFS,但所要實現(xiàn)的功能相同AUFS的全稱是AnotherUnionFileSystem。AUFS(包括其它UFS)的一個重要能力是能使兩個目錄結(jié)構(gòu)合二為一。這有什么用呢?Docker的鏡像都是有多個層組成的,最上層是一個可讀寫的,而下面的層則是只讀的。通過AUFS的目錄融合的能力,實現(xiàn)了既可隨意讀寫,又保證了下層的內(nèi)容安全的目的。見下圖可以有一個形象的認識。下圖中的bootfs層包含了LinuxKernel。在其上是某個特定的Linux發(fā)行版本的不同于Kernel的文件層,在下圖中是Debian。再往上有包含emacs和Apache的兩個層。這些層在容器運行時都是只讀的。最上面就是容器運行時可讀寫的層了。上面的層可以只讀訪問下面的層里的文件。這樣的層次結(jié)構(gòu)可以通過Dockerfile來創(chuàng)建。13

"Containerreferences孤掰一^)戰(zhàn)黑"Containerreferences孤掰一^)戰(zhàn)黑那這樣的一個結(jié)構(gòu)有什么樣的好處呢?主要有下面幾點:節(jié)省磁盤和內(nèi)存的存儲空間節(jié)省磁盤存儲空間是因為不同的容器鏡像之間可以共享相同的層。例如,兩個不同的Java應(yīng)用的容器鏡像,它們都是基于Ubuntu14.04和JDK7。那在同一臺Host中,這兩個鏡像就會使用相同的Ubuntu14.04和JDK7的層。節(jié)省內(nèi)存空間是因為Linux為了加快磁盤訪問,會將一些磁盤上的文件加載到內(nèi)存中。所以,節(jié)省磁盤空間的同時也就可以間接地解釋內(nèi)存的使用。加快部署速度同樣,可共享的鏡像層能加快部署速度。因為相同的層不用被重復(fù)下載部署。允許對文件^意改動14上傳可讀寫的層可以對下面的只讀層中的文件做任意修改,但這其實是copy-on-write,所以,這種修改對下面的層其實是安全的。六、Docker的生態(tài)圈Docker再好,單靠Docker自身是無法滿足互聯(lián)網(wǎng)和企業(yè)應(yīng)用的各種復(fù)雜需求的。好在Docker的出現(xiàn)帶動了一些列技術(shù)的發(fā)展,形成了一個龐大的生態(tài)圈。這個生態(tài)圈中的產(chǎn)品可大致分為如下幾類:容器編排管理以GoogleKubernets和ApacheMesos為代表。主要解決基于容器組成分布式集群應(yīng)用的管理工作,例如對容器的運行狀態(tài)的監(jiān)控、容器自動化的故障恢復(fù)、基于容器的應(yīng)用的擴容和縮容、服務(wù)發(fā)現(xiàn)?;谌萜鞯牟賌系統(tǒng)以CoreOS和RedhatAtomic為代表。它們拋棄了Linux上面?zhèn)鹘y(tǒng)的包管理機制,而使用Docker作為應(yīng)用的運行平臺。同時精簡系統(tǒng)。CoreOS還引入了Ectd、Fleet等組件以更好地支持分布式系統(tǒng)。基于容器的平臺PaaS平臺不是什么新鮮的概念,但卻一直處于發(fā)育不良的狀態(tài)。Docker的出現(xiàn)給PaaS的發(fā)展帶來了新的機遇,Docker使得PaaS應(yīng)用的部署有了統(tǒng)一

溫馨提示

  • 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論