从零开始docker内核开发

从零开始docker内核开发

  • 简介
  • 运行开发环境
    • 拉取moby
    • 拉取docker-cli
    • 构建开发环境镜像并在容器中运行
    • 总结

简介

本文章主要讲了从零开始如何进行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

启动成功会发现已经构建好开发环境的镜像并且在容器中运行
从零开始docker内核开发_第1张图片
可以看到这个显示出来的文件就是moby里面的文件。
生成dockerd二进制文件

hack/make.sh binary

从零开始docker内核开发_第2张图片
运行make install命令将二进制文件复制到/usr/local/bin/目录
在后台启动docker内核守护进程

dockerd -D &

D标志以调试模式启动守护程序。 &作为后台进程启动它。 在调试代码开发时,这些选项很有用。
当然运行到这里发现每次运行这些很麻烦,可以使用以下命令直接进行编译复制和运行的流程

hack/make.sh binary install-binary run

然后运行docker version命令查看当前开发环境的版本
从零开始docker内核开发_第3张图片
运行hello-world镜像

 docker run hello-world

然后查看镜像

docker images

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子命令的帮助。

  1. 启动一个终端
  2. 进入到fork的moby目录
    在这里插入图片描述
  3. 打开cmd/dockerd/docker.go 文件
  4. 修改command help信息
    将原先的
     Short:         "A self-sufficient runtime for containers.",
    
    改成
     Short:         "A self-sufficient runtime for containers.and take some change",
    
    如下
    从零开始docker内核开发_第4张图片
  5. 保存并且退出
  6. 到开发的仓库根目录下运行hack/make.sh binary
  7. 如果docker正在运行关闭docker
  8. 通过在docker开发容器shell中输入以下命令,将二进制文件复制到/usr/bin
    hack/make.sh binary install-binary
    
  9. 要查看更改,请在docker开发容器shell中运行dockerd --help命令。
    从零开始docker内核开发_第5张图片
    这边已经说明修改完成了,基本修改代码流程是这样。

你可能感兴趣的:(docker)