這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。
最近要修改docker的源碼做一些開發,但是docker的官網給的編譯方式是用docker提供的dockerfile檔案編譯一個docker 鏡像然後在這個容器裡面通過腳步編譯docker。我們都知道1.11以後的docker實際上有docker dockerd docker-containerd runc 幾個進程組成。如何我修改一次就要全部編譯一遍多麻煩。所以我覺定自己go build 出docker的幾個可執行檔。
1. git clone github.com/moby/moby 現在docker 的代碼從docker/docker 遷移到了 /moby/moby。當然你編譯之前還需要安裝go。這個golang 官網都有按照說明安裝就好。
2. 編譯docker 就是docker client 。代碼在 cmd/docker 下,我這裡是1.13.x 分支。在你的gopath 路徑下還有一個docker/docker 的目錄你要保持 docker下的分支和moby 下的一致。不然在moby 下build 會出錯。然後 go build 。會產生docker bin檔案。
3.編譯 dockerd 編譯dockerd 的時候需要安裝許多包。可以根據錯誤提示安裝需要的包。例如我是fedora25 。 go build 會報 libdevmapper.h 缺少。然後 dnf install device-mapper-devel.x86_6 。
4. 編譯containerd . git clone github.com/docker/containerd . 編譯containerd 使用containerd 的make file 來編譯產生。 編譯完以後會產生 containerd-shim ,containerd。 具體參考 containerd 的README。
5.編譯產生runc 。runc是最終啟動容器的工具,可以說容器的核心。實際上沒有 dockerd 也是發送命令到containerd containerd 再 啟動 containd-shim containerd-shim 再調用runc 來啟動容器 停止容器等容器運行生命週期的各種操作。其實沒有前幾個進程,可以直接發送資料給runc 啟動容器。當然了要符合oci的標準。具體可以參考runc項目的readme runc 現在在 https://github.com/opencontainers/runc。docker 變曾經的libcontainer貢獻出來改了個名字變成cncf下的runc 項目。 runc 編譯 就go build 一下。具體看github的 readme 寫的非常詳細。
現在docker 需要的5個bin檔案全部都編譯產生完成。 分別是docker dockerd containerd containerd-shim 和runc 。編譯這些可執行檔主要是為了方便我調試docker 代碼。後面我會修改docker dockerd containerd 等 。從一條docker run 看 資料如何在 這幾個進程間流動。如何互相調用。