fbpx

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

Daisuke Higuchiの記事一覧

新規CTA