Dockerログのガイド
1. 概要
Docker は、コンテナーでアプリケーションをホストできるようにするオペレーティングシステムレベルの仮想化プラットフォームです。 さらに、アプリケーションとインフラストラクチャの分離が容易になり、ソフトウェアを迅速に配信できます。
Dockerコンテナによって生成されたログファイルには、さまざまな有用な情報が含まれています。 イベントが発生するたびに、Dockerコンテナはログファイルを作成します。
Dockerは、ログの起点、出力ストリームデータ、タイムスタンプなどのログをSTDOUTまたはSTDERRに生成します。 デバッグと問題の根本原因の特定は、ログファイルを使用して実行できます。
このチュートリアルでは、さまざまな方法でDockerログにアクセスする方法について説明します。
2. Dockerログを理解する
Dockerには、主に2種類のログファイルがあります。 Dockerデーモンログは、Dockerサービスの全体的なステータスに関する洞察を提供します。 Dockerコンテナログは、特定のコンテナに関連するすべてのログをカバーします。
主に、Dockerコンテナログにアクセスするためのさまざまなコマンドについて説明します。 docker logs コマンドを使用し、システム上のログファイルに直接アクセスして、コンテナログを調べます。
ログファイルは、発生した内容の詳細を提供するため、問題のデバッグに役立ちます。 Dockerログを分析することで、問題の診断とトラブルシューティングをより迅速に行うことができます。
3. dockerlogsコマンドの使用
先に進む前に、まずサンプルのPostgresDockerコンテナを実行しましょう。
$ docker run -itd -e POSTGRES_USER=baeldung -e POSTGRES_PASSWORD=baeldung -p 5432:5432 -v /data:/var/lib/postgresql/data --name postgresql-baedlung postgres
Unable to find image 'postgres:latest' locally
latest: Pulling from library/postgres
214ca5fb9032: Pull complete
...
95df4ec75c64: Pull complete
Digest: sha256:2c954f8c5d03da58f8b82645b783b56c1135df17e650b186b296fa1bb71f9cfd
Status: Downloaded newer image for postgres:latest
bce34bb3c6175fe92c50d6e5c8d2045062c2b502b9593a258ceb6cafc9a2356a
説明のために、postgresql-baedlungコンテナのcontainerIdを確認してみましょう。
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
bce34bb3c617 postgres "docker-entrypoint.s…" 12 seconds ago Up 10 seconds 0.0.0.0:5432->5432/tcp postgresql-baedlung
上記のコマンドの出力からわかるように、postgresql-baedlungはcontainerId「bce34bb3c617」で実行されています。 次に、 docker logs コマンドを調べて、ログを監視しましょう。
$ docker logs bce34bb3c617
2022-05-16 18:13:58.868 UTC [1] LOG: starting PostgreSQL 14.2 (Debian 14.2-1.pgdg110+1)
on x86_64-pc-linux-gnu, compiled by gcc (Debian 10.2.1-6) 10.2.1 20210110, 64-bit
2022-05-16 18:13:58.869 UTC [1] LOG: listening on IPv4 address "0.0.0.0", port 5432
2022-05-16 18:13:58.869 UTC [1] LOG: listening on IPv6 address "::", port 5432
ここで、ログにはタイムスタンプ付きの出力ストリームのデータが含まれています。 上記のコマンドには、連続ログ出力は含まれていません。 コンテナの継続的なログ出力を表示するには、 docker logsコマンドの“ –follow”オプションを使用する必要があります。
「– follow」オプションは、コンテナーのライブログを監視できるため、最も便利なDockerオプションの1つです。
$ docker logs --follow bce34bb3c617
2022-05-16 18:13:58.868 UTC [1] LOG: starting PostgreSQL 14.2 (Debian 14.2-1.pgdg110+1)
on x86_64-pc-linux-gnu, compiled by gcc (Debian 10.2.1-6) 10.2.1 20210110, 64-bit
...
2022-05-16 18:13:59.018 UTC [1] LOG: database system is ready to accept connections
上記のコマンドの欠点の1つは、最初からすべてのログが含まれることです。コマンドをチェックして、最近のレコードを含む連続ログ出力を表示しましょう。
$ docker logs --follow --tail 1 bce34bb3c617
2022-05-16 18:13:59.018 UTC [1] LOG: database system is ready to accept connections
「since」オプションをdockerlog コマンドとともに使用して、特定の時間のファイルを表示することもできます。
$ docker logs --since 2022-05-16 bce34bb3c617
2022-05-16 18:13:58.868 UTC [1] LOG: starting PostgreSQL 14.2 (Debian 14.2-1.pgdg110+1)
on x86_64-pc-linux-gnu, compiled by gcc (Debian 10.2.1-6) 10.2.1 20210110, 64-bit
...
2022-05-16 18:13:59.018 UTC [1] LOG: database system is ready to accept connections
または、 dockerlogsコマンドの代わりにdockercontainerlogsコマンドを使用することもできます。
$ docker container logs --since 2022-05-16 bce34bb3c617
2022-05-16 18:13:58.868 UTC [1] LOG: starting PostgreSQL 14.2 (Debian 14.2-1.pgdg110+1)
on x86_64-pc-linux-gnu, compiled by gcc (Debian 10.2.1-6) 10.2.1 20210110, 64-bit
...
2022-05-16 18:13:59.018 UTC [1] LOG: database system is ready to accept connections
ここで、上記の出力から、両方のコマンドがまったく同じように機能することがわかります。 dockercontainerlogsコマンドは新しいバージョンでは非推奨になりました。
4. デフォルトのログファイルの使用
Dockerは、すべてのSTDOUTおよびSTDERR出力をJSON形式で保存します。 さらに、ホストマシンからすべてのライブDockerログを監視することができます。 デフォルトでは、Dockerはログファイルをホスト上の専用ディレクトリに保存します。 json-file ログドライバー。 ログファイルのディレクトリは/var/ lib / docker /containers/です。
実例を示すために、postgress-baeldungコンテナのログファイルを確認してみましょう。
$ cat /var/lib/docker/containers/bce34bb3c6175fe92c50d6e5c8d2045062c2b502b9593a258ceb6cafc9a2356a/
bce34bb3c6175fe92c50d6e5c8d2045062c2b502b9593a258ceb6cafc9a2356a-json.log
{"log":"\r\n","stream":"stdout","time":"2022-05-16T18:13:58.833312658Z"}
{"log":"PostgreSQL Database directory appears to contain a database; Skipping initialization\r\n","stream":"stdout","time":"2022-05-16T18:13:58.833360038Z"}
{"log":"\r\n","stream":"stdout","time":"2022-05-16T18:13:58.833368499Z"}
上記の出力では、データがJSON形式であることがわかります。
5. ログファイルのクリア
システムのディスク領域が不足することがあり、Dockerログファイルが多くの領域を占有していることに気付きます。 そのためには、最初にログファイルを見つけてから削除する必要があります。 また、ログファイルをクリアしても、実行中のコンテナの状態に影響がないことを確認してください。
以下は、ホストマシンに保存されているすべてのログファイルをクリアするコマンドです。
$ truncate -s 0 /var/lib/docker/containers/*/*-json.log
上記のコマンドはログファイルを削除しないことに注意してください。 代わりに、ログファイル内のすべてのコンテンツが削除されます。 以下のコマンドを実行することで、特定のコンテナに関連付けられているログファイルを削除できます。
$ truncate -s 0 /var/lib/docker/containers/dd207f11ebf083f97355be1ae18420427dd2e80b061a7bf6fb0afc326ad04b10/*-json.log
コンテナーの開始時に、「– log-optmax-size」および「–log-optmax-file」を使用して外部でログファイルのサイズを制限することもできます。 ] docker run コマンドのオプション:
$ docker run --log-opt max-size=1k --log-opt max-file=5 -itd -e POSTGRES_USER=baeldung -e POSTGRES_PASSWORD=baeldung -p 5432:5432
-v /data:/var/lib/postgresql/data --name postgresql-baedlung postgres
3eec82654fe6c6ffa579752cc9d1fa034dc34b5533b8672ebe7778449726da32
それでは、 / var / lib / docker / containers /3eec82654fe6c6ffa579752cc9d1fa034dc34b5533b8672ebe7778449726da32ディレクトリのログファイルの数とログファイルのサイズを確認してみましょう。
$ ls -la
total 68
drwx------. 4 root root 4096 May 17 02:06 .
drwx------. 5 root root 222 May 17 02:07 ..
drwx------. 2 root root 6 May 17 02:02 checkpoints
-rw-------. 1 root root 3144 May 17 02:02 config.v2.json
-rw-r-----. 1 root root 587 May 17 02:06 3eec82654fe6c6ffa579752cc9d1fa034dc34b5533b8672ebe7778449726da32-json.log
-rw-r-----. 1 root root 1022 May 17 02:06 3eec82654fe6c6ffa579752cc9d1fa034dc34b5533b8672ebe7778449726da32-json.log.1
-rw-r-----. 1 root root 1061 May 17 02:06 3eec82654fe6c6ffa579752cc9d1fa034dc34b5533b8672ebe7778449726da32-json.log.2
-rw-r-----. 1 root root 1056 May 17 02:06 3eec82654fe6c6ffa579752cc9d1fa034dc34b5533b8672ebe7778449726da32-json.log.3
-rw-r-----. 1 root root 1058 May 17 02:06 3eec82654fe6c6ffa579752cc9d1fa034dc34b5533b8672ebe7778449726da32-json.log.4
-rw-r--r--. 1 root root 1501 May 17 02:02 hostconfig.json
-rw-r--r--. 1 root root 13 May 17 02:02 hostname
-rw-r--r--. 1 root root 174 May 17 02:02 hosts
drwx------. 2 root root 6 May 17 02:02 mounts
-rw-r--r--. 1 root root 69 May 17 02:02 resolv.conf
-rw-r--r--. 1 root root 71 May 17 02:02 resolv.conf.hash
ここでは、5つのログファイルが作成されており、各ログファイルのサイズは最大1kbであることがわかります。 一部のログファイルを削除すると、その場合、同じログファイル名で新しいログが生成されます。
ログmax-sizeおよびmax-fileの構成を/etc/docker/daemon.jsonファイルで提供することもできます。 daemon.jsonファイルの構成を調べてみましょう。
{
"log-driver": "json-file",
"log-opts": {
"max-size": "1k",
"max-file": "5"
}
}
ここでは、 daemon.json、で同じ構成を提供しました。重要なことに、すべての新しいコンテナーはこの構成で実行されます。 daemon.json ファイルを更新した後、Dockerサービスを再起動する必要があります。
6. Dockerコンテナログを単一のファイルにリダイレクトする
デフォルトでは、Dockerコンテナのログファイルはに保存されます / var / lib / docker / containers /
説明のために、コンテナのログをリダイレクトするコマンドを調べてみましょう。
$ docker logs -f containername &> baeldung-postgress.log &
ここで、上記のコマンドでは、すべてのライブログをbaeldung-postgress.logファイルにリダイレクトします。 また、このコマンドをバックグラウンドで実行します。 & 、したがって、明示的に停止されるまで実行を継続します。
7. 結論
このチュートリアルでは、コンテナのログを監視するさまざまな方法を学びました。 まず、 docker logs、、および docker container logs コマンドを調べて、ライブログを監視しました。 その後、デフォルトのコンテナログファイルを使用してログを監視しました。
最後に、ログファイルのクリアとリダイレクトについて調べました。 つまり、ログファイルの監視と切り捨てを検討しました。