Docker+Chefで環境作り 1 PHP/Nginx

前回のDocker + Chef で楽々環境作りからの続きになります。

物事には順序というものが必要なので、Chef実践入門を参考にしつつ、PHP環境~Apacheと進んでからSinatraを・・といきたいと思います。書籍の方ではVagrantとVirtualboxとChefなんですが、やっぱりDockerとChefで進めます。

Capstranoとか

こういう自動化な事柄を調べて進めていると、CapistranoとFabricというものが最近目につくようになってきました。Capstranoで何ができるのかというと、こないだSinatraでイベント収集アプリを作成したのですが、本番サーバーで可動させるまでの工程が

・ローカルでアプリを作成
・Githubにアップ
・本番環境でGithubからClone
・本番サーバーでちょこちょこ書き直し
・出来上がり!

という流れだったのですが、そのデプロイまでの工程を自動化してくれるようです。
デプロイツールって書いてあるのを見てなるほどと合点がいきました。

育てる

前回作ったBaseレシピを育てていく感じですね。

まだまだ使えたもんじゃないですがリンクだけ。
https://github.com/takekentw/chef-docker_base

やっぱsshで繋がりたい

前回は「コンテナだし、/bin/bashでコンテナをrunした方がいいかな」と思ったんですが、最終的にはsshで繋ぎたいなぁと思ったのでまずはそこから修正か。

方法は2通り。ポート番号を指定するか、pipeworkを使ってIPアドレスを割り振るか。
前者、後者とも、どちらにしろ走らせた後にコンテナIDを確認するか、ポート番号を確認するという行為は必要かと思うので(全自動もあるかもしれないが、今は知らない)、前者でいいかな。

以下のところをレシピに追記して、新しく作ったものでもいいし、ベースのレシピでもいいし。

service "sshd" do
 supports status: true, restart: true, reload: true
 action [:enable, :start]
 end

sshdを起動するようにコンテナを起動すればOKです。
無理だったらどこか間違えていると思われ。

$ sudo docker run -d -p 22 base:latest /usr/sbin/sshd-D
$ ssh -p 49153 localhost
The authenticity of host '[localhost]:49153 ([::1]:49153)' can't be established.
RSA key fingerprint is 9f:e8:4e:ed:28:8f:ce:22:4a:c6:00:15:10:f0:72:a8.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '[localhost]:49153' (RSA) to the list of known hosts.
takeken@localhost's password:
Last login: Tue Dec  9 11:13:58 2014 from 172.17.42.1

無理だった場合、一番簡単な確認方法はオーソドックスに/bin/bashでコンテナを作って、シェルでコンテナの中の状態を確認するのが遠回りでも遠回りじゃない!と思います。
プログラミングに慣れている人はプログラムの見直しになるのだろうけれどね。

ifconfigリソースでIPアドレスは指定できるのか

Dockerは独自の方法で172.17.0.0/16のIPアドレスを割り振っているようなので、レシピで振ったとしても無理だと思います。個人でコンテナに設定するか、pipeworkを使うのが良さげです。

まずはPHPな環境から

まずはPHP+Nginxな環境から。いっちばーん最初にChefを触ったときにNginxのインストールには失敗しましたが、どうやらコミュニティクックブックを使う必要があったようです。なるほどね。
後は、ここからはインターネットの情報だけではなくて、書籍の内容も入ってくるので端折っています。
詳細は技評さんのサイトも参照くだしあ。
技術評論社
書籍に載っているサンプルコードは全てネットで公開しているらしいので、そんな気にする必要はないと思うけれど、そのままってのも芸がないしね。

[takeken@ubuntu]$ knife cookbook create nginx -o site-cookbooks
** Creating cookbook nginx
** Creating README for cookbook: nginx
** Creating CHANGELOG for cookbook: nginx
** Creating metadata for cookbook: nginx

[takeken@ubuntu]$ vim site-cookbooks/nginx/recipes/default.rb

berks install –path はコマンドが変更になってます。

[takeken@ubuntu]$ berks vendor cookbooks
Resolving cookbook dependencies...
Fetching 'nginx' from source at site-cookbooks/nginx
Fetching cookbook index from https://supermarket.getchef.com...
Using nginx (0.1.0) from source at site-cookbooks/nginx
Using selinux (0.8.0)
Using yum (3.5.1)
Installing yum-epel (0.5.3)
Vendoring nginx (0.1.0) to cookbooks/nginx
Vendoring selinux (0.8.0) to cookbooks/selinux
Vendoring yum (3.5.1) to cookbooks/yum
Vendoring yum-epel (0.5.3) to cookbooks/yum-epel

chef-repo/nodes/docker.jsonを編集して動作確認します。

[takeken@ubuntu]$ cat chef-repo/nodes/docker.json
{
 "run_list" : [
                "recipe[yum]",
                "recipe[yum-epel]",
                "nginx",
                "recipe[selinux::disabled]",
                "recipe[base]",
                "recipe[nginx]"
        ]
}

ビルドが完了するまで何故かめちゃくちゃ時間がかかった。
まだNginxを入れただけなので、sshで入ってnginxを起動して確認。
細かい理由はDockerの仕組みの事です。

Chef01

続いてphp-fpm。

[takeken@ubuntu]$ knife cookbook create php-env -o site-cookbooks
[takeken@ubuntu]$ vi site-cookbooks/php-env/recipes/default.rb
[takeken@ubuntu]$ vi nodes/docker.json
 "recipe[php-env]"     # 追加します。
[takeken@ubuntu]$ vi Berksfile
 cookbook 'php-env', path: "./site-cookbooks/php-env" #追加します。
コミュニティCookbookを準備。
[takeken@ubuntu]$ berks vendor cookbooks
Resolving cookbook dependencies...
Fetching 'nginx' from source at site-cookbooks/nginx
Fetching 'php-env' from source at site-cookbooks/php-env
Fetching cookbook index from https://supermarket.getchef.com...
Using nginx (0.1.0) from source at site-cookbooks/nginx
Using php-env (0.1.0) from source at site-cookbooks/php-env
Using selinux (0.8.0)
Using yum (3.5.1)
Using yum-epel (0.5.3)
Vendoring nginx (0.1.0) to ./cookbooks/nginx
Vendoring php-env (0.1.0) to ./cookbooks/php-env
Vendoring selinux (0.8.0) to ./cookbooks/selinux
Vendoring yum (3.5.1) to ./cookbooks/yum
Vendoring yum-epel (0.5.3) to ./cookbooks/yum-epel

んで、ビルドー。

が終わったので、確認。

[takeken@755acbdb1068 ~]$ php-fpm -v
PHP 5.3.3 (fpm-fcgi) (built: Oct 30 2014 20:14:56)

まだnginxとphpとの設定ができていないので、ここでerbファイルが出てくるのですが、nginxもいつの間にか(最初からかも)includeするconfファイルになっていた。

こいつをテンプレートとして、erbを作っていくます。

-rw-r--r-- 1 root root 1290 Nov 11 16:27 /etc/nginx/conf.d/default.conf

--- chef-repo/site-cookbooks/nginx/templates/default/default.conf.erb   2014-12-10 11:34:04.076380776 +0900
+++ /home/takeken/default.conf.etb      2014-12-10 11:30:18.008380926 +0900
@@ -37,15 +37,13 @@

# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
#
-               <% if node[ 'nginx' ][ 'env' ].include?("php") %>
-    location ~ \.php$ {
+    #location ~ \.php$ {
#    root           html;
-        fastcgi_pass   127.0.0.1:9000;
-        fastcgi_index  index.php;
-        fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
-        include        fastcgi_params;
-    }
-               <% end %>
+    #    fastcgi_pass   127.0.0.1:9000;
+    #    fastcgi_index  index.php;
+    #    fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
+    #    include        fastcgi_params;
+    #}

# deny access to .htaccess files, if Apache's document root
# concurs with nginx's one

chef-repo/site-cookbooks/nginx/recipes/default.rbにtemplateのリソースを追加。

temlate 'default.conf' do
path '/etc/nginx/conf.d/default.conf'
source "default.conf.erb"
owner 'root'
group 'root'
mode '0644'
notifies :reload, "service[nginx]"
end

何回やっても上手くいかず、理由は上のレシピを見ると分かるのですが、リソースのtemplateがtemlateになってました。
そりゃあ読まず、読ませずな訳だ。\(^o^)/
エラーが出る訳じゃないよってのは勉強になった。

この辺でAttributeが出てきます。Sinatraでも出てきていた<%  >内を読ませるアレです。

erbを用意してレシピを書き換えたら、Docker.jsonに追記して、Attributeファイルを書いて、最後にberksを叩いてビルドですかな。

[takeken@ubuntu]$ cat chef-repo/nodes/docker.json
{
"nginx":{
"env":["php"]
},

"run_list" : [
"recipe[yum]",
"recipe[yum-epel]",
"nginx",
"recipe[selinux::disabled]",
"recipe[base]",
"recipe[nginx]",
"recipe[php-env]"
]
}

$ berks vendor cookbooks 

出来たコンテナが↓これです。sshを起動してログインという手間が面倒なのでDocker runでシェルを起動して確認しました。
さっきも書いた通りtemplateリソースがtemlateになっていて何回も失敗していたのですが、confファイルへのinclude に問題があるのかと思い違いしてnginx.confに書き直したのでさっきの例とは異なっています(´・ω・`)
これが手入力の怖さだね。

bash-4.1# tail /etc/nginx/nginx.conf
root   /usr/share/nginx/html;
}
location ~ \.php$ {
fastcgi_pass   127.0.0.1:9000;
fastcgi_index  index.php;
fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
include        fastcgi_params;
}
}
}

書籍だとプロビジョニング、ここではDocker buildのことで、どっちもChef-soloが走っているので同じ事なのでログの確認はできます。

これでphpとnginxの環境作りまで終わりました。

[takeken@ubuntu]$ ssh 172.17.0.69
takeken@172.17.0.69's password:
Last login: Wed Dec 10 09:01:51 2014 from 172.17.42.1
[takeken@367ed09b5de0 ~]$ php -v
PHP 5.3.3 (cli) (built: Oct 30 2014 20:12:53)
Copyright (c) 1997-2010 The PHP Group
Zend Engine v2.3.0, Copyright (c) 1998-2010 Zend Technologies
with Zend OPcache v7.0.3, Copyright (c) 1999-2014, by Zend Technologies
[takeken@367ed09b5de0 ~]$ nginx -v
nginx version: nginx/1.0.15

ここらでgitの更新でもしておきます。裏では随分と失敗しているのでgitのロールバックはけっこう使っています・・。

[takeken@ubuntu]$ git add .
[takeken@ubuntu]$ git commit -m "20141210:nginx/php"
[takeken@ubuntu]$ git push

 

参考書籍

Chef実践入門 技術評論社

 

Related Posts


投稿者: Takeken

インターネット利用者のITリテラシーを向上したいという設定の2次元キャラです。 サーバー弄りからプログラミングまで手を付けた自称エッセイストなたけけんの物語。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です