Vagrant Chef-Zero ProvisionerでrunCテスト環境を構築する #getchef #vagrant #docker #runc
この記事は1年以上前に投稿されました。情報が古い可能性がありますので、ご注意ください。
runC とは、Docker と互換性を持ったコンテナランタイムです。Dockercon 2015 (日本時間 2015年6月23日)にて発表されました。
runC は登場して間もなく、公式バイナリパッケージも用意されていないため、Go によるビルドから始めなければいけません。そこで、簡単な runC のテスト環境を構築するための Chef Cookbook runc-test を作成しました。なお、本稿は 2015年7月3日現在の runC の状況を基にしています。runC の開発に伴い、動かなくなってしまうかもしれません。
まず runc-test を git clone します。
% git clone https://github.com/cl-lab-k/runc-test -b sample_blog
Cloning into 'runc-test'...
remote: Counting objects: 32, done.
remote: Compressing objects: 100% (28/28), done.
remote: Total 32 (delta 12), reused 0 (delta 0)
Receiving objects: 100% (32/32), 5.15 KiB | 0 bytes/s, done.
Resolving deltas: 100% (12/12), done.
Checking connectivity... done.
%
ディレクトリに移動し、rake を実行すると、次のような動作をします。
- Berkshelf で必要な Cookbook を取得します。
- Vagrant で Ubuntu 14.04 VM を作成します。
- Chef Zero Provisioner で build-essential Cookbook、golang Cookbook、docker Cookbook (Declare ulimit parameter in the resource を利用)を適用し、ビルドツール、Go 1.4、Docker をインストールします。runC は Ubuntu 14.04 でデフォルトの Go 1.2.1 ではビルドできません(cmd/gc: internal compiler error: unknown etype 0/STRUCT)。Ubuntu 15.04 でデフォルトの Go 1.3.3 でもビルドできません(cannot build runc with golang 1.3 : make error)。
- Docker Image chef/ubuntu-14.04:latest を取得します。
- chef/ubuntu-14.04:latest から Echo Server コンテナを作成して起動します。
- Echo Server コンテナを docker export します。
- エクスポートしたコンテナを /tmp/container/rootfs に展開します。注意: 公式サイトに書かれている /tmp/container ではいけません。
- runC 設定ファイル /tmp/container/config.json を配置します。注意: 公式サイトに書かれている runc spec > container.json ではいけません(unable to set hostname without a private UTS namespace)。
- runc を /home/vagrant/golang/src/github.com/opencontainers/runc に git clone します。
- /home/vagrant/golang を GOPATH として runC をビルドし、/usr/local/bin/runc にインストールします。
% rake
berks vendor cookbooks
:
vagrant up
:
==> default: [2015-07-03T10:27:09+00:00] INFO: Chef Run complete in 124.767634276 seconds
==> default: [2015-07-03T10:27:09+00:00] INFO: Skipping removal of unused files from the cache
==> default: [2015-07-03T10:27:09+00:00] INFO: Running report handlers
==> default: [2015-07-03T10:27:09+00:00] INFO: Report handlers complete
==> default: Configuring cache buckets...
==> default: Skipping Yum cache bucket as the guest machine does not support it
%
完了したら、vagrant ssh で VM にログインします。
% vagrant ssh
Welcome to Ubuntu 14.04.1 LTS (GNU/Linux 3.13.0-24-generic x86_64)
* Documentation: https://help.ubuntu.com/
Last login: Tue Oct 21 14:52:42 2014 from 10.0.2.2
vagrant@vagrant:~$
/tmp/container に移動します。
vagrant@vagrant:~$ cd /tmp/container/
vagrant@vagrant:/tmp/container$ ls -la
total 16
drwxr-xr-x 3 root root 4096 Jul 3 09:59 .
drwxrwxrwt 7 root root 4096 Jul 3 10:07 ..
-rw-r--r-- 1 vagrant vagrant 2163 Jul 3 09:59 config.json
drwxr-xr-x 21 vagrant vagrant 4096 Jul 3 09:59 rootfs
vagrant@vagrant:/tmp/container$
root 権限で runc コマンドを実行します。
vagrant@vagrant:/tmp/container$ sudo runc
$
これで runC を使ったコンテナ内に入っています。
$ ps
PID TTY TIME CMD
1 ? 00:00:00 sh
9 ? 00:00:00 ps
$
$ ps auxwwwf
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
daemon 1 0.0 0.0 4444 652 ? Ss 10:08 0:00 sh
daemon 10 0.0 0.0 15564 1104 ? R+ 10:10 0:00 ps auxwwwf
$
別ターミナルでプロセスを見てみます。
vagrant@vagrant:~$ ps auxwwwf
:
root 11578 0.0 0.0 62100 2036 pts/1 S+ 10:08 0:00 | \_ sudo runc
root 11579 0.0 0.0 112704 3936 pts/1 Sl+ 10:08 0:00 | \_ runc
daemon 11585 0.0 0.0 4444 652 pts/2 Ss+ 10:08 0:00 | \_ sh
:
このように runc プロセス以下にコンテナ内の sh プロセスがいます。
runC の Go でのビルドや Docker イメージの作成などをすべて Chef Recipe に任せて、簡単に runC をテストできる VM が作成できました。是非活用してみてください。