Chef-containerを試してみる

# はじめに
仕事忙しくて全然知らなかったんですけど、`Chef-container`というのが[リリース](https://www.getchef.com/blog/2014/07/15/release-chef-container-0-2-0-beta/)されたらしいです。
Cookbookとかの既存資産を流用できるのは大きいなあ、と思いつつ、そうでないなら別に使う必要ないのかも、なんて言いながら、やっぱり興味があるのでちょっと遊んでみます。
以下、ちょっと動かしてみた記録。導入手順くらいにはなると思います。
※dockerを`sudo`なしで実行できるようにしてます。

# 環境
* Ubuntu 14.04
* Ruby 2.1.2p95
* Docker 1.3.0

# 準備
前提として、既に`Ruby`、`Docker`の準備が済んでるものとします。

```shell-session
$ mkdir cc-test
$ cd cc-test
$ vi Gemfile
$ bundle install --path=vendor/bundle
$ bundle exec knife container docker init chef/ubuntu-14.04 -r "recipe[apache2]" -z -b
$ docker images
REPOSITORY            TAG                   IMAGE ID            CREATED             VIRTUAL SIZE
chef/ubuntu-12.04     11                    50d3c5c9e133        4 weeks ago         311.9 MB
chef/ubuntu-12.04     11.16                 50d3c5c9e133        4 weeks ago         311.9 MB
chef/ubuntu-12.04     11.16.2               50d3c5c9e133        4 weeks ago         311.9 MB
chef/ubuntu-12.04     latest                50d3c5c9e133        4 weeks ago         311.9 MB
chef/ubuntu-14.04     latest                50d3c5c9e133        4 weeks ago         311.9 MB
$ tree dockerfiles
dockerfiles
└── chef
    └── ubuntu-14.04
        ├── Berksfile
        ├── Dockerfile
        └── chef
            ├── first-boot.json
            └── zero.rb
```

```rb:Gemfile
source 'https://rubygems.org'

gem 'berkshelf'
gem 'knife-container'
gem 'chef-container'
```

これで準備できたっぽい？
あとは必要なCookbookを`Berksfile`に突っ込んで、`first-boot.json`をごちゃごちゃすればいいのかな。

# 起動してみる
の前に、Dockerなので、イメージをビルドしなきゃいけません。
ビルドしてから起動します。

```shell-session
$ bundle exec knife container docker build chef/ubuntu-14.04 -z
# Berkshelf使ってCookbook落としてきたり、いろいろしてるみたい
# パッと見、いったんコンテナ起動して、なんやかやしているようにも見える。気のせいかもしれない。
$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
chef/ubuntu-14.04   latest              2e5a819f5009        2 minutes ago       351.3 MB
chef/ubuntu-12.04   11                  50d3c5c9e133        4 weeks ago         311.9 MB
chef/ubuntu-12.04   11.16               50d3c5c9e133        4 weeks ago         311.9 MB
chef/ubuntu-12.04   11.16.2             50d3c5c9e133        4 weeks ago         311.9 MB
chef/ubuntu-12.04   latest              50d3c5c9e133        4 weeks ago         311.9 MB
$ docker run -P chef/ubuntu-14.04
# Chefがいろいろやってる
# 何してるのか見たかっただけなので、抜ける
$ docker ps -a
CONTAINER ID        IMAGE                      COMMAND                CREATED              STATUS                          PORTS                   NAMES
f9bbf8437f96        chef/ubuntu-14.04:latest   "chef-init --onboot"   About a minute ago   Up About a minute               0.0.0.0:49156->80/tcp   sick_euclid
$ curl localhost:49156
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>404 Not Found</title>
</head><body>
<h1>Not Found</h1>
<p>The requested URL / was not found on this server.</p>
<hr>
<address>Apache Server at localhost Port 49156</address>
</body></html>
```

動いた、っぽい？
ポートなんかはもしかしたら自分で`EXPOSE`しなきゃいけないのかと思ってたんですけど、80だけは解放してくれてました
\# 誰がどこでやってるのかはわかりません。。。

※今もう一度最初からやってみたら、解放してくれてませんでした。。。
　多分いろいろやってた時のイメージがそのまま残ってたんだと思います。
　この辺は、後でDockerfile弄って`EXPOSE`しろってことなんですね（ですよね？）。

# 所感
Chef-container動かすのに（当然ですが）コンテナの中にChef-initを入れておく必要があるので、その辺ちょっと面倒だなー、と。
<del>まあ`chef/ubuntu-14.04`をベースに、適当な名前でイメージ作ってDockerHubにあげておいて、それに作りこんでいく　って形に今のところはなるのかな。</del>
いかんせんまだβなので、まだまだ便利になっていくのだろうと思ってます。

とりあえずもうちょっと遊んでみようと思います。

# 追記
勘違いしてました。

```shell-session
$ bundle exec knife container docker init agen/image_name -z -b -f chef/ubuntu-14.04:latest -r 'recipe[apache2]'
```

チュートリアルがそうだったので、てっきりそうでしか使えないのかと思ってたんですけど、`chef/ubuntu-14.04:latest`をベースに、自分で好きな名前でタグ付けしてくれるんですね。。。

ちなみに、とりあえずDockerfileだけ作りたかったので

```shell-session
$ bundle exec knife container docker init agen/image_name -z -b -f chef/ubuntu-14.04:latest
```

としたら、`first-boot.json`とか`zero.rb`作ってくれませんでした。
`-b`指定したのが悪いのかと思って`-b`抜いて実行すると、ちゃんと`first-boot.json`と`zero.rb`は作ってくれたんですけど

```shell-session
$ bundle exec knife container docker init agen/image_name -z -f chef/ubuntu-14.04:latest
$ bundle exec knife container docker build agen/image_name -z
2014/10/24 14:52:01 stat ./dockerfiles/agen/image_name: no such file or directory
```

と怒られました。
この時のディレクトリ構成は

```shell-session
$ tree dockerfiles
dockerfiles
└── agen
    └── image_name
        ├── Dockerfile
        └── chef
            ├── cookbooks
            ├── first-boot.json
            └── zero.rb
```

`Berkshelf`使ってた時と違い、`cookbooks`なんてディレクトリが作られてます。
Cookbookないし`first-boot.json`の`run_list`は空だしで、まあ怒られるとは思ってたんですけど、「そんなディレクトリない」と怒られると、なんだかもやっとします。

仕方ないので、`-b`指定した上で、とりあえず`-r 'recipe[apache2]'`付けてやってみたところ、

```shell-session
$ bundle exec knife container docker init agen/image_name -z -b -f chef/ubuntu-14.04:latest -r 'recipe[apache2]'
$ tree dockerfiles
dockerfiles
└── agen
    └── image_name
        ├── Berksfile
        ├── Dockerfile
        └── chef
            ├── first-boot.json
            └── zero.rb
$ bundle exec knife container docker build agen/image_name -z
2014/10/24 15:29:30 no Dockerfile found in ./dockerfiles/agen/image_name
```

無理でした。
こうなると、怒られた時点でいったいカレントディレクトリはどこになってるのか？　と思ってきますよね。
なので、フルパスで指定してみました。

```shell-session
$ bundle exec knife container docker init agen/image_name -z -b -f chef/ubuntu-14.04:latest -r 'recipe[apache2]'
$ bundle exec knife container docker build agen/image_name -z -d `pwd`/dockerfiles
Successfully built e02b85fd1df6
```

さすがにこれで動かないってことはないだろうと思ってたんですけど、やっぱり動きました。
ちゃんと`docker run`できます。

つーわけで、たぶんカレントディレクトリが自分の意図しないところになってて、やれDockerfileがないだのと怒ってたのだと断定。
しかしそうなると、なんで追記前の状態ではちゃんと動いたのだろう？　とマジで謎。