天天看點

《容器技術系列》一2.3 Docker指令執行

本節書摘來華章計算機《容器技術系列》一書中的第2章 ,第2.3節,孫宏亮 著, 更多章節内容可以通路雲栖社群“華章計算機”公衆号檢視。

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

docker client主要完成兩方面的工作:解析請求指令,得出請求類型;執行具體類型的請求。本節将從這兩個方面深入分析docker client。

docker client解析請求指令的工作,在docker指令執行部分第一個完成。建立docker client之後,回到main函數中,繼續執行的源碼如下(位于./do<code>`</code>javascript

cker/docker/docker.go#l102-l110):

if err := cli.cmd(flag.args()...); err != nil {

}

// cmd executes the specified command

func (cli *dockercli) cmd(args ...string) error {

cmd := cli.subcmd("pull", "name[:tag]", "pull an image or a repository from the registry")

tag := cmd.string([]string{"#t", "#-tag"}, "", "download tagged image in a repository")

if err := cmd.parse(args); err != nil {

if cmd.narg() != 1 {

var (

)

v.set("fromimage", remote)

if *tag == "" {

remote, _ = parsers.parserepositorytag(remote)

// resolve the repository name from fqn to hostname + name

hostname, _, err := registry.resolverepositoryname(remote)

if err != nil {

通過cli對象擷取與docker server通信所需要的認證配置資訊。

定義一個名為pull的函數,傳入的參數類型為registry.authconfig,傳回類型為error。函數執行塊中最主要的内容為:cli.stream(……)部分。該部分具體向docker server發送post請求,請求的url為"/images/create?"+v.encode(),請求的認證資訊為:

由于上一個步驟隻是定義pull函數,這一步驟具體調用執行pull函數,實作實際意義上的下載下傳請求發送。若傳回成功則表明請求完成,程式直接退出,若傳回錯誤,則做相應的錯誤處理。若傳回錯誤為401,則表示使用者下載下傳的鏡像必須使用者先登入,随即docker client轉至登入環節,完成之後,繼續執行pull函數,若完成則最終傳回。

以上便是pull請求的全部執行過程,其他請求的執行在流程上也是大同小異。總之,請求執行過程中,大多都是将指令行中關于請求的參數進行初步處理,并添加相應的輔助資訊,最終通過指定的協定向docker server發送docker client和docker server約定好的api請求。

繼續閱讀