日日操夜夜添-日日操影院-日日草夜夜操-日日干干-精品一区二区三区波多野结衣-精品一区二区三区高清免费不卡

公告:魔扣目錄網(wǎng)為廣大站長提供免費收錄網(wǎng)站服務(wù),提交前請做好本站友鏈:【 網(wǎng)站目錄:http://www.ylptlb.cn 】, 免友鏈快審服務(wù)(50元/站),

點擊這里在線咨詢客服
新站提交
  • 網(wǎng)站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會員:747


終于有人把 Docker 講清楚了

作者 :樂章

一、簡介

1、了解Docker的前生LXC

LXC為linux Container的簡寫。可以提供輕量級的虛擬化,以便隔離進程和資源,而且不需要提供指令解釋機制以及全虛擬化的其他復(fù)雜性。相當(dāng)于C++中的NameSpace。容器有效地將由單個操作系統(tǒng)管理的資源劃分到孤立的組中,以更好地在孤立的組之間平衡有沖突的資源使用需求。

與傳統(tǒng)虛擬化技術(shù)相比,它的優(yōu)勢在于:

(1)與宿主機使用同一個內(nèi)核,性能損耗小;

(2)不需要指令級模擬;

(3)不需要即時(Just-in-time)編譯;

(4)容器可以在CPU核心的本地運行指令,不需要任何專門的解釋機制;

(5)避免了準虛擬化和系統(tǒng)調(diào)用替換中的復(fù)雜性;

(6)輕量級隔離,在隔離的同時還提供共享機制,以實現(xiàn)容器與宿主機的資源共享。

總結(jié):Linux Container是一種輕量級的虛擬化的手段。

Linux Container提供了在單一可控主機節(jié)點上支持多個相互隔離的server container同時執(zhí)行的機制。Linux Container有點像chroot,提供了一個擁有自己進程和網(wǎng)絡(luò)空間的虛擬環(huán)境,但又有別于虛擬機,因為lxc是一種操作系統(tǒng)層次上的資源的虛擬化。

2、LXC與docker什么關(guān)系?

docker并不是LXC替代品,docker底層使用了LXC來實現(xiàn),LXC將linux進程沙盒化,使得進程之間相互隔離,并且能夠課哦內(nèi)閣制各進程的資源分配。

在LXC的基礎(chǔ)之上,docker提供了一系列更強大的功能。

3、什么是docker

docker是一個開源的應(yīng)用容器引擎,基于Go語言開發(fā)并遵循了Apache2.0協(xié)議開源。

docker可以讓開發(fā)者打包他們的應(yīng)用以及依賴包到一個輕量級、可移植的容器中,然后發(fā)布到任何流行的linux服務(wù)器,也可以實現(xiàn)虛擬化。

容器是完全使用沙箱機制,相互之間不會有任何接口(類iphone的App),并且容器開銷極其低。

4、docker官方文檔

https://docs.docker.com/

5、為什么docker越來越受歡迎

官方話語:

  • 容器化越來越受歡迎,因為容器是:
  • 靈活:即使是最復(fù)雜的應(yīng)用也可以集裝箱化。
  • 輕量級:容器利用并共享主機9內(nèi)核。
  • 可互換:您可以即時部署更新和升級。
  • 便攜式:您可以在本地構(gòu)建,部署到云,并在任何地方運行。
  • 可擴展:您可以增加并自動分發(fā)容器副本。
  • 可堆疊:您可以垂直和即時堆疊服務(wù)。

 

  • 鏡像和容器(contalners)

 

通過鏡像啟動一個容器,一個鏡像是一個可執(zhí)行的包,其中包括運行應(yīng)用程序所需要的所有內(nèi)容包含代碼,運行時間,庫、環(huán)境變量、和配置文件。

容器是鏡像的運行實例,當(dāng)被運行時有鏡像狀態(tài)和用戶進程,可以使用docker ps 查看。

  • 容器和虛擬機

 

容器時在linux上本機運行,并與其他容器共享主機的內(nèi)核,它運行的一個獨立的進程,不占用其他任何可執(zhí)行文件的內(nèi)存,非常輕量。

虛擬機運行的是一個完成的操作系統(tǒng),通過虛擬機管理程序?qū)χ鳈C資源進行虛擬訪問,相比之下需要的資源更多。

 

終于有人把 Docker 講清楚了

 

6、docker版本

Docker Community Edition(CE)社區(qū)版

Enterprise Edition(EE) 商業(yè)版

7、docker和openstack的幾項對比

終于有人把 Docker 講清楚了

 

8、容器在內(nèi)核中支持2種重要技術(shù)

docker本質(zhì)就是宿主機的一個進程,docker是通過namespace實現(xiàn)資源隔離,通過cgroup實現(xiàn)資源限制,通過寫時復(fù)制技術(shù)(copy-on-write)實現(xiàn)了高效的文件操作(類似虛擬機的磁盤比如分配500g并不是實際占用物理磁盤500g)

1)namespaces 名稱空間

 

終于有人把 Docker 講清楚了

 

2)control Group 控制組

cgroup的特點是: 

  • cgroup的api以一個偽文件系統(tǒng)的實現(xiàn)方式,用戶的程序可以通過文件系統(tǒng)實現(xiàn)cgroup的組件管理
  • cgroup的組件管理操作單元可以細粒度到線程級別,另外用戶可以創(chuàng)建和銷毀cgroup,從而實現(xiàn)資源載分配和再利用
  • 所有資源管理的功能都以子系統(tǒng)的方式實現(xiàn),接口統(tǒng)一子任務(wù)創(chuàng)建之初與其父任務(wù)處于同一個cgroup的控制組

 

四大功能:

  • 資源限制:可以對任務(wù)使用的資源總額進行限制
  • 優(yōu)先級分配:通過分配的cpu時間片數(shù)量以及磁盤IO帶寬大小,實際上相當(dāng)于控制了任務(wù)運行優(yōu)先級
  • 資源統(tǒng)計:可以統(tǒng)計系統(tǒng)的資源使用量,如cpu時長,內(nèi)存用量等
  • 任務(wù)控制:cgroup可以對任務(wù)執(zhí)行掛起、恢復(fù)等操作

 

9、了解docker三個重要概念

1)image鏡像

docker鏡像就是一個只讀模板,比如,一個鏡像可以包含一個完整的centos,里面僅安裝apache或用戶的其他應(yīng)用,鏡像可以用來創(chuàng)建docker容器,另外docker提供了一個很簡單的機制來創(chuàng)建鏡像或者更新現(xiàn)有的鏡像,用戶甚至可以直接從其他人那里下周一個已經(jīng)做好的鏡像來直接使用

2)container容器

docker利用容器來運行應(yīng)用,容器是從鏡像創(chuàng)建的運行實例,它可以被啟動,開始、停止、刪除、每個容器都是互相隔離的,保證安全的平臺,可以吧容器看做是要給簡易版的linux環(huán)境(包括root用戶權(quán)限、鏡像空間、用戶空間和網(wǎng)絡(luò)空間等)和運行再其中的應(yīng)用程序

 

3)repostory倉庫

倉庫是集中存儲鏡像文件的滄桑,registry是倉庫主從服務(wù)器,實際上參考注冊服務(wù)器上存放著多個倉庫,每個倉庫中又包含了多個鏡像,每個鏡像有不同的標簽(tag)

倉庫分為兩種,公有參考,和私有倉庫,最大的公開倉庫是docker Hub,存放了數(shù)量龐大的鏡像供用戶下周,國內(nèi)的docker pool,這里倉庫的概念與Git類似,registry可以理解為github這樣的托管服務(wù)。

10、docker的主要用途

官方就是Bulid 、ship、run any app/any where,編譯、裝載、運行、任何app/在任意地放都能運行。

就是實現(xiàn)了應(yīng)用的封裝、部署、運行的生命周期管理只要在glibc的環(huán)境下,都可以運行。

運維生成環(huán)境中:docker化。

  • 發(fā)布服務(wù)不用擔(dān)心服務(wù)器的運行環(huán)境,所有的服務(wù)器都是自動分配docker,自動部署,自動安裝,自動運行
  • 再不用擔(dān)心其他服務(wù)引擎的磁盤問題,cpu問題,系統(tǒng)問題了
  • 資源利用更出色
  • 自動遷移,可以制作鏡像,遷移使用自定義的鏡像即可遷移,不會出現(xiàn)什么問題
  • 管理更加方便了

 

11、docker改變了什么

  • 面向產(chǎn)品:產(chǎn)品交付
  • 面向開發(fā):簡化環(huán)境配置
  • 面向測試:多版本測試
  • 面向運維:環(huán)境一致性
  • 面向架構(gòu):自動化擴容(微服務(wù))

 

二、docker架構(gòu)

1、總體架構(gòu)

終于有人把 Docker 講清楚了

 

  • distribution 負責(zé)與docker registry交互,上傳洗澡鏡像以及v2 registry 有關(guān)的源數(shù)據(jù)
  • registry負責(zé)docker registry有關(guān)的身份認證、鏡像查找、鏡像驗證以及管理registry mirror等交互操作
  • image 負責(zé)與鏡像源數(shù)據(jù)有關(guān)的存儲、查找,鏡像層的索引、查找以及鏡像tar包有關(guān)的導(dǎo)入、導(dǎo)出操作
  • reference負責(zé)存儲本地所有鏡像的repository和tag名,并維護與鏡像id之間的映射關(guān)系
  • layer模塊負責(zé)與鏡像層和容器層源數(shù)據(jù)有關(guān)的增刪改查,并負責(zé)將鏡像層的增刪改查映射到實際存儲鏡像層文件的graphdriver模塊
  • graghdriver是所有與容器鏡像相關(guān)操作的執(zhí)行者

 

2、docker架構(gòu)2

如果覺得上面架構(gòu)圖比較亂可以看這個架構(gòu):

終于有人把 Docker 講清楚了

 

從上圖不難看出,用戶是使用Docker Client與Docker Daemon建立通信,并發(fā)送請求給后者。

而Docker Daemon作為Docker架構(gòu)中的主體部分,首先提供Server的功能使其可以接受Docker Client的請求;而后Engine執(zhí)行Docker內(nèi)部的一系列工作,每一項工作都是以一個Job的形式的存在。

Job的運行過程中,當(dāng)需要容器鏡像時,則從Docker Registry中下載鏡像,并通過鏡像管理驅(qū)動graphdriver將下載鏡像以Graph的形式存儲;當(dāng)需要為Docker創(chuàng)建網(wǎng)絡(luò)環(huán)境時,通過網(wǎng)絡(luò)管理驅(qū)動networkdriver創(chuàng)建并配置Docker容器網(wǎng)絡(luò)環(huán)境;當(dāng)需要限制Docker容器運行資源或執(zhí)行用戶指令等操作時,則通過execdriver來完成。

而libcontainer是一項獨立的容器管理包,networkdriver以及execdriver都是通過libcontainer來實現(xiàn)具體對容器進行的操作。當(dāng)執(zhí)行完運行容器的命令后,一個實際的Docker容器就處于運行狀態(tài),該容器擁有獨立的文件系統(tǒng),獨立并且安全的運行環(huán)境等。

 

3、docker架構(gòu)3

再來看看另外一個架構(gòu),這個個架構(gòu)就簡單清晰指明了server/client交互,容器和鏡像、數(shù)據(jù)之間的一些聯(lián)系。

終于有人把 Docker 講清楚了

 

這個架構(gòu)圖更加清晰了架構(gòu)

docker daemon就是docker的守護進程即server端,可以是遠程的,也可以是本地的,這個不是C/S架構(gòu)嗎,客戶端Docker client 是通過rest api進行通信。

docker cli 用來管理容器和鏡像,客戶端提供一個只讀鏡像,然后通過鏡像可以創(chuàng)建多個容器,這些容器可以只是一個RFS(Root file system根文件系統(tǒng)),也可以ishi一個包含了用戶應(yīng)用的RFS,容器再docker client中只是要給進程,兩個進程之間互不可見。

用戶不能與server直接交互,但可以通過與容器這個橋梁來交互,由于是操作系統(tǒng)級別的虛擬技術(shù),中間的損耗幾乎可以不計。

三、docker架構(gòu)2各個模塊的功能(帶完善)

主要的模塊有:Docker Client、Docker Daemon、Docker Registry、Graph、Driver、libcontainer以及Docker container。

1、docker client

docker client 是docker架構(gòu)中用戶用來和docker daemon建立通信的客戶端,用戶使用的可執(zhí)行文件為docker,通過docker命令行工具可以發(fā)起眾多管理container的請求。

docker client可以通過一下三宗方式和docker daemon建立通信:tcp://host:port;unix:path_to_socket;fd://socketfd。,docker client可以通過設(shè)置命令行flag參數(shù)的形式設(shè)置安全傳輸層協(xié)議(TLS)的有關(guān)參數(shù),保證傳輸?shù)陌踩浴?/p>

docker client發(fā)送容器管理請求后,由docker daemon接受并處理請求,當(dāng)docker client 接收到返回的請求相應(yīng)并簡單處理后,docker client 一次完整的生命周期就結(jié)束了,當(dāng)需要繼續(xù)發(fā)送容器管理請求時,用戶必須再次通過docker可以執(zhí)行文件創(chuàng)建docker client。

2、docker daemon

docker daemon 是docker架構(gòu)中一個常駐在后臺的系統(tǒng)進程,功能是:接收處理docker client發(fā)送的請求。該守護進程在后臺啟動一個server,server負載接受docker client發(fā)送的請求;接受請求后,server通過路由與分發(fā)調(diào)度,找到相應(yīng)的handler來執(zhí)行請求。

docker daemon啟動所使用的可執(zhí)行文件也為docker,與docker client啟動所使用的可執(zhí)行文件docker相同,在docker命令執(zhí)行時,通過傳入的參數(shù)來判別docker daemon與docker client。

docker daemon的架構(gòu)可以分為:docker server、engine、job。daemon

3、docker server

docker server在docker架構(gòu)中時專門服務(wù)于docker client的server,該server的功能時:接受并調(diào)度分發(fā)docker client發(fā)送的請求,架構(gòu)圖如下:

 

終于有人把 Docker 講清楚了

 

在Docker的啟動過程中,通過包gorilla/mux(golang的類庫解析),創(chuàng)建了一個mux.Router,提供請求的路由功能。在Golang中,gorilla/mux是一個強大的URL路由器以及調(diào)度分發(fā)器。該mux.Router中添加了眾多的路由項,每一個路由項由HTTP請求方法(PUT、POST、GET或DELETE)、URL、Handler三部分組成。

若Docker Client通過HTTP的形式訪問Docker Daemon,創(chuàng)建完mux.Router之后,Docker將Server的監(jiān)聽地址以及mux.Router作為參數(shù),創(chuàng)建一個httpSrv=http.Server{},最終執(zhí)行httpSrv.Serve()為請求服務(wù)。

在Server的服務(wù)過程中,Server在listener上接受Docker Client的訪問請求,并創(chuàng)建一個全新的goroutine來服務(wù)該請求。在goroutine中,首先讀取請求內(nèi)容,然后做解析工作,接著找到相應(yīng)的路由項,隨后調(diào)用相應(yīng)的Handler來處理該請求,最后Handler處理完請求之后回復(fù)該請求。

需要注意的是:Docker Server的運行在Docker的啟動過程中,是靠一個名為”serveapi”的job的運行來完成的。原則上,Docker Server的運行是眾多job中的一個,但是為了強調(diào)Docker Server的重要性以及為后續(xù)job服務(wù)的重要特性,將該”serveapi”的job單獨抽離出來分析,理解為Docker Server。

4、engine

Engine是Docker架構(gòu)中的運行引擎,同時也Docker運行的核心模塊。它扮演Docker container存儲倉庫的角色,并且通過執(zhí)行job的方式來操縱管理這些容器。

在Engine數(shù)據(jù)結(jié)構(gòu)的設(shè)計與實現(xiàn)過程中,有一個handler對象。該handler對象存儲的都是關(guān)于眾多特定job的handler處理訪問。舉例說明,Engine的handler對象中有一項為:{“create”: daemon.ContainerCreate,},則說明當(dāng)名為”create”的job在運行時,執(zhí)行的是daemon.ContainerCreate的handler。

5、job

一個Job可以認為是Docker架構(gòu)中Engine內(nèi)部最基本的工作執(zhí)行單元。Docker可以做的每一項工作,都可以抽象為一個job。例如:在容器內(nèi)部運行一個進程,這是一個job;創(chuàng)建一個新的容器,這是一個job,從Internet上下載一個文檔,這是一個job;包括之前在Docker Server部分說過的,創(chuàng)建Server服務(wù)于HTTP的API,這也是一個job,等等。

Job的設(shè)計者,把Job設(shè)計得與Unix進程相仿。比如說:Job有一個名稱,有參數(shù),有環(huán)境變量,有標準的輸入輸出,有錯誤處理,有返回狀態(tài)等。

6、docker registry

Docker Registry是一個存儲容器鏡像的倉庫。而容器鏡像是在容器被創(chuàng)建時,被加載用來初始化容器的文件架構(gòu)與目錄。

在Docker的運行過程中,Docker Daemon會與Docker Registry通信,并實現(xiàn)搜索鏡像、下載鏡像、上傳鏡像三個功能,這三個功能對應(yīng)的job名稱分別為”search”,”pull” 與 “push”。

其中,在Docker架構(gòu)中,Docker可以使用公有的Docker Registry,即大家熟知的Docker Hub,如此一來,Docker獲取容器鏡像文件時,必須通過互聯(lián)網(wǎng)訪問Docker Hub;同時Docker也允許用戶構(gòu)建本地私有的Docker Registry,這樣可以保證容器鏡像的獲取在內(nèi)網(wǎng)完成。

7、Graph

Graph在Docker架構(gòu)中扮演已下載容器鏡像的保管者,以及已下載容器鏡像之間關(guān)系的記錄者。一方面,Graph存儲著本地具有版本信息的文件系統(tǒng)鏡像,另一方面也通過GraphDB記錄著所有文件系統(tǒng)鏡像彼此之間的關(guān)系。

Graph的架構(gòu)如下:

終于有人把 Docker 講清楚了

其中,GraphDB是一個構(gòu)建在SQLite之上的小型圖數(shù)據(jù)庫,實現(xiàn)了節(jié)點的命名以及節(jié)點之間關(guān)聯(lián)關(guān)系的記錄。它僅僅實現(xiàn)了大多數(shù)圖數(shù)據(jù)庫所擁有的一個小的子集,但是提供了簡單的接口表示節(jié)點之間的關(guān)系。

同時在Graph的本地目錄中,關(guān)于每一個的容器鏡像,具體存儲的信息有:該容器鏡像的元數(shù)據(jù),容器鏡像的大小信息,以及該容器鏡像所代表的具體rootfs。

 

8、driver

Driver是Docker架構(gòu)中的驅(qū)動模塊。通過Driver驅(qū)動,Docker可以實現(xiàn)對Docker容器執(zhí)行環(huán)境的定制。由于Docker運行的生命周期中,并非用戶所有的操作都是針對Docker容器的管理,另外還有關(guān)于Docker運行信息的獲取,Graph的存儲與記錄等。因此,為了將Docker容器的管理從Docker Daemon內(nèi)部業(yè)務(wù)邏輯中區(qū)分開來,設(shè)計了Driver層驅(qū)動來接管所有這部分請求。

在Docker Driver的實現(xiàn)中,可以分為以下三類驅(qū)動:graphdriver、networkdriver和execdriver。

graphdriver主要用于完成容器鏡像的管理,包括存儲與獲取。即當(dāng)用戶需要下載指定的容器鏡像時,graphdriver將容器鏡像存儲在本地的指定目錄;同時當(dāng)用戶需要使用指定的容器鏡像來創(chuàng)建容器的rootfs時,graphdriver從本地鏡像存儲目錄中獲取指定的容器鏡像。

在graphdriver的初始化過程之前,有4種文件系統(tǒng)或類文件系統(tǒng)在其內(nèi)部注冊,它們分別是aufs、btrfs、vfs和devmapper。而Docker在初始化之時,通過獲取系統(tǒng)環(huán)境變量”DOCKER_DRIVER”來提取所使用driver的指定類型。而之后所有的graph操作,都使用該driver來執(zhí)行。

graphdriver的架構(gòu)如下:

終于有人把 Docker 講清楚了

 

networkdriver的用途是完成Docker容器網(wǎng)絡(luò)環(huán)境的配置,其中包括Docker啟動時為Docker環(huán)境創(chuàng)建網(wǎng)橋;Docker容器創(chuàng)建時為其創(chuàng)建專屬虛擬網(wǎng)卡設(shè)備;以及為Docker容器分配IP、端口并與宿主機做端口映射,設(shè)置容器防火墻策略等。networkdriver的架構(gòu)如下:

終于有人把 Docker 講清楚了

 

execdriver作為Docker容器的執(zhí)行驅(qū)動,負責(zé)創(chuàng)建容器運行命名空間,負責(zé)容器資源使用的統(tǒng)計與限制,負責(zé)容器內(nèi)部進程的真正運行等。在execdriver的實現(xiàn)過程中,原先可以使用LXC驅(qū)動調(diào)用LXC的接口,來操縱容器的配置以及生命周期,而現(xiàn)在execdriver默認使用native驅(qū)動,不依賴于LXC。

具體體現(xiàn)在Daemon啟動過程中加載的ExecDriverflag參數(shù),該參數(shù)在配置文件已經(jīng)被設(shè)為”native”。這可以認為是Docker在1.2版本上一個很大的改變,或者說Docker實現(xiàn)跨平臺的一個先兆。execdriver架構(gòu)如下:

終于有人把 Docker 講清楚了

 

9、libcontainer

libcontainer是Docker架構(gòu)中一個使用Go語言設(shè)計實現(xiàn)的庫,設(shè)計初衷是希望該庫可以不依靠任何依賴,直接訪問內(nèi)核中與容器相關(guān)的API。

正是由于libcontainer的存在,Docker可以直接調(diào)用libcontainer,而最終操縱容器的namespace、cgroups、apparmor、網(wǎng)絡(luò)設(shè)備以及防火墻規(guī)則等。這一系列操作的完成都不需要依賴LXC或者其他包。libcontainer架構(gòu)如下:

終于有人把 Docker 講清楚了

 

另外,libcontainer提供了一整套標準的接口來滿足上層對容器管理的需求。或者說,libcontainer屏蔽了Docker上層對容器的直接管理。又由于libcontainer使用Go這種跨平臺的語言開發(fā)實現(xiàn),且本身又可以被上層多種不同的編程語言訪問,因此很難說,未來的Docker就一定會緊緊地和Linux捆綁在一起。而于此同時,Microsoft在其著名云計算平臺Azure中,也添加了對Docker的支持,可見Docker的開放程度與業(yè)界的火熱度。

暫不談Docker,由于libcontainer的功能以及其本身與系統(tǒng)的松耦合特性,很有可能會在其他以容器為原型的平臺出現(xiàn),同時也很有可能催生出云計算領(lǐng)域全新的項目。

10、docker container

Docker container(Docker容器)是Docker架構(gòu)中服務(wù)交付的最終體現(xiàn)形式。

Docker按照用戶的需求與指令,訂制相應(yīng)的Docker容器:

  • 用戶通過指定容器鏡像,使得Docker容器可以自定義rootfs等文件系統(tǒng);
  • 用戶通過指定計算資源的配額,使得Docker容器使用指定的計算資源;
  • 用戶通過配置網(wǎng)絡(luò)及其安全策略,使得Docker容器擁有獨立且安全的網(wǎng)絡(luò)環(huán)境;
  • 用戶通過指定運行的命令,使得Docker容器執(zhí)行指定的工作。

 

終于有人把 Docker 講清楚了
來源 :http://39sd.cn/732DD

分享到:
標簽:Docker
用戶無頭像

網(wǎng)友整理

注冊時間:

網(wǎng)站:5 個   小程序:0 個  文章:12 篇

  • 51998

    網(wǎng)站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會員

趕快注冊賬號,推廣您的網(wǎng)站吧!
最新入駐小程序

數(shù)獨大挑戰(zhàn)2018-06-03

數(shù)獨一種數(shù)學(xué)游戲,玩家需要根據(jù)9

答題星2018-06-03

您可以通過答題星輕松地創(chuàng)建試卷

全階人生考試2018-06-03

各種考試題,題庫,初中,高中,大學(xué)四六

運動步數(shù)有氧達人2018-06-03

記錄運動步數(shù),積累氧氣值。還可偷

每日養(yǎng)生app2018-06-03

每日養(yǎng)生,天天健康

體育訓(xùn)練成績評定2018-06-03

通用課目體育訓(xùn)練成績評定