こんにちは
前回はここからどうぞ。
Fluentdによる柔軟なPHPのアプリケーションログ管理をDockerでシミュレートしたい(1)
今回はWEBサーバから、別のログ集約サーバにログを投げる部分を作りました。
要するにdockerのコンテナ間での連携になります。
作成したソースコードはこんな感じです。
https://github.com/niisan-tokyo/log_experioment/tree/throwLog
ログ集約サーバを作る
まず、ログを収集するためのサーバイメージを作ります。
Dockerfile短いんで、全部載せちゃいます。
FROM centos:6.7
#install fluentd
ADD etc/td.repo /etc/yum.repos.d/td.repo
RUN rpm --import https://packages.treasuredata.com/GPG-KEY-td-agent; yum check-update; yes|yum install -y td-agent
RUN yum install -y initscripts
ADD etc/td-agent.conf /etc/td-agent/td-agent.conf
EXPOSE 24224
CMD /usr/sbin/td-agent
これで、ログ集約用のサーバが出来上がりました。
現在このサーバの持っている役割は、前回のPHPローカルサーバにあるfluentdと同じで、投げられたログを受け取って、ファイルに書きだすというものです。
これを用意したら以下のコマンドを叩いて、イメージを作ります。
docker build -t niisan-tokyo/fluentd dockers/fluentd
コンテナ間連携する
コンテナ間連携にはこちらを参考にしました。
WEBサーバのfluentdの設定変更
連携を開始する前に、WEBサーバ側のfluentdの設定も変更しておく必要があります。
niisan-tokyo/etc/td-agent.conf
<match app.**>
- type file
- path /var/log/td-agent/app
+# type file
+# path /var/log/td-agent/app
+ type forward
+ <server>
+ host logger
+ port 24224
+ </server>
</match>
前回までの設定ではログに出力するようにしてありましたが、今回は「loggerという名前のサーバの24224ポートにログを投げる」という設定にしてあります。
この設定に直してから、イメージを作り直しましょう
docker build -t niisan-tokyo/php56
これで準備完了です
コンテナを立ち上げる
ではコンテナを立ち上げましょう。
まずはログ主役用のサーバを立ち上げます。
docker run -d --name fluentlogger niisan-tokyo/fluentd
ここでつけている--name
はコンテナにわかりやすい名前をつけるオプションです。
次にWEBサーバ用のコンテナを立ち上げます。
docker run -d --name web -p 8080:8080 --link fluentlogger:logger niisan-tokyo/php56
ここで大事なのは、--link <コンテナ名>:<エイリアス>
オプションです。
これをつけて起動したコンテナには、--link
オプションで指定したコンテナのipやポートの情報が追加されます。
さらにはhostsに設定が追加されて<エイリアス>で指定したコンテナ名のサーバに接続することができます。
動作を確認する
それでは動作を確認してみましょう。
前回同様、WEBサーバに http://192.168.33.40:8080/ で接続可能し、適当にフォームにスコアを記載し、送信します。
続いてdockerのホスト上で
docker exec -it fluentlogger /bin/bash
tail -f /var/log/td-agent/app.<ハッシュ値>
でログを確認すると、
2015-12-17T09:33:01+00:00 app.scores {"score1":123,"score2":342,"score3":15}
2015-12-17T09:34:49+00:00 app.scores {"score1":23,"score2":52,"score3":345}
こんな感じでログが確認できます。
ちなみに、fluentdの仕様により、PHPから投げられたログをすぐに集約サーバに投げるのではなく、一定時間ログを貯めこんでから、集約サーバに投げるようになっています。
なので、入力値を送信した直後にログが更新されるとは限りません。
ログが書き出されるまで気長に待ちましょう。
まとめ
今回でようやくDockerの本格的活用法が示せたように思います。
こういう使い方ができるというのは、雑誌やコラムなどでいくらでも書かれて入るのですが、実際にどのように実現できているかを細かく書いてあるところは少ないので、今回いろいろと触ってみて、いろいろと実感できたように思います。
次回はさらにMongoDBと連携させ、「柔軟なログ」を実現してしまおうかな、と思います。
Fluentdによる柔軟なPHPのアプリケーションログ管理をDockerでシミュレートしたい(3)
参考
Docker container間の連携について
コンテナの連結と操作 - Docker User Guide
補足
fluentdの設定で、initscriptsをインストールしていますが、いらないと思います。
また、fluentdの起動スクリプトを直打ちしていますが、もっといい方法があるかもしれません。