docker源碼編譯安裝步驟解析


 

轉載自:docker源碼編譯安裝步驟解析

原料:linux 系統,本人在Ubuntu16.04上運行,網上有一些關於docker編譯流程的文章但是由於docker發展太快,網上的信息很快就過時了,本人參考以往的一些文章,加上親自查看相關的源碼基本了解了docker17.12源碼的編譯流程,供大家參考。

由於docker公司將docker項目遷移到Moby下,編譯流程有一些變化。

 

step 0:

安裝docker,終端執行

 

sudo apt—get install docker.io
如果你想安裝最新的docker又不想編譯源碼(耗時),可以按照 here(Ubuntu)的描述安裝。

 

因為docker的源碼需要在容器中進行編譯,因此必須要有docker安裝在host上。

 

step 1:clone源碼

 

git clone https://github.com/moby/moby.git

這里你只是得到了docker daemon的源碼,在項目發生遷移后docker的源碼被拆分成client端和daemon端,client的源碼路徑為:

 

git clone https://github.com/docker/cli.git


step 2:以下是在daemon端的操作,可以編譯出除docker 之外的所有binary(7個以docker開頭的binary)

 

在源碼的根目錄執行make build,這一步會調用Makefile中的build分支代碼:

 

build: bundles init-go-pkg-cache docker build ${BUILD_APT_MIRROR} ${DOCKER_BUILD_ARGS} -t "$(DOCKER_IMAGE)" -f "$(DOCKERFILE)" 

這一步會使用docker創建一個臨時的容器,並在容器中基於DOCKERFILE創建image,這個image包含了docker源碼編譯所需的依賴文件。這一步會下載很多依賴的文件需要訪問很多國外的網站,由於國內的網絡問題經常會因訪問不到而失敗。本人所在的公司可以訪問國外的大部分網站,在兩次編譯源碼時第一次一次成功,第二次經過不同時間的多次嘗試才成功,不知道國內的網站是否能夠靠多次嘗試成功。

 

step 3:

執行make binary,這會調用Makefile中的binary分支代碼:

 

binary: build ## build the linux binaries $(DOCKER_RUN_DOCKER) hack/make.sh binary 

這一步是在上一步創建的image中創建容器並在容器中運行hack/make.sh

 

在hack/make.sh 中會調用/hack/make/binary,

在hack/make/binary中會調用/hack/make/binary-client 和binary-daemon,這兩個腳本會分別調用同目錄下的.binary文件,這個.binary是一個隱藏文件。在.binary文件中會執行go build 語句實現源碼的最終的編譯:

 

go build \ -o "$DEST/$BINARY_FULLNAME" \ "${BUILDFLAGS[@]}" \ -ldflags " $LDFLAGS $LDFLAGS_STATIC_DOCKER " \ $GO_PACKAGE 

我們可以追蹤GO_PACKAGE,發現它就是docker/cmd/dockerd/docker.go兩個文件,也就是docker源碼的入口文件。要繼續搞清楚源碼都做了些什么就要從這兩個文件入手一步步查看。

make binary需要較長的時間,在完成之后你就可以在bundles目錄下看到兩個目錄,進去binary-daemon,可以看到很多文件,將以docker開頭的ELF文件copy至/usr/bin下(之前先要移除原先的docker binary),注意dockerd-dev要改成dockerd,重啟docker(可以用systemctl)運行docker version,你就會發現你的dockerd已經升級到最新了,但是你的docker還是老樣子。接下來編譯docker client。其實版本不一致一般不影響使用。

其實不執行上一部直接make binary也是可以成功編譯的,這里重在介紹過程。

 

step4:編譯docker client

進入源碼目錄運行:

 

# make -f docker.Makefile
完成之后在build目錄下會生成docker binary,注意不要把docker的鏈接當成docker,將其替換原有的docker binary,替換是注意名字要和原先保持一致,名字為docker

 

重啟docker,再運行docker version,你會發現都已經升級到最新了。

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM