boot2docker で test-kitchen + kitchen-docker

[boot2docker](https://github.com/boot2docker/boot2docker)はVirtualBox上にDocker ReadyなTinyCoreOSをセットアップしてくれるツールです。

そのままVMを起動しても、test-kitchenがdockerコンテナにssh接続できないため使えませんが、いくつか追加手順を加える事で動作可能に出来ます。

ここでは、Macで試した内容を紹介します。

なお、[Homebrew](http://brew.sh/)と[VirtualBox](https://www.virtualbox.org)はインストール済みとします。

## boot2dockerとネットワーク設定

```shell-session
$ brew install boot2docker
$ boot2docker init
```

`boot2docker-vm`というインスタンスが生成され、起動前の状態になっています。

### ホストオンリーネットワーク

VMのネットワーク設定が標準ではNATのみになっていますが、このままではダイレクトなssh接続ができないため、ホストオンリーアダプタを追加します。

[VirtualBox] > [環境設定] > [ネットワーク]タブ > [ホストオンリーネットワーク]を選び、
「ホストオンリーネットワークの追加」を選択します。

![ネットワーク設定](https://qiita-image-store.s3.amazonaws.com/0/14950/4fc15269-4213-156a-c2bc-1aa121569b05.png)

追加したネットワーク（ここではvboxnet3）をダブルクリックして編集し、IPの確認を行います。

![vboxnet3のIP指定](https://qiita-image-store.s3.amazonaws.com/0/14950/a25e2db1-da2d-417c-41c5-826bb5960813.png)

ここでは、`192.168.59.1`に設定されたので、DHCPサーバの設定を`192.168.59.x`のレンジに作成します。

![vboxnet3のDHCP設定](https://qiita-image-store.s3.amazonaws.com/0/14950/bf1f5db7-d82c-23ac-21e4-2d047f66f2eb.png)


boot2dockerのインスタンスは、新しいインターフェースに自動的にDHCPでIPを割り当ててくれます。

### VMのネットワーク設定

`boot2docker-vm` インスタンスの設定を開き、[ネットワーク]の設定を追加します。

既に設定されているアダプター1はそのままで、アダプター2を作成します（VM起動中は作成出来ません）
ネットワーク名は作成したホストオンリーネットワーク名を指定します。

![スクリーンショット 2014-05-13 10.59.49.png](https://qiita-image-store.s3.amazonaws.com/0/14950/46d872c4-842a-a84b-d173-a0ed98b4b6bb.png)

ここまで終わったらboot2dockerを起動します。

```shell-session
$ boot2docker up
```

## kitchenの設定

起動してみるとおそらくeth1にホストオンリーアダプタが設定されます。SSHログインして確認しましょう。なお、boot2docker ver0.9.0ではログインパスワードを聞かれますが、`tcuser`になっているようです。（今後無くすとのこと）

```
$ boot2docker ssh
docker@localhost's password:
                        ##        .
                  ## ## ##       ==
               ## ## ## ##      ===
           /""""""""""""""""\___/ ===
      ~~~ {~~ ~~~~ ~~~ ~~~~ ~~ ~ /  ===- ~~~
           \______ o          __/
             \    \        __/
              \____\______/
 _                 _   ____     _            _
| |__   ___   ___ | |_|___ \ __| | ___   ___| | _____ _ __
| '_ \ / _ \ / _ \| __| __) / _` |/ _ \ / __| |/ / _ \ '__|
| |_) | (_) | (_) | |_ / __/ (_| | (_) | (__|   <  __/ |
|_.__/ \___/ \___/ \__|_____\__,_|\___/ \___|_|\_\___|_|
boot2docker: 0.8.1
             master : 17bb8c2 - Thu May  8 02:55:10 UTC 2014
```

```shell-session
$ ifconfig eth1
eth1      Link encap:Ethernet  HWaddr ...
          inet addr:192.168.59.33  Bcast:192.168.59.255  Mask:255.255.255.0
          inet6 addr: ... Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:4145 errors:0 dropped:0 overruns:0 frame:0
          TX packets:3292 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:779677 (761.4 KiB)  TX bytes:574119 (560.6 KiB)
          Interrupt:16 Base address:0xd040
```

ここで設定されたIPアドレス`192.168.59.33`を使用してkitchenを起動してみましょう。

### .kitchen.yml

cookbookに対して、kitchenのセットアップを行います。

```
$ kitchen init -D kitchen-docker
```

ここで生成される `.kitchen.yml` に接続先の情報などを記述します。
各OSのイメージについては、[Docker Index](https://index.docker.io/)を参照してください。

```yaml
driver:
  name: docker
  binary: /usr/local/bin/docker
  socket: tcp://192.168.59.33:4243
  dns: 8.8.8.8

provisioner:
  name: chef_solo

platforms:
  - name: debian-6.0.9
    driver_config:
      image: debian:6.0.9
  - name: debian-7.4
    driver_config:
      image: debian:7.4
```

kitchenを含めたネットワーク構成のイメージはこんな感じでしょうか。

![boot2docker with kitchen.png](https://qiita-image-store.s3.amazonaws.com/0/14950/7c6830fe-1c67-f9ee-0c18-2bfd90df994e.png)

### boot2dockerのDNS設定バグ

あとは`kitchen setup`でセットアップを走らせることができるはず…なのですが、boot2dockerインスタンスのDNS設定が無く、動かないことがあります。
どうやら以下の設定がまだ適用されてない（？）ような状態になっていることがあり、DHCPリース更新の度に`/etc/resolv.conf`が空っぽになる現象が発生していました。
参照：https://github.com/boot2docker/boot2docker/pull/197

ということで、修正してあげましょう。

```diff:/usr/share/udhcpc/default.script
                         done
                 fi
 
-                echo -n > $RESOLV_CONF
+                [ -n "$dns" ] && echo -n > $RESOLV_CONF
                 [ -n "$domain" ] && echo search $domain >> $RESOLV_CONF
                 for i in $dns ; do
                         echo adding dns $i
```

そして、`/etc/resolv.conf`にGoogle Public DNSでも設定しておきましょう。

```text:/etc/resolv.conf
nameserver 8.8.8.8
```

さて、これで動くと思います。やれやれです。

## 今後について

Dockerはまだ正式版でもなく、boot2dockerもまだまだ変わる可能性があります。
ここにある情報も一時的かもしれませんが、参考になれば幸いです。
内容にミス等があればコメントでご指摘ください。

複数インスタンスで異なるディストリビューションやバージョンのcookbookのテストを実行できるようになると、OSの移行なども視野に入れて動かすことが出来ますね。