はじめに
仕事忙しくて全然知らなかったんですけど、Chef-container
というのがリリースされたらしいです。
Cookbookとかの既存資産を流用できるのは大きいなあ、と思いつつ、そうでないなら別に使う必要ないのかも、なんて言いながら、やっぱり興味があるのでちょっと遊んでみます。
以下、ちょっと動かしてみた記録。導入手順くらいにはなると思います。
※dockerをsudo
なしで実行できるようにしてます。
環境
- Ubuntu 14.04
- Ruby 2.1.2p95
- Docker 1.3.0
準備
前提として、既にRuby
、Docker
の準備が済んでるものとします。
$ 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
source 'https://rubygems.org'
gem 'berkshelf'
gem 'knife-container'
gem 'chef-container'
これで準備できたっぽい?
あとは必要なCookbookをBerksfile
に突っ込んで、first-boot.json
をごちゃごちゃすればいいのかな。
起動してみる
の前に、Dockerなので、イメージをビルドしなきゃいけません。
ビルドしてから起動します。
$ 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を入れておく必要があるので、その辺ちょっと面倒だなー、と。
まあchef/ubuntu-14.04
をベースに、適当な名前でイメージ作ってDockerHubにあげておいて、それに作りこんでいく って形に今のところはなるのかな。
いかんせんまだβなので、まだまだ便利になっていくのだろうと思ってます。
とりあえずもうちょっと遊んでみようと思います。
追記
勘違いしてました。
$ 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だけ作りたかったので
$ 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
は作ってくれたんですけど
$ 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
と怒られました。
この時のディレクトリ構成は
$ 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]'
付けてやってみたところ、
$ 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
無理でした。
こうなると、怒られた時点でいったいカレントディレクトリはどこになってるのか? と思ってきますよね。
なので、フルパスで指定してみました。
$ 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がないだのと怒ってたのだと断定。
しかしそうなると、なんで追記前の状態ではちゃんと動いたのだろう? とマジで謎。