Dockerをソースからビルドしてみた

昨日に続いてDockerの話。Dockerに関しては驚くことばかりです。検索するとほぼ一年前に盛り上がっていたようですね。周回遅れです。

DockerはGo言語で書かれていてソースコードGithubで公開されています。
GitHub - moby/moby: Moby Project - a collaborative project for the container ecosystem to assemble container-based systems
このソースをとってきてビルドしてみました。

$ git clone https://github.com/dotcloud/docker
$ git checkout -b work v1.0.1

ビルドの方法がすぐに見つけられなかったので、とりあえずMakefileがあることだしmakeコマンドを実行してみました。

$ make

え?!え?!何が起こった?
いきなりdockerが起動してコンテナをビルドし始めました。ubuntu 14.04を取ってきて、apt-getでツールチェインをインストールして、goのソースを取ってきてそれをビルドして ...
そのビルドログ
そして最後にはたったひとつの実行ファイルがごろんとできていました。それ以外の中間ファイルが全くないのが不思議な感じです。全てのビルドはコンテナの中で行われたからです。

$ ls -l bundles/1.0.1/binary/
 total 17132
 lrwxrwxrwx 1 root root       12 Jun 26 22:24 docker -> docker-1.0.1
 -rwxr-xr-x 1 root root 17533452 Jun 26 22:24 docker-1.0.1
 -rw-r--r-- 1 root root       47 Jun 26 22:24 docker-1.0.1.md5
 -rw-r--r-- 1 root root       79 Jun 26 22:24 docker-1.0.1.sha256
$ file bundles/1.0.1/binary/*
bundles/1.0.1/binary/docker:              symbolic link to `docker-1.0.1'
bundles/1.0.1/binary/docker-1.0.1:        ELF 64-bit LSB executable, x86-64, version 1 (GNU/Linux), statically linked, for GNU/Linux 2.6.24, BuildID[sha1]=0xe58e81b17140670d7a3228ea83ee3861fb87cd0b, not stripped
bundles/1.0.1/binary/docker-1.0.1.md5:    ASCII text
bundles/1.0.1/binary/docker-1.0.1.sha256: ASCII text

これはどうしたらいいのかな?無謀にも現在の/usr/bin/docker.ioに差し替えて動かしてみました。

$ sudo service docker.io stop
$ sudo mv /usr/bin/docker.io /usr/bin/docker.io.org
$ sudo cp bundles/1.0.1/binary/docker-1.0.1 /usr/bin/docker.io
$ sudo service docker.io start

バージョンを確認。

$ docker version
Client version: 1.0.1
Client API version: 1.12
Go version (client): go1.2.1
Git commit (client): 990021a
Server version: 1.0.1
Server API version: 1.12
Go version (server): go1.2.1
Git commit (server): 990021a

動いているようです。docker run なども問題なく動きました。

試行錯誤してやってみましたが、その後でビルド方法のドキュメントを見つけました。
http://docs.docker.com/contributing/devenvironment/
DockerをビルドするのにまずDockerをインストールしろと書いてあります。
不思議な話ですが、これによって誰がビルドしてもOSとかツールチェインとかライブラリのバージョンの違いによるトラブルが発生することがありません。これからのOSSのソースリポジトリにはそのビルド環境構築のためのDockerfileがついてくるのが当たり前になるかもしれません。

ちなみに初回のビルドにはビルド用のコンテナの作成のためにそれなりの時間がかかりましたが、2回目以降はコンテナの作成がうまい具合にcacheされるのであっという間にビルドが完了します。
2回目のビルドのログ
apt-get install とかgit cloneとかの実行がなんでcacheできるのかとても不思議で魔法のようです。

なお、make cross とすると、linux/amd64の他に以下の7種類のdockerがビルドされます。

そのうちlinux/armのdockerを試してみよう。