Dockerのソースが読めるようになりたいな。
いろいろいじりながら読めば、読めるようになるかも。

ということで Dockerをソースからビルドしてみました。
もちろん Go言語なんて知らない超初心者ですのでまずググるところから。

以下参考資料。
http://qiita.com/Arturias/items/8c9c9321e87675c7d023
http://d.hatena.ne.jp/embedded/20140626/p1
http://tanksuzuki.com/post/docker-source-build-1.8.0/


ビルドを行う環境は VirtualBoxのUbuntu16.04で準備しました。
環境情報はこんな感じです

root@docker-01:~/work/docker# uname -a
Linux docker-01 4.4.0-38-generic #57-Ubuntu SMP Tue Sep 6 15:42:33 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux

root@docker-01:~/work/docker# docker info
Containers: 0
 Running: 0
 Paused: 0
 Stopped: 0
Images: 51
Server Version: 1.12.2
Storage Driver: aufs
 Root Dir: /var/lib/docker/aufs
 Backing Filesystem: extfs
 Dirs: 57
 Dirperm1 Supported: true
Logging Driver: json-file
Cgroup Driver: cgroupfs
Plugins:
 Volume: local
 Network: null host overlay bridge
Swarm: inactive
Runtimes: runc
Default Runtime: runc
Security Options: apparmor seccomp
Kernel Version: 4.4.0-38-generic
Operating System: Ubuntu 16.04.1 LTS
OSType: linux
Architecture: x86_64
CPUs: 1
Total Memory: 740.4 MiB
Name: docker-01
ID: 5DH2:HZB5:FHVI:RRDB:YFCB:P3OL:ZMZG:K5D4:OKJ2:ORNZ:FVLY:2BRF
Docker Root Dir: /var/lib/docker
Debug Mode (client): false
Debug Mode (server): false
Registry: https://index.docker.io/v1/
WARNING: No swap limit support
Cluster Store: consul://192.168.56.102:8500/nodes
Cluster Advertise: 192.168.56.102:2375
Insecure Registries:
 127.0.0.0/8

DockerのビルドはDockerが必要なようなのでDocker をインストールしておきます。
Dockerのインストール方法はこちら。
https://docs.docker.com/engine/installation/linux/ubuntulinux/

そのほかに、make、gitが必要なようです。

apt-get install -y git make

Docker のソースをDLしてきて。。

git clone https://git@github.com/docker/docker.git
cd docker


ビルド方法は

# make

なんとこれだけ。
実行するとかなり長い時間かかって
bundles/1.13.0-dev/ のフォルダができました。

<<省略>>

Successfully built 622249935083
docker run --rm -i --privileged -e BUILD_APT_MIRROR -e BUILDFLAGS -e KEEPBUNDLE -e DOCKER_BUILD_ARGS -e DOCKER_BUILD_GOGC -e DOCKER_BUILD_PKGS -e DOCKER_DEBUG -e DOCKER_EXPERIMENTAL -e DOCKER_GITCOMMIT -e DOCKER_GRAPHDRIVER=aufs -e DOCKER_INCREMENTAL_BINARY -e DOCKER_PORT -e DOCKER_REMAP_ROOT -e DOCKER_STORAGE_OPTS -e DOCKER_USERLANDPROXY -e TESTDIRS -e TESTFLAGS -e TIMEOUT -e HTTP_PROXY -e HTTPS_PROXY -e NO_PROXY -e http_proxy -e https_proxy -e no_proxy -v "/root/work/docker/bundles:/go/src/github.com/docker/docker/bundles"  -t "docker-dev:master" hack/make.sh binary

---> Making bundle: binary (in bundles/1.13.0-dev/binary)
Building: bundles/1.13.0-dev/binary-client/docker-1.13.0-dev
Created binary: bundles/1.13.0-dev/binary-client/docker-1.13.0-dev
Building: bundles/1.13.0-dev/binary-daemon/dockerd-1.13.0-dev
Created binary: bundles/1.13.0-dev/binary-daemon/dockerd-1.13.0-dev
Building: bundles/1.13.0-dev/binary-daemon/docker-proxy-1.13.0-dev
Created binary: bundles/1.13.0-dev/binary-daemon/docker-proxy-1.13.0-dev
Copying nested executables into bundles/1.13.0-dev/binary-daemon


次はこれをどうやって使うのか。。。

Dockerクライアントは
成果物フォルダ内のbinary-client に docker の実行ファイルがあったので
叩いてみたら無事使えました。

root@docker-01:~/work/docker# bundles/1.13.0-dev/binary-client/docker iversion
docker: 'iversion' is not a docker command.
See 'docker --help'.
root@docker-01:~/work/docker# bundles/1.13.0-dev/binary-client/docker version
Client:
 Version:      1.13.0-dev
 API version:  1.25
 Go version:   go1.7.3
 Git commit:   1f9bece
 Built:        Sun Oct 23 00:05:14 2016
 OS/Arch:      linux/amd64
Error response from daemon: client is newer than server (client API version: 1.25, server API version: 1.24)


Dockerサービスはこんな感じで起動します。
現在動いているサービスを止めてから動かすことを忘れずに。

root@docker-01:~/work/docker# systemctl stop docker.service
root@docker-01:~/work/docker# bundles/1.13.0-dev/binary-daemon/dockerd
INFO[0000] libcontainerd: new containerd process, pid: 7122 
WARN[0000] containerd: low RLIMIT_NOFILE changing to max  current=1024 max=65536
INFO[0001] [graphdriver] using prior storage driver: aufs 
INFO[0001] Graph migration to content-addressability took 0.00 seconds 
WARN[0001] Your kernel does not support swap memory limit. 
INFO[0001] Loading containers: start.                   
INFO[0001] Firewalld running: false                     
INFO[0001] Default bridge (docker0) is assigned with an IP address 172.17.0.0/16. Daemon option --bip can be used to set a preferred IP address 
INFO[0001] Loading containers: done.                    
INFO[0001] Daemon has completed initialization          
INFO[0001] Docker daemon                                 commit=1f9bece graphdriver=aufs version=1.13.0-dev
INFO[0001] API listen on /var/run/docker.sock 


別の端末から確認します。

root@docker-01:~# docker info
Containers: 0
 Running: 0
 Paused: 0
 Stopped: 0
Images: 51
Server Version: 1.13.0-dev
Storage Driver: aufs
 Root Dir: /var/lib/docker/aufs
 Backing Filesystem: extfs
 Dirs: 57
 Dirperm1 Supported: true
Logging Driver: json-file
Cgroup Driver: cgroupfs
Plugins:
 Volume: local
 Network: bridge bridge host host macvlan null null overlay
Swarm: inactive
Runtimes: runc
Default Runtime: runc
Security Options: apparmor seccomp
Kernel Version: 4.4.0-38-generic
Operating System: Ubuntu 16.04.1 LTS
OSType: linux
Architecture: x86_64
CPUs: 1
Total Memory: 740.4 MiB
Name: docker-01
ID: 5DH2:HZB5:FHVI:RRDB:YFCB:P3OL:ZMZG:K5D4:OKJ2:ORNZ:FVLY:2BRF
Docker Root Dir: /var/lib/docker
Debug Mode (client): false
Debug Mode (server): false
Registry: https://index.docker.io/v1/
WARNING: No swap limit support
Insecure Registries:
 127.0.0.0/8
root@docker-01:~#

動いてますね!