第2章 Docker Client建立與命令執行

來源:互聯網
上載者:User
這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。

2.1 引言

本章基於Docker 1.2.0的源碼,分析Docker Client的內容。主要包括兩個部分,分別是Docker Client的建立與Docker Client對命令的執行。兩部分分析的具體內容如下。

第一部分分析Docker Client的建立。這部分的分析可分為以下三個步驟:

  1. 分析如何通過docker命令,解析出命令列flag參數,以及docker命令中的請求參數。
  2. 分析如何處理具體的flag參數資訊,並收集Docker Client所需的配置資訊。
  3. 分析如何建立一個Docker Client。

第二部分在已有Docker Client的基礎上,分析如何執行docker命令。這部分的分析又可分為以下兩個步驟:

  1. 分析如何解析docker命令中的請求參數,擷取相應請求的類型。
  2. 分析Docker Client如何執行具體的請求命令,最終將請求發送至Docker Server。

2.2 建立Docker Client

2.2.1 Docker命令的flag參數解析

對於Docker請求中的參數,我們可以將其分為兩類:第一類為命令列參數,即docker程式運行時所需提供的參數,如:-D、--daemon=true、--daemon=false等;第二類為docker發送給Docker Server的實際請求參數,如:ps、pull NAME等。

對於第一類,我們習慣將其稱為flag參數,在Go語言的標準庫中,專門為該類參數提供了一個flag包,方便進行命令列參數的解析。

部分main函數代碼如下:

func main() {
if reexec.Init() {
return
}
flag.Parse()
// FIXME: validate daemon flags here
}

以上源碼實現中,首先判斷reexec.Init()方法的傳回值,若為真,則直接退出運行,否則將繼續執行。reexec.Init()函數的定義位於./docker/reexec/reexec.go,可以發現由於在docker運行之前沒有任何Initializer註冊,故該程式碼片段執行的傳回值為假。reexec存在的作用是:協調execdriver與容器建立時dockerinit這兩者的關係。

判斷reexec.Init()之後,Docker的main函數通過調用flag.Parse()函數,解析命令列中的flag參數。Docker在./docker/docker/flag.go中定義了多個flag參數,並通過init函數進行部分flag參數初始化。代碼如下:

var (
flVersion = flag.Bool([]string{"v", "-version"}, false, "Print version information and quit")
flDaemon = flag.Bool([]string{"d", "-daemon"}, false, "Enable daemon mode")
flSocketGroup = flag.String([]string{"G", "-group"}, "docker", "Group to assign the unix socket specifby -H when running in daemon modeuse '' (the empty string) to disable setting of a group")
flEnableCors = flag.Bool([]string{"tls"}, false, "Use TLS; implied by tls-verify flags")
flTls = flag.Bool([]string{"-tlsverify"}, false, "Use TLS and verify the remote (daemon: verify client, client: verify daemon")
// these are initialized in init() below since their default valus depend on dockerCertPath which isn't fully initialized until init() runs
flCa string
flCert
string
flKey *string
flHosts []string
)

func init() {
flCa = flag.String([]string{"-tlscacert"}, filepath.Join(dockerCertPath, defaultCaFile), "Trust only remotes providing a certficate signed by the CA given here")
flCert = flag.String([]string{"-tlscert"}, filepath.Join(dockerCertPath, defaultCertFile), "Path to TLS certificate file")
flKey = flag.String([]string{"-tlskey"}, filepath.Join(dockerCertPath, defaultKeyFile), "Path to TLS key file)
opts.HostListVar(&flHosts, []string{"H", "-host"}, "The socket(s) to bind to in daemon mode\nspecified using one or more tcp://host:port, unix:///path/to/socket, fd://* or fd:socketfd.")
}

關於Golang中的init函數,深入分析可以得出以下特性:

  • init函數用於程式執行前包的初始化工作,比如初始設定變數等;
  • 每個包可以有多個init函數;
  • 包的每一個源檔案也可以有多個init函數;
  • 同一個包內的init函數的執行順序沒有明確的定義;
  • 不同包的init函數按照包匯入的依賴關係決定初始化的順序;
  • init函數不能被調用,而是在main函數調用前自動被調用。

2.2.2 如何建立Docker Client

Docker Client的建立其實就是在已有配置參數資訊的情況下,通過Client包中的NewDockerCli方法建立一個Docker Client執行個體cli。

2.3 Docker命令執行

main函數執行到這個階段,有以下內容需要為Docker命令的執行服務:建立完畢的Docker Client,docker命令中的請求(經flag解析後存放於flag.Arg())。也就是說,程式需要使用Docker Client來分析Docker命令中的請求參數,得出請求的類型,轉義為Docker Server可以識別的請求之後,最終發送給Docker Server。

Docker Client主要完成兩方面的工作:解析請求命令,得出請求類型;執行具體類型的請求。

2.3.1 Docker Client解析請求命令

Docker Client解析請求命令的工作,在Docker命令執行部分第一個完成。

2.3.2 Docker Client執行請求命令

不同的Docker儘管請求內容不同,但是請求執行流程大致相同,故本節依舊以一個例子來闡述其中的流程,例子為docker pull Image_Name。該命令的作用為:Docker Client發起下載鏡像的請求,最終由Docker Server接收請求,由Docker Daemon完成鏡像的下載與儲存。

Docker Client在執行docker pull Image_Name請求命令時,執行CmdPull函數,傳入參數為args[1:]...,即Image_Name。

若使用者沒有制定Docker Registry的地址,則Docker預設地址為Docker Hub地址https://index.docker.io/v1/。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.