こんにちは。@jedipunkz です。
昨晩 Chef が Chef-Container を発表しました。
- http://www.getchef.com/blog/2014/07/15/release-chef-container-0-2-0-beta/
- http://docs.opscode.com/containers.html
まだ Beta リリースでバージョンは 0.2.0 です。(gem だと 0.1.1)
Docker を代表とするコンテナ周りの技術が最近、盛んにリリースされていますし、今 後クラウドプラットフォーム上でコンテナを使ってアプリを動かすケースも増えてくる のではないでしょうか。Dockerfile を使っても Chef-Solo を使ってソフトウェアをデ プロイ出来るのだけどそれだけだとしんどいので、コンテナに特化した Chef が出てき たってことだと思います。特徴として SSH でログインしてブートストラップするので はなくて Runit + Chef-init を用いてコンテナにデプロイすることが挙げられます。
では実際に使ってみたのでその時の手順をまとめてみます。
事前に用意する環境
下記のソフトウェアを予めインストールしておきましょう。
- docker
- chef
- berkshelf
ここで注意なのですが後に knife コマンドを使って Docker イメージをビルドします。 つまり root 権限が必要です。rbenv 等を使って ruby, chef をインストールすると、 辛いかもしれませんので OS のパッケージを使ってインストールすると良いと思います。 この辺りは今後改善策が出てくるかも…。
尚、インストール方法はここでは割愛します。
Chef-Container のインストール
下記の2つの Gems をインストールします。
- knife-container
- chef-container
% sudo gem install knife-container
% sudo gem install chef-container
使用方法
まず knife コマンドを使って操作に必要なディレクトリとファイルを生成します。
% knife container docker init chef/ubuntu-12.04 -r 'recipe[apache2]' -z -b
ここで ‘chef/ubuntu-12.04’ は Docker のイメージ名です。chef-init 等の環境が予 め入っていました。このイメージ以外では今のところ動作を確認していません..。これは後にまとめで触れます。
上記のコマンドの結果で得られるディレクトリとファイル達です。
.
└── dockerfiles
└── chef
└── ubuntu-12.04
├── Berksfile
├── chef
│ ├── first-boot.json
│ └── zero.rb
└── Dockerfile
また dockerfiles/chef/ubuntu-12.04/Dockerfile を確認すると…
# BASE chef/ubuntu-12.04:latest
FROM chef/ubuntu-12.04
ADD chef/ /etc/chef/
RUN chef-init --bootstrap
RUN rm -rf /etc/chef/secure/*
ENTRYPOINT ["chef-init"]
CMD ["--onboot"]
イメージを取得 -> ディレクトリ同期 -> chef-init 実行 -> /etc/chef/secure 配下削除、と 実行しているようです。
次に first-boot.json という名前のファイルを生成します。chef-init が解釈するファ イルです。
{
"run_list": [
"recipe[apache2]"
],
"container_service": {
"apache2": {
"command": "/usr/sbin/apache2 -k start"
}
}
}
ではいよいよ knife コマンドで Docker イメージをビルドします。
% sudo knife container docker build chef/ubuntu-12.04 -z
すると、下記のように Docker イメージが出来上がります。
% sudo docker images
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
chef/ubuntu-12.04 11 03fd2357596f 4 days ago 397.7 MB
chef/ubuntu-12.04 11.12 03fd2357596f 4 days ago 397.7 MB
chef/ubuntu-12.04 11.12.8 03fd2357596f 4 days ago 397.7 MB
出来上がったイメージを利用してコンテナを稼働します。
% sudo docker run chef/ubuntu-12.04
% sudo docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
191cfdaf0bdb 650a89f73ed8 chef-init --onboot 39 minutes ago Up 39 minutes agitated_almeida
まとめ
コンテナと言っても今現在は Docker のみに対応しているようです。また init の際に指定する Docker イメージ の中に chef-init が入っている必要がありそうです。Build する前に予めイメージを作っておく必要があるという のはしんどいので、今後改善されるかもしれません。
そもそも Docker やコンテナ技術の登場で Puppet, Chef を代表とするツール類が不要になるのでは?という議論が 幾つかの場面であったように思います。つまりコンテナのイメージに予めソフトウェアを配布しそれを用いて稼働 することで、マシンが起動した後にデプロイすることが必要ないよね?という発想です。今回紹介したようにコンテナの イメージを生成するのに Chef を用いるということであれば、また別の議論になりそうです。また稼働したコンテナに ソフトウェアをデプロイすることも場合によっては必要なので、この辺りの技術の完成度が上がることを期待したいです。
参考 URL
- CreationLine さんブログ http://www.creationline.com/lab/5346
- 公式サイト http://docs.opscode.com/containers.html