Docker源码编译和开发环境搭建

官方指导文档:https://docs.docker.com/opensource/code/

设置docker开发环境:https://docs.docker.com/opensource/project/set-up-dev-env/

docker的编译实质上是在docker容器中运行docker。

因此在本地编译docker的前提是需要安装了docker,还需要用git把代码pull下来。

创建分支

为了方便以后给docker提交更改,我们从docker官方fork一个分支。

  1. git clone https://github.com/rootsongjc/docker.git
  2. git config --local user.name "Jimmy Song"
  3. git config --local user.email "rootsongjc@gmail.com"
  4. git remote add upstream https://github.com/docker/docker.git
  5. git config --local -l
  6. git remote -v
  7. git checkout -b dry-run-test
  8. touch TEST.md
  9. vim TEST.md
  10. git status
  11. git add TEST.md
  12. git commit -am "Making a dry run test."
  13. git push --set-upstream origin dry-run-test

然后就可以在dry-run-test这个分支下工作了。

配置docker开发环境

官网上说需要先清空自己电脑上已有的容器和镜像。

docker开发环境本质上是创建一个docker镜像,镜像里包含了docker的所有开发运行环境,本地代码通过挂载的方式放到容器中运行,下面这条命令会自动创建这样一个镜像。

dry-run-test分支下执行

  1. make BIND_DIR=. shell

该命令会自动编译一个docker镜像,From debian:jessie。这一步会上网下载很多依赖包,速度比较慢。如果翻不了墙的话肯定都会失败。因为需要下载的软件和安装包都是在国外服务器上,不翻墙根本就下载不下来,为了不用这么麻烦,推荐直接使用docker官方的dockercore/docker镜像,也不用以前的docker-dev镜像,那个造就废弃了。这个镜像大小有2.31G。

  1. docker pull dockercore/docker

使用方法见这里:https://hub.docker.com/r/dockercore/docker/

然后就可以进入到容器里

  1. docker run --rm -i --privileged -e BUILDFLAGS -e KEEPBUNDLE -e DOCKER_BUILD_GOGC -e DOCKER_BUILD_PKGS -e DOCKER_CLIENTONLY -e DOCKER_DEBUG -e DOCKER_EXPERIMENTAL -e DOCKER_GITCOMMIT -e DOCKER_GRAPHDRIVER=devicemapper -e DOCKER_INCREMENTAL_BINARY -e DOCKER_REMAP_ROOT -e DOCKER_STORAGE_OPTS -e DOCKER_USERLANDPROXY -e TESTDIRS -e TESTFLAGS -e TIMEOUT -v "/Users/jimmy/Workspace/github/rootsongjc/docker/bundles:/go/src/github.com/docker/docker/bundles" -t "dockercore/docker:latest" bash

按照官网的说明make会报错

  1. root@f2753f78bb6d:/go/src/github.com/docker/docker# ./hack/make.sh binary
  2. error: .git directory missing and DOCKER_GITCOMMIT not specified
  3. Please either build with the .git directory accessible, or specify the
  4. exact (--short) commit hash you are building using DOCKER_GITCOMMIT for
  5. future accountability in diagnosing build issues. Thanks!

这是一个issue-27581,解决方式就是在make的时候手动指定DOCKER_GITCOMMIT

  1. root@f2753f78bb6d:/go/src/github.com/docker/docker# DOCKER_GITCOMMIT=3385658 ./hack/make.sh binary
  2. ---> Making bundle: binary (in bundles/17.04.0-dev/binary)
  3. Building: bundles/17.04.0-dev/binary-client/docker-17.04.0-dev
  4. Created binary: bundles/17.04.0-dev/binary-client/docker-17.04.0-dev
  5. Building: bundles/17.04.0-dev/binary-daemon/dockerd-17.04.0-dev
  6. Created binary: bundles/17.04.0-dev/binary-daemon/dockerd-17.04.0-dev
  7. Copying nested executables into bundles/17.04.0-dev/binary-daemon

bundles目录下会生成如下文件结构

  1. .
  2. ├── 17.04.0-dev
  3. ├── binary-client
  4. ├── docker -> docker-17.04.0-dev
  5. ├── docker-17.04.0-dev
  6. ├── docker-17.04.0-dev.md5
  7. └── docker-17.04.0-dev.sha256
  8. └── binary-daemon
  9. ├── docker-containerd
  10. ├── docker-containerd-ctr
  11. ├── docker-containerd-ctr.md5
  12. ├── docker-containerd-ctr.sha256
  13. ├── docker-containerd-shim
  14. ├── docker-containerd-shim.md5
  15. ├── docker-containerd-shim.sha256
  16. ├── docker-containerd.md5
  17. ├── docker-containerd.sha256
  18. ├── docker-init
  19. ├── docker-init.md5
  20. ├── docker-init.sha256
  21. ├── docker-proxy
  22. ├── docker-proxy.md5
  23. ├── docker-proxy.sha256
  24. ├── docker-runc
  25. ├── docker-runc.md5
  26. ├── docker-runc.sha256
  27. ├── dockerd -> dockerd-17.04.0-dev
  28. ├── dockerd-17.04.0-dev
  29. ├── dockerd-17.04.0-dev.md5
  30. └── dockerd-17.04.0-dev.sha256
  31. └── latest -> 17.04.0-dev
  32. 4 directories, 26 files

现在可以将docker-daemon和docker-client目录下的docker可以执行文件复制到容器的/usr/bin/目录下了。

启动docker deamon

  1. docker daemon -D&

检查下docker是否可用

  1. root@f2753f78bb6d:/go/src/github.com/docker/docker/bundles/17.04.0-dev# docker version
  2. DEBU[0048] Calling GET /_ping
  3. DEBU[0048] Calling GET /v1.27/version
  4. Client:
  5. Version: 17.04.0-dev
  6. API version: 1.27
  7. Go version: go1.7.5
  8. Git commit: 3385658
  9. Built: Mon Mar 6 08:39:06 2017
  10. OS/Arch: linux/amd64
  11. Server:
  12. Version: 17.04.0-dev
  13. API version: 1.27 (minimum version 1.12)
  14. Go version: go1.7.5
  15. Git commit: 3385658
  16. Built: Mon Mar 6 08:39:06 2017
  17. OS/Arch: linux/amd64
  18. Experimental: false

到此docker源码编译和开发环境都已经搭建好了。

如果想要修改docker源码,只要在你的IDE、容器里或者你本机上修改docker代码后,再执行上面的hack/make.sh binary命令就可以生成新的docker二进制文件,再替换原来的/usr/bin/目录下的docker二进制文件即可。