Posted on May 4
みんな大好き、私も大好き、Docker
のドキュメントを見ていたら(読んでたわけではない)Chef
や Puppet
から直接 Docker
をイジれるようなので試してみる。
Docker
のドキュメントをそのまま参考にする。
以下は各ソースコード。
既に chef-docker
については下記にて紹介されている。
また、Chef
の Berkshelf
の使い方については下記が参考になった。
以前に自分でも Berkshelf
について書いたが、書いた当時よりも Berkshelf
のバージョンが上がっていたりして書式等も変わっており殆ど役に立たなかったので改めて Berkshelf
の書き方については自分なりに纏めてみたいと思う。
EC2
インスタンスt1.micro
CentOS
Chef
が使える環境を用意する。
上の記事で利用した環境をそのまま利用するが Chef
そのものに関しては下記のように Omnibus
インストーラーでインストールした。
curl -L https://www.opscode.com/chef/install.sh | bash
また、knife-solo
や berkshelf
については以下のようにインストールした。
/opt/chef/embedded/bin/gem install knife-solo --no-ri --no-rdoc -V
/opt/chef/embedded/bin/gem install berkshelf --no-ri --no-rdoc -V
berkshelf
のインストール途中にコンパイルのプロセスが kill
されてしまう現象が発生した。(t1.micro
で十分なメモリと swap
領域が不足していた為かと思われる)
ひと通り役者が揃ったところで Chef
の場合はもうひと手間。Chef
のリポジトリを作成する。
knife solo init chef-repo-test
次に Berkshelf
を利用して docker
の Cookbook
を取得する。
cd chef-repo-test
rm -rf cookbooks
vim Berksfile
Berksfile
は以下のように記述する。
source "https://api.berkshelf.com/"
cookbook 'docker'
記述したら以下を実行する。今回は Chef
に同梱された Ruby
を利用している為、/opt/chef/embedded/bin/berks
となっているが環境に応じて読み替えること。
/opt/chef/embedded/bin/berks vendor cookbooks
実行後、cookbooks
以下には docker
に関係する cookbook
がインストールされている。
上記の状態で docker
パッケージのインストールを行うことは可能だが、別途 cookbook
を作ってみたいので以下のようにして cookbook
を作成する。
cd /root/chef-repo-test/site-cookbooks
/opt/chef/embedded/bin/berks cookbook docker-test .
簡単なレシピを以下のように書く。
今回は chef-solo
を使って cookbook
を適用するので solo.rb
を以下のように用意。
file_cache_path "/tmp/chef-solo"
cookbook_path ["/root/chef-repo-test/cookbooks", "/root/chef-repo-test/site-cookbooks"]
role_path "/root/chef-repo-test/roles"
log_level :info
そして適用先は localhost
ということで nodes/localhost.json
は以下のように用意。
{
"run_list": [
"recipe[docker]",
"recipe[docker-test]"
]
}
諸々の準備が整ったところで chef-solo
を実行して cookbook
を適用する。
cd /root/chef-repo-test
chef-solo -c solo.rb -j nodes/localhost.json
おお、やってますな。一発目はなぜかコケてしまったが改めて chef-solo
を実行すると…以下のようなログを出力して正常に終了した。
ちなみに docker ps -a
とか docker images
すると…
ファンタスティック!
Chef
の実行環境を用意するのに若干手間取って(Berkshelf
の書き方とか使い方とかで)しまったが、簡単にレシピから Dokcer
を操作することが出来た(出来そう)。また、Cookbook
の README
を見ると docker pull
や docker run
以外のことも色々と出来そうなので試してみたい。
尚、Chef
そのものではないが、以下の点には注意する。
Berkshelf
のインストール(意外に負荷が高い)Berkshelf
の使い方(install
ではなくて vendor
を使う)EC2
インスタンスt1.micro
CentOS
Puppet
が使える環境を用意する。
上の記事で利用した環境をそのまま利用する。また、合わせてモジュールもインストールする。
puppet module install garethr/docker
インストールされるモジュールは下記のモジュール。
以下のようなマニフェストを書いて /etc/puppet/manifests/site.pp
に保存する。
チョー簡単。
include 'docker'
で Docker
のパッケージをインストールする。
docker::image { $IMAGES :
ensure => 'present',
}
上記で docker pull $IMAGE(S)
が実行される。
docker::run { $CONTAINER :
image => 'centos',
command => 'echo "a"',
}
上記で docker run -d centos echo "a"
が実行される。
puppet apply
でマニフェストを適用してみる。尚、上記のマニフェスト一発目だとパッケージのインストールだけで終了してしまうので注意。もう一度、マニフェストを適用するか、パッケージの終了後に image
と run
を実行すると Warning
等が出ない。
cd /etc/puppet
puppet apply manifests/site.pp
まずはパッケージのインストール。
次に docker pull
と docker run
を一緒に…。
ついでに docker ps -a
や docker images
で確認してみる。
マニフェストの書き方を勉強する必要があるが、Chef
と同様に Puppet
から簡単に Docker
コンテナ操作が出来そう。
駆け足で Chef
や Puppet
のレシピやマニフェストを使って Docker
の操作を体験した。どちらもコミュニティが提供している Cookbook
や Module
を利用することで簡単に操作は出来そうだ。最低限の利用(pull
して run
)程度であればどっちも同じだと思われるのでどっちを使うかはお好みで。
但し、chef-docker
の方が image
や container
の操作等が充実している印象を受けた。
また、上記にてプライベートリポジトリから pull
して run
して変更分を commit
してという流れが書かれていて実際の利用のシチュエーションをイメージ出来ると思われる。
2014 かっぱのほげふが