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 を実行すると、次のような動作をします。

  1. Berkshelf で必要な Cookbook を取得します。
  2. Vagrant で Ubuntu 14.04 VM を作成します。
  3. Chef Zero Provisionerbuild-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)。
  4. Docker Image chef/ubuntu-14.04:latest を取得します。
  5. chef/ubuntu-14.04:latest から Echo Server コンテナを作成して起動します。
  6. Echo Server コンテナを docker export します。
  7. エクスポートしたコンテナを /tmp/container/rootfs に展開します。注意: 公式サイトに書かれている /tmp/container ではいけません。
  8. runC 設定ファイル /tmp/container/config.json を配置します。注意: 公式サイトに書かれている runc spec > container.json ではいけません(unable to set hostname without a private UTS namespace)。
  9. runc/home/vagrant/golang/src/github.com/opencontainers/runc に git clone します。
  10. /home/vagrant/golangGOPATH として 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 が作成できました。是非活用してみてください。

Author

はやりの技術要素に加えて、会議の進め方・文章の書き方などの業務改善にも取り組んでいます。「Chef活用ガイド」共著のほか、Debian Official Developerもやっています。

Daisuke Higuchiの記事一覧

新規CTA