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 / dir。 さらに、Dockerコンテナのログを他のファイルにリダイレクトすることもできます。

説明のために、コンテナのログをリダイレクトするコマンドを調べてみましょう。

$ docker logs -f containername &> baeldung-postgress.log &

ここで、上記のコマンドでは、すべてのライブログをbaeldung-postgress.logファイルにリダイレクトします。 また、このコマンドをバックグラウンドで実行します。 、したがって、明示的に停止されるまで実行を継続します。

7. 結論

このチュートリアルでは、コンテナのログを監視するさまざまな方法を学びました。 まず、 docker logs、、および docker container logs コマンドを調べて、ライブログを監視しました。 その後、デフォルトのコンテナログファイルを使用してログを監視しました。

最後に、ログファイルのクリアとリダイレクトについて調べました。 つまり、ログファイルの監視と切り捨てを検討しました。