• Docker源码编译和开发环境搭建
    • 创建分支
    • 配置docker开发环境

    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二进制文件即可。