2017年5月19日金曜日

docker logging driver を使ってみた

概要

docker はコンテナ内で動作するアプリの標準出力と標準エラーを docker logs で確認することができます
これは logging driver の json-file というドライバを使うことで実現しています
それ以外にも logging driver が存在しますが今回は json-file, syslog, journald, fluend を使ってみました

環境

  • CentOS 7.3.1611
  • docker 17.03

json-file

ログを吐き続けるコンテナを起動します

docker run --rm -it --name json-file alpine /bin/sh -c "while :;do  date; sleep 3; done;"
  • docker logs -f json-file

でログが出力されます
docker ホスト側の json ファイルは /var/lib/docker/containers/container_id/container_id-json.log に出力されています
json-file ドライバを使っている場合このログファイルが肥大化し続ける可能性があります

コンテナが再生成される可能性なども考えるとこのファイルをログ集約するのはあまり好ましくありません
そこで他の logging driver を使用します

syslog

syslog ドライバを使ったログを吐き続けるコンテナを起動します

docker run --rm -it --log-driver=syslog alpine /bin/sh -c "while :;do  date; sleep 3; done;"
  • tail -f /var/log/messages

でログを確認することができます
逆に docker logs でログを確認することができなくなります
ただ、先程あった /var/lib/docker/containers/container_id/container_id-json.log が docker ホストに出力されなくなります

この場合 docker ホストの syslog を使ってログを集約することができます
どこか別のホストにログを更に投げたい場合は rsyslog などを代用すれば良いかなと思います
複数のコンテナのログが混ざることになるので syslog のルールをちゃんと作成する必要はあります

journald

journald ドライバを使ったログを吐き続けるコンテナを起動します

docker run --rm -it --log-driver=journald alpine /bin/sh -c "while :;do  date; sleep 3; done;"
  • journalctl -f
  • tail -f /var/log/messages

でログを確認することができます
journalctl の場合 blob data として表示されてしまいます
journald の場合 docker logs は使えます
/var/lib/docker/containers/container_id/container_id-json.log は docker ホストに出力されなくなります

journalctl の場合も syslog 同様に journald.conf などでロギングルールを作成したほうが良いと思います
docker logs が使える分こちらの方が利便性が高いかもしれません

fluentd

まず fluend コンテナを起動します

cat << EOF > fluent.conf
<source>
  @type forward
  port 24224
</source>

<match docker.**>
  @type stdout
</match>
EOF
docker run --rm -p 24224:24224 -p 24224:24224/udp -v $(pwd)/fluent.conf:/fluentd/etc -e FLUENTD_CONF=fluent.conf --name=fluentd fluent/fluentd

で起動できます
fluent/fluend コンテナの使い方や設定できる環境変数などはこちらを参照してください

そして fluentd ドライバを使ったログを吐き続けるコンテナを起動します

docker run --rm -it --log-driver=fluentd --log-opt fluentd-address=localhost:24224 --log-opt tag="docker.{{.Name}}" alpine /bin/sh -c "while :;do  date; sleep 3; done;"

すると fluentd コンテナ側にログが表示されると思います
先に fluentd 側のコンテナを起動しておく必要があります
そうしないと fluentd のポートが LISTEN していないといわれエラーとなります

fluentd ドライバの場合も docker logs は使えません

その他

コンテナが使っている logging driver を確認する方法

  • docker inspect -f '{{.HostConfig.LogConfig.Type}}' [container_id]

最後に

docker の logging driver 3 つほどを試してみました
基本はこれだけ使えていれば事足りると思います

他にも gelf, awslogs, splunk, etwlogs, gcplogs などクラウドサービス連携できるドライバもあるので用途に合わせて使い分けると良いかなと思います

参考サイト

1 件のコメント:

  1. docker run --rm -p 24224:24224 -p 24224:24224/udp -v $(pwd):/fluentd/etc -e FLUENTD_CONF=fluent.conf --name=fluentd fluent/fluentd:v1.16

    返信削除