docker源码阅读,开发,调试环境搭建

简介

docker分为两部分,docker client 和docker engine。docker client就是我们日常使用的docker命令行工具,用户通过docker client指定参数向docker engine发送信息,docker engine接受到信息后做出实际的操作。目前这两部分的代码已经分离,其中docker client代码位于https://github.com/docker/cli,docker engine(更名为moby)代码位于https://github.com/moby/moby。由于在编译时会使用到docker和go,所以需要预先装好docker和go

docker client

首先下载源码

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

之后将下载好的源码放到$GOPATH/src/github.com/docker下
截屏2023-07-26 15.22.09.png
进入到cli目录下执行:

make -f docker.Makefile binary

顺利执行完毕后会在当前目录下的build下发现编译好的docker,此时docker client编译完成。当我们想要做出更改的时候,修改完代码再执行一次上面的make命令即可重新编译成功。
需要注意的是,如果我们想用dlv或者gdb对编译好的可执行文件进行调试就需要再编译时保留调试信息,但是默认情况下编译出来的可执行文件是不包含调试信息的,我们需要在/scripts/build/.variables下将GO_LDFLAGS的"-w"删除掉。
截屏2023-07-26 15.34.17.png

moby

同样,首先下载源码

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

之后将下载好的源码放到$GOPATH/src/github.com/docker下,并将其重命名为docker
截屏2023-07-26 15.22.09.png
进入到docker目录下执行:

make binary   (静态编译)
make dynbinary (动态编译)

顺利执行完毕后会在当前目录下的bundles/binary下发现dockerd可执行文件(如果是动态编译的话可执行文件会存放在bundles/dynbinary下)
同样,如果我们想要使用dlv或者gdb等对dockerd进行调试,那我们就需要保留调试信息。在hack/make.sh中将LDFLAGS的“-w”去掉
截屏2023-07-26 15.33.55.png

联动

至此docker client和moby的编译工作已经完成,下一步是需要让编译好的docker client使用编译好的moby作为docker daemon。此时我们需要先将原有的docker停止

systemctl stop docker
systemctl stop docker.socket

之后先进入GOPATH/src/github.com/docker/docker/bundles/binary下启动dockerd

./dockerd

此时使用$GOPATH/src/github.com/docker/cli/build下的docker client时,它会自动将请求发送到自行编译的moby上。


BigCircle
0 声望0 粉丝