1. 程式人生 > 實用技巧 >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,你會發現都已經升級到最新了。


轉載