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の修正方法が不明ですが、、、
明日以降はエラー対処またはFulentd、ElasticSearchを利用していきます。