精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

Docker底層原理及源碼分析Docker架構(gòu)

云計(jì)算
Docker 是 Docker 公司開源的一個(gè)基于輕量級(jí)虛擬化技術(shù)的容器引擎項(xiàng)目, 整個(gè)項(xiàng)目基于 Go 語(yǔ)言開發(fā),并遵從 Apache 2.0 協(xié)議。

 [[279395]]

前言

Docker 簡(jiǎn)介

Docker 是 Docker 公司開源的一個(gè)基于輕量級(jí)虛擬化技術(shù)的容器引擎項(xiàng)目, 整個(gè)項(xiàng)目基于 Go 語(yǔ)言開發(fā),并遵從 Apache 2.0 協(xié)議。目前,Docker 可以在容器內(nèi)部快速自動(dòng)化部署應(yīng)用,并可以通過(guò)內(nèi)核虛擬化技術(shù)(namespaces 及 cgroups 等)來(lái)提供容器的資源隔離與安全保障等。由于 Docker 通過(guò)操作系統(tǒng)層的虛擬化實(shí)現(xiàn)隔離,所以 Docker 容器在運(yùn)行時(shí),不需要類似虛擬機(jī)(VM)額外的操作系統(tǒng)開銷,提高資源利用率,并且提升諸如 IO 等方面的性能。

由于眾多新穎的特性以及項(xiàng)目本身的開放性,Docker 在不到兩年的時(shí)間里迅速獲得諸多廠商的青睞,其中更是包括 Google、Microsoft、VMware 等業(yè)界行業(yè)領(lǐng)導(dǎo)者。 Google 在今年六月份推出了 Kubernetes ,提供 Docker 容器的調(diào)度服務(wù),而今年 8 月 Microsoft 宣布 Azure 上支持 Kubernetes ,隨后傳統(tǒng)虛擬化巨頭VMware 宣布與Docker 強(qiáng)強(qiáng)合作。今年9 月中旬, Docker 更是獲得 4000 萬(wàn)美元的 C 輪融資,以推動(dòng)分布式應(yīng)用方面的發(fā)展。

從目前的形勢(shì)來(lái)看,Docker 的前景一片大好。本系列文章從源碼的角度出發(fā),詳細(xì)介紹 Docker 的架構(gòu)、Docker 的運(yùn)行以及 Docker 的卓越特性。本文是 Docker 源碼分析系列的第一篇­­­——Docker 架構(gòu)篇。

Docker 版本

本文關(guān)于 Docker 架構(gòu)的分析都是基于 Docker 的源碼與 Docker 相應(yīng)版本的運(yùn)行結(jié)果,其中 Docker 為最新的 1.2 版本。

Docker 架構(gòu)分析內(nèi)容目錄

本文的目的是:在理解 Docker 源代碼的基礎(chǔ)上,分析 Docker 架構(gòu)。分析過(guò)程中主要按照以下三個(gè)步驟進(jìn)行:

  • Docker 的總架構(gòu)圖展示
  • Docker 架構(gòu)圖內(nèi)部各模塊功能與實(shí)現(xiàn)分析
  • 以 Docker 命令的執(zhí)行為例,進(jìn)行 Docker 運(yùn)行流程闡述

Docker 總架構(gòu)圖

學(xué)習(xí) Docker 的源碼并不是一個(gè)枯燥的過(guò)程,反而可以從中理解 Docker 架構(gòu)的設(shè)計(jì)原理。Docker 對(duì)使用者來(lái)講是一個(gè) C/S 模式的架構(gòu),而 Docker 的后端是一個(gè)非常松耦合的架構(gòu),模塊各司其職,并有機(jī)組合,支撐 Docker 的運(yùn)行。

在此,先附上 Docker 總架構(gòu),如圖 

Docker底層原理及源碼分析 Docker 架構(gòu)

Docker 總架構(gòu)圖

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

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

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

而 libcontainer 是一項(xiàng)獨(dú)立的容器管理包,networkdriver 以及 execdriver 都是通過(guò) libcontainer 來(lái)實(shí)現(xiàn)具體對(duì)容器進(jìn)行的操作。

當(dāng)執(zhí)行完運(yùn)行容器的命令后,一個(gè)實(shí)際的 Docker 容器就處于運(yùn)行狀態(tài),該容器擁有獨(dú)立的文件系統(tǒng),獨(dú)立并且安全的運(yùn)行環(huán)境等。

Docker 架構(gòu)內(nèi)各模塊的功能與實(shí)現(xiàn)分析

接下來(lái),我們將從 Docker 總架構(gòu)圖入手,抽離出架構(gòu)內(nèi)各個(gè)模塊,并對(duì)各個(gè)模塊進(jìn)行更為細(xì)化的架構(gòu)分析與功能闡述。主要的模塊有:Docker Client、Docker Daemon、Docker Registry、Graph、Driver、libcontainer 以及 Docker container。

Docker Client

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

Docker Client 可以通過(guò)以下三種方式和 Docker Daemon 建立通信:tcp://host:port,unix://path_to_socket 和 fd://socketfd。為了簡(jiǎn)單起見(jiàn),本文一律使用第一種方式作為講述兩者通信的原型。與此同時(shí),與 Docker Daemon 建立連接并傳輸請(qǐng)求的時(shí)候,Docker Client 可以通過(guò)設(shè)置命令行 flag 參數(shù)的形式設(shè)置安全傳輸層協(xié)議 (TLS) 的有關(guān)參數(shù),保證傳輸?shù)陌踩浴?/p>

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

Docker Daemon

Docker Daemon 是 Docker 架構(gòu)中一個(gè)常駐在后臺(tái)的系統(tǒng)進(jìn)程,功能是:接受并處理 Docker Client 發(fā)送的請(qǐng)求。該守護(hù)進(jìn)程在后臺(tái)啟動(dòng)了一個(gè) Server,Server 負(fù)責(zé)接受 Docker Client 發(fā)送的請(qǐng)求;接受請(qǐng)求后,Server 通過(guò)路由與分發(fā)調(diào)度,找到相應(yīng)的 Handler 來(lái)執(zhí)行請(qǐng)求。

Docker Daemon 啟動(dòng)所使用的可執(zhí)行文件也為 docker,與 Docker Client 啟動(dòng)所使用的可執(zhí)行文件 docker 相同。在 docker 命令執(zhí)行時(shí),通過(guò)傳入的參數(shù)來(lái)判別 Docker Daemon 與 Docker Client。

Docker Daemon 的架構(gòu),大致可以分為以下三部分:Docker Server、Engine 和 Job。Daemon 架構(gòu)。 

Docker底層原理及源碼分析 Docker 架構(gòu)

圖Docker Daemon 架構(gòu)示意圖

Docker Server 在 Docker 架構(gòu)中是專門服務(wù)于 Docker Client 的 server。該 server 的功能是:接受并調(diào)度分發(fā) Docker Client 發(fā)送的請(qǐng)求。Docker Server 的架構(gòu)如圖 4.2。 

Docker底層原理及源碼分析 Docker 架構(gòu)

圖 4.2 Docker Server 架構(gòu)示意圖

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

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

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

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

4.2.2 Engine

Engine 是 Docker 架構(gòu)中的運(yùn)行引擎,同時(shí)也 Docker 運(yùn)行的核心模塊。它扮演 Docker container 存儲(chǔ)倉(cāng)庫(kù)的角色,并且通過(guò)執(zhí)行 job 的方式來(lái)操縱管理這些容器。

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

4.2.3 Job

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

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

4.3 Docker Registry

Docker Registry 是一個(gè)存儲(chǔ)容器鏡像的倉(cāng)庫(kù)。而容器鏡像是在容器被創(chuàng)建時(shí),被加載用來(lái)初始化容器的文件架構(gòu)與目錄。

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

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

4.4 Graph

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

Docker底層原理及源碼分析 Docker 架構(gòu)

圖 4.3 Graph 架構(gòu)示意圖

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

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

4.5 Driver

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

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

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

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

graphdriver 的架構(gòu)如圖 4.4: 

Docker底層原理及源碼分析 Docker 架構(gòu)

圖 4.4 graphdriver 架構(gòu)示意圖

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

Docker底層原理及源碼分析 Docker 架構(gòu)

圖 4. 5 networkdriver 架構(gòu)示意圖

execdriver 作為 Docker 容器的執(zhí)行驅(qū)動(dòng),負(fù)責(zé)創(chuàng)建容器運(yùn)行命名空間,負(fù)責(zé)容器資源使用的統(tǒng)計(jì)與限制,負(fù)責(zé)容器內(nèi)部進(jìn)程的真正運(yùn)行等。在 execdriver 的實(shí)現(xiàn)過(guò)程中,原先可以使用 LXC 驅(qū)動(dòng)調(diào)用 LXC 的接口,來(lái)操縱容器的配置以及生命周期,而現(xiàn)在 execdriver 默認(rèn)使用 native 驅(qū)動(dòng),不依賴于 LXC。具體體現(xiàn)在 Daemon 啟動(dòng)過(guò)程中加載的 ExecDriverflag 參數(shù),該參數(shù)在配置文件已經(jīng)被設(shè)為"native"。這可以認(rèn)為是 Docker 在 1.2 版本上一個(gè)很大的改變,或者說(shuō) Docker 實(shí)現(xiàn)跨平臺(tái)的一個(gè)先兆。execdriver 架構(gòu)如圖 4.6: 

Docker底層原理及源碼分析 Docker 架構(gòu)

圖 4.6 execdriver 架構(gòu)示意圖

4.6 libcontainer

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

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

Docker底層原理及源碼分析 Docker 架構(gòu)

libcontainer 示意圖

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

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

4.7 Docker container

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

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

用戶通過(guò)指定容器鏡像,使得 Docker 容器可以自定義 rootfs 等文件系統(tǒng);

用戶通過(guò)指定計(jì)算資源的配額,使得 Docker 容器使用指定的計(jì)算資源;

用戶通過(guò)配置網(wǎng)絡(luò)及其安全策略,使得 Docker 容器擁有獨(dú)立且安全的網(wǎng)絡(luò)環(huán)境;

用戶通過(guò)指定運(yùn)行的命令,使得 Docker 容器執(zhí)行指定的工作。

Docker 容器示意圖如圖 4.8: 

Docker底層原理及源碼分析 Docker 架構(gòu)

圖 4.8 Docker 容器示意圖

5 Docker 運(yùn)行案例分析

上一章節(jié)著重于 Docker 架構(gòu)中各個(gè)部分的介紹。本章的內(nèi)容,將以串聯(lián) Docker 各模塊來(lái)簡(jiǎn)要分析,分析原型為 Docker 中的 docker pull 與 docker run 兩個(gè)命令。

5.1 docker pull

docker pull 命令的作用為:從 Docker Registry 中下載指定的容器鏡像,并存儲(chǔ)在本地的 Graph 中,以備后續(xù)創(chuàng)建 Docker 容器時(shí)的使用。docker pull 命令執(zhí)行流程如圖 5.1。 

Docker底層原理及源碼分析 Docker 架構(gòu)

圖 5.1 docker pull 命令執(zhí)行流程示意圖

如圖,圖中標(biāo)記的紅色箭頭表示 docker pull 命令在發(fā)起后,Docker 所做的一系列運(yùn)行。以下逐一分析這些步驟。

(1) Docker Client 接受 docker pull 命令,解析完請(qǐng)求以及收集完請(qǐng)求參數(shù)之后,發(fā)送一個(gè) HTTP 請(qǐng)求給 Docker Server,HTTP 請(qǐng)求方法為 POST,請(qǐng)求 URL 為"/images/create? "+"xxx";

(2) Docker Server 接受以上 HTTP 請(qǐng)求,并交給 mux.Router,mux.Router 通過(guò) URL 以及請(qǐng)求方法來(lái)確定執(zhí)行該請(qǐng)求的具體 handler;

(3) mux.Router 將請(qǐng)求路由分發(fā)至相應(yīng)的 handler,具體為 PostImagesCreate;

(4) 在 PostImageCreate 這個(gè) handler 之中,一個(gè)名為"pull"的 job 被創(chuàng)建,并開始執(zhí)行;

(5) 名為"pull"的 job 在執(zhí)行過(guò)程中,執(zhí)行 pullRepository 操作,即從 Docker Registry 中下載相應(yīng)的一個(gè)或者多個(gè) image;

(6) 名為"pull"的 job 將下載的 image 交給 graphdriver;

(7) graphdriver 負(fù)責(zé)將 image 進(jìn)行存儲(chǔ),一方創(chuàng)建 graph 對(duì)象,另一方面在 GraphDB 中記錄 image 之間的關(guān)系。

5.2 docker run

docker run 命令的作用是在一個(gè)全新的 Docker 容器內(nèi)部運(yùn)行一條指令。Docker 在執(zhí)行這條命令的時(shí)候,所做工作可以分為兩部分:第一,創(chuàng)建 Docker 容器所需的 rootfs;第二,創(chuàng)建容器的網(wǎng)絡(luò)等運(yùn)行環(huán)境,并真正運(yùn)行用戶指令。因此,在整個(gè)執(zhí)行流程中,Docker Client 給 Docker Server 發(fā)送了兩次 HTTP 請(qǐng)求,第二次請(qǐng)求的發(fā)起取決于第一次請(qǐng)求的返回狀態(tài)。Docker run 命令執(zhí)行流程如圖 5.2。 

Docker底層原理及源碼分析 Docker 架構(gòu)

圖 5.2 docker run 命令執(zhí)行流程示意圖

如圖,圖中標(biāo)記的紅色箭頭表示 docker run 命令在發(fā)起后,Docker 所做的一系列運(yùn)行。以下逐一分析這些步驟。

(1) Docker Client 接受 docker run 命令,解析完請(qǐng)求以及收集完請(qǐng)求參數(shù)之后,發(fā)送一個(gè) HTTP 請(qǐng)求給 Docker Server,HTTP 請(qǐng)求方法為 POST,請(qǐng)求 URL 為"/containers/create? "+"xxx";

(2) Docker Server 接受以上 HTTP 請(qǐng)求,并交給 mux.Router,mux.Router 通過(guò) URL 以及請(qǐng)求方法來(lái)確定執(zhí)行該請(qǐng)求的具體 handler;

(3) mux.Router 將請(qǐng)求路由分發(fā)至相應(yīng)的 handler,具體為 PostContainersCreate;

(4) 在 PostImageCreate 這個(gè) handler 之中,一個(gè)名為"create"的 job 被創(chuàng)建,并開始讓該 job 運(yùn)行;

(5) 名為"create"的 job 在運(yùn)行過(guò)程中,執(zhí)行 Container.Create 操作,該操作需要獲取容器鏡像來(lái)為 Docker 容器創(chuàng)建 rootfs,即調(diào)用 graphdriver;

(6) graphdriver 從 Graph 中獲取創(chuàng)建 Docker 容器 rootfs 所需要的所有的鏡像;

(7) graphdriver 將 rootfs 所有鏡像,加載安裝至 Docker 容器指定的文件目錄下;

(8) 若以上操作全部正常執(zhí)行,沒(méi)有返回錯(cuò)誤或異常,則 Docker Client 收到 Docker Server 返回狀態(tài)之后,發(fā)起第二次 HTTP 請(qǐng)求。請(qǐng)求方法為"POST",請(qǐng)求 URL 為"/containers/"+container_ID+"/start";

(9) Docker Server 接受以上 HTTP 請(qǐng)求,并交給 mux.Router,mux.Router 通過(guò) URL 以及請(qǐng)求方法來(lái)確定執(zhí)行該請(qǐng)求的具體 handler;

(10)mux.Router 將請(qǐng)求路由分發(fā)至相應(yīng)的 handler,具體為 PostContainersStart;

(11) 在 PostContainersStart 這個(gè) handler 之中,名為"start"的 job 被創(chuàng)建,并開始執(zhí)行;

(12) 名為"start"的 job 執(zhí)行完初步的配置工作后,開始配置與創(chuàng)建網(wǎng)絡(luò)環(huán)境,調(diào)用 networkdriver;

(13)networkdriver 需要為指定的 Docker 容器創(chuàng)建網(wǎng)絡(luò)接口設(shè)備,并為其分配 IP,port,以及設(shè)置防火墻規(guī)則,相應(yīng)的操作轉(zhuǎn)交至 libcontainer 中的 netlink 包來(lái)完成;

(14)netlink 完成 Docker 容器的網(wǎng)絡(luò)環(huán)境配置與創(chuàng)建;

(15) 返回至名為"start"的 job,執(zhí)行完一些輔助性操作后,job 開始執(zhí)行用戶指令,調(diào)用 execdriver;

(16)execdriver 被調(diào)用,初始化 Docker 容器內(nèi)部的運(yùn)行環(huán)境,如命名空間,資源控制與隔離,以及用戶命令的執(zhí)行,相應(yīng)的操作轉(zhuǎn)交至 libcontainer 來(lái)完成;

(17)libcontainer 被調(diào)用,完成 Docker 容器內(nèi)部的運(yùn)行環(huán)境初始化,并最終執(zhí)行用戶要求啟動(dòng)的命令。

責(zé)任編輯:武曉燕 來(lái)源: 今日頭條
相關(guān)推薦

2020-11-05 11:14:29

Docker底層原理

2021-08-09 11:15:28

MybatisJavaSpring

2024-04-11 11:04:05

Redis

2014-11-26 10:44:33

DockerOpenStack云計(jì)算

2021-12-01 06:50:50

Docker底層原理

2017-10-20 15:25:17

DockerOpenStack Cvolume

2021-01-27 18:15:01

Docker底層宿主機(jī)

2019-09-20 08:54:38

KafkaBroker消息

2021-07-20 10:26:53

源碼底層ArrayList

2022-12-14 15:34:33

架構(gòu)開發(fā)雙線程

2024-03-07 07:47:04

代碼塊Monitor

2022-07-26 07:14:52

Docker宿主命令

2014-12-11 13:37:13

WPF架構(gòu)

2018-06-05 08:58:38

Docker存儲(chǔ)容器

2021-10-25 09:41:04

架構(gòu)運(yùn)維技術(shù)

2021-11-26 17:17:43

Android廣播運(yùn)行原理源碼分析

2021-02-03 11:20:41

Docker架構(gòu)容器

2023-08-26 19:04:40

配置write轉(zhuǎn)換器

2023-08-11 08:42:49

泛型工廠繼承配置

2020-04-27 07:13:37

Nginx底層進(jìn)程
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

91精品国产高清自在线| 欧美一三区三区四区免费在线看| 久久久久久久久久久久久9999| 亚洲黄色一区二区| 日韩一区二区中文| 亚洲精品一区二区三区精华液 | 色吊一区二区三区| 欧美h视频在线观看| 好吊色在线观看| 日本不卡视频一二三区| 久久久亚洲影院| 自拍偷拍你懂的| 精品一区二区男人吃奶| 欧美日韩国产一区二区三区地区| 蜜桃视频一区二区在线观看| 蜜桃视频在线观看网站| 国产精品一区在线观看你懂的| 91精品国产亚洲| 曰本女人与公拘交酡| re久久精品视频| 日韩av在线免播放器| 手机精品视频在线| 电影在线观看一区二区| 精品久久久中文| 国产精品视频网站在线观看| 麻豆网站在线| 国产日产欧美一区| 久久人人97超碰人人澡爱香蕉| 99在线精品视频免费观看20| 秋霞国产午夜精品免费视频| 97视频在线观看免费| 久久免费黄色网址| 欧美韩日一区| 一区二区亚洲欧洲国产日韩| 超碰97在线资源站| 91亚洲精品视频在线观看| 91精品国产欧美一区二区18| 杨幂毛片午夜性生毛片| 国产精欧美一区二区三区蓝颜男同| 亚洲在线视频免费观看| 特级毛片在线免费观看| 无码人妻丰满熟妇区毛片蜜桃精品 | 国内外成人激情免费视频| 精品电影在线| wwwwxxxxx欧美| 极品日韩久久| 天天操天天操天天干| 国产盗摄一区二区三区| 亚洲iv一区二区三区| 国产又粗又长又黄| 国内精品国产三级国产a久久| 国产精品一区二区在线| 中国女人一级一次看片| 蜜臀久久久久久久| 国产欧美日韩中文字幕在线| 在线观看免费中文字幕| 美女一区二区三区在线观看| 国产精品一区二区三区久久| 一二三区在线播放| 国内不卡的二区三区中文字幕| 成人xvideos免费视频| 一区二区日韩视频| 久久成人麻豆午夜电影| 7777奇米亚洲综合久久| 亚洲国产av一区二区| 高清成人免费视频| 久久久久资源| 九色在线视频蝌蚪| 欧美高清在线视频| 亚洲精品偷拍视频| 欧美激情成人动漫| 欧美日韩国产黄| 欧美精品第三页| 色综合.com| 日韩美女视频在线| 成人在线视频免费播放| 深爱激情综合| www亚洲欧美| 国产午夜视频在线播放| 羞羞视频在线观看欧美| 国产精品极品尤物在线观看| 国产又粗又猛又爽| 国产91丝袜在线播放0| 久久久久久久有限公司| av电影在线播放高清免费观看| 亚洲色欲色欲www| 全黄性性激高免费视频| 精品国产免费人成网站| 欧美美女激情18p| 奇米777第四色| sdde在线播放一区二区| 不卡伊人av在线播放| 国产在线免费视频| 日本中文字幕不卡| 成人精品水蜜桃| 精品美女视频在线观看免费软件| 中文字幕亚洲综合久久菠萝蜜| 国产性生活免费视频| 日本成人三级电影| 欧美一区二区久久| 国产成人av一区二区三区不卡| 手机在线一区二区三区| 国内精品小视频| 伊人免费在线观看| 9久草视频在线视频精品| 亚洲自拍的二区三区| 高潮在线视频| 欧美一区二区三区在线视频| 97伦伦午夜电影理伦片| 欧美粗暴jizz性欧美20| 国产精品视频免费在线| 天天插天天干天天操| 亚洲欧洲精品成人久久奇米网| 精品视频免费在线播放| 国产日韩中文在线中文字幕| 亚洲男人天堂2024| 国产精品19乱码一区二区三区| 老司机免费视频一区二区| 免费成人深夜夜行视频| av美女在线观看| 日韩写真欧美这视频| 亚洲精品视频网址| 久久成人精品| 精品乱码一区| 草草视频在线观看| 日韩精品一区二区三区蜜臀| 日韩欧美在线视频播放| 日韩电影在线观看一区| 久久精品欧美| 国产欧洲在线| 精品日产卡一卡二卡麻豆| 少妇aaaaa| 久久精品99国产精品| 欧美日韩高清在线一区| 超碰高清在线| 亚洲第一av在线| 久久婷婷一区二区| 国产一区视频网站| 在线天堂一区av电影| 粉嫩91精品久久久久久久99蜜桃| 精品视频—区二区三区免费| 日本一级淫片免费放| 成人午夜电影网站| av网站大全免费| 国产成人在线中文字幕| 另类专区欧美制服同性| 国产精品一区二区人人爽| 国产精品网友自拍| 999精品视频在线| 久久精品高清| 国产在线视频2019最新视频| 色影视在线观看| 884aa四虎影成人精品一区| a级黄色免费视频| 极品尤物av久久免费看| 国产免费一区二区三区四在线播放| 国产资源一区| 久久精品国产清自在天天线| 国产精品一区二区三区在线免费观看| 亚洲免费三区一区二区| 国产清纯白嫩初高中在线观看性色| 国产一区日韩欧美| 国偷自产av一区二区三区小尤奈| 国模私拍一区二区国模曼安| 亚洲精品午夜精品| 日本视频www色| 1000部国产精品成人观看| 免费黄频在线观看| 欧美日韩午夜| 精品视频一区二区三区四区| 黑人精品一区| www国产精品视频| 亚洲欧美另类综合| 欧美视频二区36p| 手机看片国产日韩| 国产成人综合亚洲网站| 黄色成人在线看| 精品一区二区三| 成人写真福利网| 九色91在线| 在线观看亚洲视频| 国产成人毛毛毛片| 狠狠躁天天躁日日躁欧美| 色屁屁草草影院ccyy.com| 韩国精品免费视频| 欧美 丝袜 自拍 制服 另类| 国产一区二区三区网| 91最新国产视频| 免费观看亚洲| 久久久精品美女| 四虎在线观看| 欧美精品久久一区| 天天操天天干视频| 国产精品色眯眯| 亚洲少妇18p| 久久99精品久久久久久动态图| 免费高清一区二区三区| 国产一区二区三区91| 北条麻妃高清一区| 国产综合色区在线观看| 欧美日韩国产成人| 国产一级片在线播放| 日韩欧美成人激情| 日韩xxx视频| 亚洲第一久久影院| 777777国产7777777| 久久久久久久久久久久久久久99| 一二三av在线| 日韩精品一级中文字幕精品视频免费观看| 国产激情片在线观看| 国产一区二区亚洲| 九色综合日本| 深夜福利一区| 成人免费福利在线| 电影一区电影二区| 日韩免费观看av| 僵尸再翻生在线观看免费国语| 久久精品人人爽| 一级毛片视频在线观看| 亚洲美女又黄又爽在线观看| 亚洲成人一级片| 91精品免费观看| 亚洲网站在线免费观看| 一本到不卡免费一区二区| 久久久久久久久久久久久久久久久| 中文字幕一区二区在线播放| 丰腴饱满的极品熟妇| 97精品超碰一区二区三区| 精品伦一区二区三区| 韩国理伦片一区二区三区在线播放| 亚洲五月天综合| 日韩精品91亚洲二区在线观看| 免费 成 人 黄 色| 一本综合精品| 欧美 日本 亚洲| 一本久道久久综合狠狠爱| 欧美中文字幕在线观看视频| 亚洲欧洲日韩| 日韩不卡视频一区二区| 亚洲午夜精品一区 二区 三区| 一区二区不卡在线视频 午夜欧美不卡'| 国产欧美日韩| 欧美在线一二三区| 国产精品羞羞答答在线观看| 欧美国产一区二区在线| 天天躁日日躁成人字幕aⅴ| 蜜桃av久久久亚洲精品| 夜色77av精品影院| 欧洲av一区| 精品久久国产| 一区二区国产日产| 欧美激情91| 99色这里只有精品| 国产欧美三级| 久久精品视频91| 日本sm残虐另类| 成人av毛片在线观看| 国产在线精品一区二区| 精品国产午夜福利在线观看| 国产精品12区| 中文成人无字幕乱码精品区| 波多野结衣一区二区三区 | 国产日韩精品一区二区三区在线| 亚洲黄色小说视频| 国产精品每日更新在线播放网址| 日本二区三区视频| 亚洲一级片在线观看| 国产精品一区二区6| 色综合久久精品| 亚洲熟妇无码久久精品| 日韩色在线观看| 水莓100在线视频| 丝袜一区二区三区| 黄色成年人视频在线观看| 欧美激情亚洲国产| 亚洲成人不卡| 亚洲xxxx18| 欧美做受69| 在线无限看免费粉色视频| 国产精品久久| 成人亚洲精品777777大片| 国内精品视频一区二区三区八戒| 日韩少妇一区二区| 国产欧美在线观看一区| 欧美日韩精品在线观看视频 | 亚洲 欧美 激情 小说 另类| 国产午夜一区二区| 污的网站在线观看| 日韩av电影在线网| 国产精品一区免费在线| 久久超碰亚洲| 亚洲成人99| 欧美成人一区二区在线观看| 久久激情综合网| 无码精品一区二区三区在线播放| 中文成人av在线| 日本在线视频免费| 在线综合视频播放| 可以免费看污视频的网站在线| 久久99精品视频一区97| 性欧美videohd高精| 成人综合色站| 国产精品99在线观看| 青青青在线播放| 成人免费电影视频| 国产第一页浮力| 欧美亚洲日本一区| 亚洲av成人无码久久精品老人 | 另类天堂视频在线观看| 少妇一区视频| 好看的日韩精品| 中文字幕av亚洲精品一部二部| 成人在线激情网| av电影在线观看一区| 欧美国产日韩在线观看成人 | 15—17女人毛片| 久久综合精品国产一区二区三区| 青青草原在线免费观看| 欧美精品色综合| 国产系列在线观看| 欧美又大又硬又粗bbbbb| 99久久人爽人人添人人澡| 一区二区不卡在线视频 午夜欧美不卡'| 久久久www| 国产精品无码毛片| 亚洲成人免费观看| 国产xxxx在线观看| 久久影院资源网| 欧美激情三区| 亚洲一区三区| 欧美aaa在线| 国产18无套直看片| 在线精品视频小说1| 黄色软件在线观看| 欧美一级视频免费在线观看| 奇米影视777在线欧美电影观看| 欧美视频在线观看视频| 国产91精品一区二区麻豆网站 | 日韩欧美中文第一页| 天天色棕合合合合合合合| 国产+人+亚洲| 成人线上播放| 999在线观看视频| 9久草视频在线视频精品| 日韩免费观看一区二区| 日韩高清免费在线| 日韩伦理在线| 欧美精品与人动性物交免费看| 国产精品久久久久久久免费软件 | 懂色aⅴ精品一区二区三区蜜月| 欧洲成人一区二区三区| 国内精品小视频在线观看| 久久人人爽人人爽人人片av不| 无码熟妇人妻av在线电影| 岛国av在线一区| 成人免费a视频| 亚洲人午夜色婷婷| 国产黄色精品| 男女啪啪的视频| 成人中文字幕在线| 亚洲精品男人天堂| 亚洲小视频在线观看| 精品福利在线| 2022中文字幕| 91在线免费播放| 日韩欧美国产另类| 日韩视频在线观看免费| 日韩成人久久| 97成人在线观看视频| 亚洲国产精品t66y| 国产视频一区二区三| 国产69精品久久久久9999| 任你弄精品视频免费观看| 蜜桃免费在线视频| 一区二区三区中文免费| 四虎影视在线观看2413| 国产精品网站入口| 亚洲视频一区| 国产精久久一区二区三区| 欧美精品第一页| 樱花草涩涩www在线播放| 五月天丁香综合久久国产| 国产精品99久久久久久久vr| 天天操天天爽天天干| 一区二区三欧美| 高清日韩欧美| 91视频免费版污| 亚洲综合免费观看高清完整版| 人成免费电影一二三区在线观看| 成人国产精品色哟哟| 国产一区二区你懂的| 操她视频在线观看| 亚洲精品视频网上网址在线观看 | 日本一区二区三区免费看| 国内精品伊人久久久久av影院| 国产毛片aaa| 另类色图亚洲色图| 欧美裸体在线版观看完整版| 一级黄色电影片| 欧美高清你懂得|