Docker/K8S実践コンテナ開発入門@24日目

つまづいている点は一旦置いておいておき、
「コンテナの運用」についての勉強をしていきます。

ロギングの運用

コンテナでは開発のみではなく、運用上の理解が必要
ログの効率的な管理などについて勉強していきます。

コンテナにおけるロギング

  • ライブラリの殆どにはログローテートやフォーマッターの機能などが備えられている。
  • Dockerでは、ログライブラリを使ってもファイルではなく標準出力することやFluentdなどのログコレクタで収集することも多い
  • 総じて、Docker容易にログ収集可能
標準出力とログ

書籍2.1.2 で利用していたアプリケーションを利用する。

■コマンド

lawrence@Chocolate job % docker container run -it --rm -p 8080:8080 gihyodocker/echo:latest
2020/05/24 14:05:42 start server
2020/05/24 14:06:09 received request   //curl http://localhost:8080を実行

これは標準出力だけですが、次にホストに出力されているかを見てみます。
ログはLinuxKit上の仮想マシン上に出力されるとのこと

containerを特定した後に、以下のコマンドで確認する。
※「docker ps」で行けると思ったのですが、これだとコンテナIDが最初の12桁しか出力されないので、
オプションをつけて「docker ps --no-trunc」を実行することで情報がフルで取得できます。

■確認コマンド

docker run -it --rm -v /var/lib/docker/containers:/json-log alpine ash

/json-log # cd 04ebc8a5fdb0636e205eafd1d6602476d4469c4ad75996976c80a0bc93d8d3ad
/json-log/04ebc8a5fdb0636e205eafd1d6602476d4469c4ad75996976c80a0bc93d8d3ad # ls
04ebc8a5fdb0636e205eafd1d6602476d4469c4ad75996976c80a0bc93d8d3ad-json.log  hosts
checkpoints                                                                mounts
config.v2.json                                                             resolv.conf
hostconfig.json                                                            resolv.conf.hash
hostname
/json-log/04ebc8a5fdb0636e205eafd1d6602476d4469c4ad75996976c80a0bc93d8d3ad # ls -ltr
total 36
-rw-r--r--    1 root     root            71 May 24 14:05 resolv.conf.hash
-rw-r--r--    1 root     root            68 May 24 14:05 resolv.conf
drwx------    2 root     root          4096 May 24 14:05 mounts
-rw-r--r--    1 root     root           174 May 24 14:05 hosts
-rw-r--r--    1 root     root            13 May 24 14:05 hostname
drwx------    2 root     root          4096 May 24 14:05 checkpoints
-rw-r--r--    1 root     root          1513 May 24 14:05 hostconfig.json
-rw-------    1 root     root          2698 May 24 14:05 config.v2.json
-rw-r-----    1 root     root           209 May 24 14:06 04ebc8a5fdb0636e205eafd1d6602476d4469c4ad75996976c80a0bc93d8d3ad-json.log
/json-log/04ebc8a5fdb0636e205eafd1d6602476d4469c4ad75996976c80a0bc93d8d3ad # cat 04ebc8a5fdb0636e205eafd1d6602476d4469c4ad75996976c80a0bc93d8d3ad-json.log 
{"log":"2020/05/24 14:05:42 start server\r\n","stream":"stdout","time":"2020-05-24T14:05:42.1282499Z"}
{"log":"2020/05/24 14:06:09 received request\r\n","stream":"stdout","time":"2020-05-24T14:06:09.007967Z"}
/json-log/04ebc8a5fdb0636e205eafd1d6602476d4469c4ad75996976c80a0bc93d8d3ad # 


これでJSON形式で出力されていることが確認できました。
コンテナでロギングしていくのがどれがベストなのかは次の章で触れられます。

なおDockerコンテナのログがjson形式でログに出力されているのは、json-fileというdockerデフォルトのlogging driverによるもの
種類は以下の通り

  • syslog
  • journald
  • awslogs
  • gcplogs
  • fluentd

syslog, journaldはlinux標準
aws, gcpはそれぞれのcloudのものですね。
fulentdはOSSのログ管理ツールのようです。

コンテナのログの運用

重要なのは以下の点

  • コンテナの中でログを出力してしまうと、コンテナ削除=docker削除となる。
  • コンテナ内に出力したログがホストに出力される仕組みを活用するのがシンプル

コンテナのログローテート

オプション「--log-opt」でログローテートのパラメータが設定可能
■コマンド

docker container run -it --rm -p 8080:8080 \
--log-opt max-size=1m \
--log-opt max-file=5 \
gihyodocker/echo:latest

個別のDockerだけでなく、
DaemonのAdvancedmでJSONが設定可能なようです。
私のDockerバージョンだとAdvancedの修正方法が不明ですが、、、
f:id:lawrence-twin:20200525000518p:plain

明日以降はエラー対処またはFulentd、ElasticSearchを利用していきます。