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 が作成できました。是非活用してみてください。
