从零开始docker内核开发
简介
本文章主要讲了从零开始如何进行docker内核开发并且记录相关注意点和踩过的坑。实验环境为
Description: Ubuntu 16.04.6 LTS
Release: 16.04
Codename: xenial
实验内容为修改docker内核,测试启动速度。
本实验使用moby作为容器内核,moby是继承了原先的docker的项目,是社区维护的的开源项目。
运行开发环境
拉取moby
运行命令
#拉取仓库
git clone https://github.com/moby/moby.git
#进入文件目录
cd moby
#创建并且进入开发分支
git checkout -d dry-run-test
拉取docker-cli
这边需要注意客户端和服务器端拆分的版本,docker-cli组件已经从moby项目中分离出来,docker-cli组件是提供docker命令的组件,现在docker-cli维护在
- docker/cli - Docker CLI 源码
- docker/docker-ce - Docker CE版项目,它组装了内核,CLI和其他组件。
这里本人使用docker/cli项目作为客户端
运行命令
#拉取仓库
git clone https://github.com/docker/cli.git
#进入文件
cd cli
#编译成Linux二进制文件
make -f docker.Makefile binary
命令完成后会生成一个build
目录
构建开发环境镜像并在容器中运行
进入到moby目录。
cd moby
运行make命令
make DOCKER_CLI_PATH=/root/repos/cli/build/docker BIND_DIR=. shell
遇见报错信息
Makefile:152: The docker client CLI has moved to github.com/docker/cli. For a dev-test cycle involving the CLI, run:
DOCKER_CLI_PATH=/host/path/to/cli/binary make shell
then change the cli and compile into a binary at the same location.
DOCKER_BUILDKIT="1" docker build --build-arg=GO_VERSION --build-arg=CROSS=false --target=dev -t "docker-dev:dry-run-test" -f "Dockerfile" .
buildkit not supported by daemon
Makefile:152: recipe for target 'build' failed
make: *** [build] Error 1
原因在这一句buildkit not supported by daemon
原因是我下载的docker不支持buildkit,所以需要关闭DOCKER_BUILDKIT
运行命令
make DOCKER_CLI_PATH=/root/repos/cli/build/docker BIND_DIR=. DOCKER_BUILDKIT=0 BIND_DIR=. shell
启动成功会发现已经构建好开发环境的镜像并且在容器中运行
可以看到这个显示出来的文件就是moby里面的文件。
生成dockerd
二进制文件
hack/make.sh binary
运行make install
命令将二进制文件复制到/usr/local/bin/
目录
在后台启动docker内核守护进程
dockerd -D &
D标志以调试模式启动守护程序。 &作为后台进程启动它。 在调试代码开发时,这些选项很有用。
当然运行到这里发现每次运行这些很麻烦,可以使用以下命令直接进行编译复制和运行的流程
hack/make.sh binary install-binary run
然后运行docker version
命令查看当前开发环境的版本
运行hello-world
镜像
docker run hello-world
然后查看镜像
docker images
总结
至此,我们完成了如下几个内容
- fork并且clone moby源码
- 创建了一个新的分支
- 从新的分支中创建并且启动docker引擎
- 在开发分支里面编译成二进制代码
- 用最新编译的代码运行docker
- 使用docker client在开发的docker容器里面运行一个hello-world容器
运行make BIND_DIR=. shell
命令将你本地的docker仓库代码安装进docker容器里
注意检查
DockerFile
里面有COPY . /go/src/github.com/docker/docker
命令说明改变代码不会动态的改变容器里的代码,检查Makefiel
显示当前的工作目录会通过-v
命令挂载数据卷。
当开始开发代码时,将需要迭代代码更改并在容器内构建。下面将实现一个运行开发容器的bash shell。
尝试简单的代码更改,并将其反映在容器中。下面将编辑attach
子命令的帮助。
- 启动一个终端
- 进入到fork的moby目录
- 打开
cmd/dockerd/docker.go
文件 - 修改
command help
信息
将原先的
改成Short: "A self-sufficient runtime for containers.",
如下Short: "A self-sufficient runtime for containers.and take some change",
- 保存并且退出
- 到开发的仓库根目录下运行
hack/make.sh binary
- 如果docker正在运行关闭docker
- 通过在docker开发容器shell中输入以下命令,将二进制文件复制到
/usr/bin
中hack/make.sh binary install-binary
- 要查看更改,请在docker开发容器shell中运行
dockerd --help
命令。
这边已经说明修改完成了,基本修改代码流程是这样。