概要
Docker のソースコードから、Docker Engine のバイナリをコンパイルする手順をまとめてみました。これで正式版リリースを待たずに最新機能を試すことができるようになります。
##コンパイルに必要なもの
- Docker
- git
- make
Docker をコンパイルするには Docker が必要です。コンパイル環境を Docker コンテナ内に構築するためです。なので、Linux ホストに現行版の Docker をインストールすることから始めます。
なお、今回試した環境は以下の通りです。
- ホスト: CentOS 7 (AWS EC2 上)
- ホストにインストールする Docker : 1.8.1
手順
まず、CentOS 上に Docker をインストールします。現時点(2015/08/19)での最新の正式版である 1.8.1 をインストールしました(インストール手順はここを参照)。
# システムの最新化
$ sudo yum update -y
# Docker 最新版のインストール
$ curl -sSL https://get.docker.com/ | sh
# Docker デーモンの開始
$ sudo systemctl start docker.service
他に必要となる git と make をインストールしておきます。
$ sudo yum install git make -y
次にソースコードをダウンロード。
$ git clone https://git@github.com/docker/docker
$ cd docker
そして、make build でコンパイル環境を構築。
$ sudo make build
mkdir bundles
docker build -t "docker-dev:master" .
Sending build context to Docker daemon 93.29 MB
Step 0 : FROM ubuntu:14.04
(以下略)
make build は、ソースコードのルートディレクトリある Dockerfile から、コンパイル用の Docker イメージを生成します(この make build が完了するまでには10~15分程度かかる)。
make build 完了後には、イメージが追加されていることが確認できます。
$ sudo docker images
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
docker-dev master add7b7c650cf About a minute ago 1.902 GB
ubuntu 14.04 8251da35e7a7 11 days ago 188.3 MB
最後にコンパイルを実行。
$ sudo make binary
make binary はコンパイル用の Docker コンテナを生成し、そこでコンパイルが実行されます。このコンテナにはホスト側の <ソースコード>/docker/bundles ディレクトリがマウントされ、コンテナ内でコンパイルされたバイナリはそこに出力されます。
$ ls -l /home/centos/docker/bundles/latest/binary/
total 21124
lrwxrwxrwx. 1 root root 16 Aug 19 13:17 docker -> docker-1.9.0-dev
-rwxr-xr-x. 1 root root 21622150 Aug 19 13:17 docker-1.9.0-dev ★★これがdockerコマンド★★
-rw-r--r--. 1 root root 51 Aug 19 13:17 docker-1.9.0-dev.md5
-rw-r--r--. 1 root root 83 Aug 19 13:17 docker-1.9.0-dev.sha256
動作確認をしてみると。たしかに Docker 1.9.0(の開発版)が動作しています。
# 実行中の Docker デーモンを停止
$ sudo systemctl stop docker.service
# インストール済みの docker コマンドをリネーム
$ sudo mv /usr/bin/docker /usr/bin/docker-1.8.1
# コンパイルした docker コマンドを /usr/bin/docker としてコピー
$ sudo cp /home/centos/docker/bundles/latest/binary/docker-1.9.0-dev /usr/bin/docker
# Docker デーモンを開始
$ sudo systemctl start docker.service
# バージョンを表示させてみる。
$ sudo docker version
Client:
Version: 1.9.0-dev
API version: 1.21
Go version: go1.4.2
Git commit: 3dc30d4
Built: Wed Aug 19 13:16:55 UTC 2015
OS/Arch: linux/amd64
Server:
Version: 1.9.0-dev
API version: 1.21
Go version: go1.4.2
Git commit: 3dc30d4
Built: Wed Aug 19 13:16:55 UTC 2015
OS/Arch: linux/amd64