Mura Docker Chef
05 July 2014
mura-
Docker環境でもChef(chef-solo)の資産を使うべく、DockerとChefの連携を考える。
why?
- Dockerfileをあまりいじりたくない。
- Chefで書いた資産(Recipe)を流用したい。
how to
Chefとの連携自体やったことがないので…
- Using Chef (Docker Official) ChefでDockerをいれる
- docker document using chef
- dockerをinstallしたあとcookbookをどうするかは書かれてないのでここでは割愛。
- OPSCODEにdockerでchefが動くchef-dockerというものがある→chef-docker
- Packerを使う
- Dockerfileにchef実行コマンドを書き、docker build時に実行する
Packerを使う
当初boot2dockerで検証を試みるも、なぜかprovisioningが終わらなかったので、一旦ubuntu上で検証。 (もくもく会当日は、socketがどうたらでエラーになったが、僕が環境変数をうまく指定できてなかった)
1. vagrantにubuntuイメージを用意し、起動
2. ubuntu上にchefとpackerとdockerをinstallする
chefのinstall
オムニバスインストーラーを使う。楽ちん
curl -L http://www.opscode.com/chef/install.sh | bash
packerのinstall
ここからダウンロードしてきて、適当なところへ展開。PATHを通す。
dockerのinstall
パッケージ管理で。
sudo apt-get update
sudo apt-get install docker.io
sudo ln -sf /usr/bin/docker.io /usr/local/bin/docker
下記の用にVagrantfileに記述してしまってもよい。 その場合はvagrant upだけで済む。
Vagrant.configure("2") do |config|
config.vm.box = "precise64"
config.vm.box_url = "http://files.vagrantup.com/precise64.box"
config.vm.provision :docker do |d|
d.pull_images "ubuntu"
end
config.vm.provision :shell, :inline => <<-PREPARE
apt-get -y update
apt-get install -y wget unzip curl
mkdir /home/vagrant/packer
cd /home/vagrant/packer
wget https://dl.bintray.com/mitchellh/packer/0.5.2_linux_amd64.zip
unzip 0.5.2_linux_amd64.zip
echo "export PATH=$PATH:/home/vagrant/packer" > /home/vagrant/.bashrc
PREPARE
end
3. cookbook用意
Recipeの中身は省略します。
knife cookbook create hogehoge -o site-cookbooks
4. Packerの設定ファイル用意
docker_chef.json
{
"builders":[{
"type": "docker",
"image": "ubuntu",
"export_path": "image.tar"
}],
"provisioners":[
{
"type": "shell",
"inline": [
"apt-get -y update",
"apt-get install -y curl"
]
},
{
"type": "chef-solo",
"cookbook_paths": ["site-cookbooks"],
"run_list": ["hogehoge::default"]
}
],
"post-processors": [{
"type": "docker-import",
"repository": "name/hogehoge",
"tag": "latest"
}]
}
5. packerでdockerイメージbuild
packer build docker_chef.json
6. docker imageを見るとイメージが作成されている
vagrant@vagrant-ubuntu-trusty-64:~$ sudo docker images
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
name/hogehoge latest 83e7a18fd734 18 minutes ago 380 MB
Dockerfileにchef実行コマンドを書き、docker build時に実行する
Packerをいれると確かにDockerfileはノータッチでイメージの作成ができたが、 逆にPackerいれたりめんどくさい、という場合は下記のように最低限をDockerfileに記述するのはありかもしれない。
(Dockerがinstallされている前提、recipeが用意されている前提で)
1. Dockerfile用意
FROM centos
ENV CHEFHOME /chef-repo
ADD chef-repo /chef-repo
RUN apt-get -y update
RUN apt-get -y curl
RUN curl -L http://www.opscode.com/chef/install.sh | bash
RUN cd ${CHEFHOME} && chef-solo -c ${CHEFHOME}/solo.rb -j ${CHEFHOME}/nodes/docker.json
2. DockerイメージBuild
docker build -t name/hogehoge
3. docker imageを見るとイメージが作成されている
vagrant@vagrant-ubuntu-trusty-64:~$ sudo docker images
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
name/hogehoge latest 8f2151ea5244 59 seconds ago 420.2 MB
blog comments powered by Disqus