Chef-Container Beta を使ってみる

こんにちは。@jedipunkz です。

昨晩 Chef が Chef-Container を発表しました。

まだ 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