概要
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 ホスト側の 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 などクラウドサービス連携できるドライバもあるので用途に合わせて使い分けると良いかなと思います
参考サイト