Docker編譯流程、程式碼框架分析、自定義docker功能

Docker編譯流程與程式碼框架分析

所有文章皆可以在以下連結中找到:https://github。com/qwe624758472/Learning_set/tree/master/BookNote

Docker整體編譯打包教程

環境搭建

docker的編譯,需要在宿主機預先安裝docker軟體。因為編譯docker的原始碼時,會構建一個docker映象並執行,在這個容器裡面進行build操作。由於這個容器已經包含了go語言環境,故宿主機無須額外安裝golang。

宿主機系統:ubuntu

宿主機docker版本:Docker version 19。03。8, build 1b4342cd4c

下載編譯原始碼

docker的github官方網站為:https://github。com/docker/docker-ce/。

docker以每月釋出一個版本的節奏進行開發。命名規則為:

年份-月份-ce

,其中ce表示社群版本。截至本文撰寫時,最新版本為

v17。12。0-ce

,但下一版本

v18。01。0-ce-dev

已經處於開發階段(帶dev表示開發階段),本文編譯得到的版本即為

v18。01。0-ce-dev

發行版本下載地址:https://github。com/docker/docker-ce/releases。

本文在

/home/latelee/docker/dev

目錄進行,請根據實際情況修改目錄。

下載原始碼:

git clone https://github。com/docker/docker-ce##或者git clone https://gitee。com/ruog/docker-ce。git123

進入docker-ce目錄:

cd docker-ce1

切換到最新的tag:

git checkout -b v18。01。0-ce1

最後編譯透過用的該命令:

在/home/hao/docker_work/docker-ce資料夾下執行該命令:

make VERSION=18。01。0-ce-dev ENGINE_DIR=/home/hao/docker_work/docker-ce/components/engine CLI_DIR=/home/hao/docker_work/docker-ce/components/cli debmake VERSION=18。01。0-ce-dev ENGINE_DIR=/root/docker-ce/components/engine CLI_DIR=/root/docker-ce/components/cli deb123

如果編譯不透過,試試make clean。

命令解釋:

該命令指定了版本號和docker元件的目錄(VERSION、ENGINE、CLI分別指版本號、docker引擎、docker命令列),同時指定了要編譯的系統版本(deb指編譯所有debian平臺包,ubuntu16。04代號為xenial)。

大約經過半小時(github上下載速度為3m/s的情況下),編譯成功。最終生成的deb包位於:

components\packaging\deb\debbuild\ubuntu-xenial

和其他各deb下的版本資料夾中。

若因為github下載速度太慢導致不能編譯透過時

修改下列檔案,將檔案中的github程式碼替換成gitee程式碼庫:

。/components/packaging/plugins/app。installer。/components/packaging/plugins/buildx。installer。/components/engine/hack/dockerfile/install/proxy。installer。/components/engine/hack/dockerfile/install/runc。installer。/components/engine/hack/dockerfile/install/tini。installer。/components/engine/hack/dockerfile/install/gotestsum。installer。/components/engine/hack/dockerfile/install/tomlv。installer。/components/engine/hack/dockerfile/install/golangci_lint。installer。/components/engine/hack/dockerfile/install/rootlesskit。installer。/components/engine/hack/dockerfile/install/dockercli。installer。/components/engine/hack/dockerfile/install/containerd。installer。/components/engine/hack/dockerfile/install/vndr。installer。/components/engine/hack/dockerfile/install/shfmt。installer12345678910111213

以。/components/packaging/plugins/app。installer 為例, 修改為如下圖所示程式碼庫:

Docker編譯流程、程式碼框架分析、自定義docker功能

Docker-cli編譯教程

下載docker-ce程式碼:

git clone https://github。com/docker/docker-ce##或者git clone https://gitee。com/ruog/docker-ce。git123

進入docker-ce/components/cli/目錄下執行下面命令,編譯docker-cli的二進位制檔案。

make -f docker。Makefile binary1

編譯好的二進位制檔案在

docker-ce/components/cli/build/docker-linux-amd641

將docker-linux-amd64替換已經安裝在/usr/bin/docker 再次執行docker就為新編譯的docker程式。

可以使用docker version檢視docker版本。

Docker-ce編譯流程分析

從主目錄Makefile分析得, 編譯deb包,會跳轉到/components/packaging/下執行make deb

PACKAGING_DIR:=$(CURDIR)/components/packaging。PHONY: debdeb: #### build deb packages $(MAKE) VERSION=$(VERSION) CLI_DIR=$(CLI_DIR) ENGINE_DIR=$(ENGINE_DIR) -C $(PACKAGING_DIR) deb1234

進入到components/packaging/下,檢視Makefile, 發現檢測cli和engine程式碼,同步分支。

建立src/github。com/docker/ 資料夾, 將components/cli複製到components/packaging/src/github。com/docker/下, 將components/engine/複製到components/packaging/src/github。com/docker/下,並改名成docker

Docker編譯流程、程式碼框架分析、自定義docker功能

然後進入到components/packaging/deb/下執行make deb

將components/packaging/src/github。com/docker/cli和engine打包成cli。tar。gz和engine。tar。gz放在components/packaging/deb/sources/下。

修改Dockerfile中github。com網站地址到gitee時,需要刪除src/github。com/docker/資料夾下的docker。 和packaging/deb/sources/engine。tgz後,重新生成。

##編譯指令碼流程梳理:components/packaging/deb/ Makefile 執行ubuntu-xenial/Dockerfile 構建docker給環境。 執行docker run 啟動映象並掛載元件程式碼。 運行同目錄下 build-deb指令碼。 components/packaging/deb/common/rules: override_dh_auto_build: 。/hack/make。sh dynbinary ack/dockerfile/install/install。sh tini hack/dockerfile/install/install。sh proxy dynamic hack/dockerfile/install/install。sh rootlesskit dynamic 執行engine下 。/hack/make。sh dynbinary 執行engine/hack/install。sh 下的所有*。installer檔案,安裝元件。 編譯二進位制並打包12345678910111213141516

自定義docker功能

1。修改docker-ce/components/packaging/deb/Makefile檔案, 將在建立docker時加入掛載本地元件程式碼,而不是建立docker後在docker內從github上下載程式碼:

這部分內容涉及公司工作內容,拒絕提供。

Docker原始碼分析

1.Docker整體架構分析

總體架構圖:

Docker編譯流程、程式碼框架分析、自定義docker功能

DockerClient:

​ 發起docker的管理請求,命令執行後,傳送請求到Dokcer Daemon,然後接受返回的請求響應並做出簡單處理,為一次完整的生命週期。

DockerDaemon:

​ 1。Docker Server:監聽和接收client發來的請求,然後解析請求,匹配相應的路由項,呼叫對應的Handler來處理,然後回覆client響應。

​ 2。Engine:管理大部分Job的執行,透過handler配置相應的job。

​ 3。Job:類似核心中的程序,一個任務的抽象。

Docker Registry:

​ 分為公有registry和私有registry, docker hub就是最大的共有registry。

​ docker執行過程中有3種情況可能與docker registry通訊,分別為搜尋映象,下載映象,上傳映象。對應的3個job名稱分別為:search,pull和push。

Graph:

​ 統一管理docker映象,支援多種不同的映象儲存方式,同一種類型的映象被稱為一個repository。

Driver:

​ 1。graphdriver:主要完成容器映象的管理。

​ 2。networkdriver:主要的作用完成docker容器網路環境的配置。

​ 3。execdricer:docker的執行驅動,負責建立容器執行時的名稱空間,負責容器資源使用的統計與限制,負責容器內部程序的真正執行等。

libcontainer:

​ 提供一套介面來滿足上層對容器管理的需求。 可以不依靠任何依賴,直接訪問核心中與容器相關的系統呼叫。

​ docker可以直接呼叫libcontainer,而最終操作容器的namespaces,cgroups,apparmor,網路裝置以及防火牆規則等。

Docker Container:

​ docker服務交付的最終體驗形式。