Dockerを使用したロギングに関する知識は、トラブルシューティングや基本的な監視など、日常のシステム管理アクティビティに非常に役立ちます。 Dockerでログを追跡しないと、異常を調査するときに問題を軽減することがはるかに困難になります。
この記事では、LinuxシステムでDockerに関連付けられたログファイルを管理する方法を理解しやすくするために、その領域に関するいくつかの重要な情報について説明します。
まず、最も基本的な部分を調べて、徐々にいくつかの詳細を詳しく見ていきましょう。
Dockerログを表示する方法
docker logs
を使用できます 実行中のコンテナ内のサービスで何が起こっているかをフェッチするコマンド。
構文は単純です:
docker logs container_name_or_ID
docker ps
を使用できることはすでにご存知でしょう。 実行中のコンテナの名前とIDを表示するコマンド。
実際の例を見てみましょう。私はDockerでNextcloudをデプロイしました。当然のことながら、コンテナの名前はnextcloudです。
次に、nextcloud
という名前のコンテナのログを表示します 、使用:
docker logs nextcloud
上記のコマンドの出力の切り捨てられたバージョンは次のとおりです。
172.18.0.2 - - [23/Jul/2021:19:36:09 +0000] "HEAD /.env HTTP/1.1" 302 1571 "-" "python-requests/2.26.0"
172.18.0.2 - - [23/Jul/2021:19:49:52 +0000] "HEAD /c99.php HTTP/1.1" 302 1565 "-" "python-requests/2.26.0"
172.18.0.2 - - [24/Jul/2021:16:25:23 +0000] "HEAD /backup.tar HTTP/1.1" 302 1571 "-" "python-requests/2.26.0"
172.18.0.2 - - [24/Jul/2021:16:25:24 +0000] "HEAD /backup.zip HTTP/1.1" 302 1569 "-" "python-requests/2.26.0"
172.18.0.2 - - [25/Jul/2021:20:36:01 +0000] "GET / HTTP/1.1" 302 1590 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko; compatible; BW/1.1; bit.ly/2W6Px8S) Chrome/84.0.4147.105 Safari/537.36"
172.18.0.2 - - [25/Jul/2021:20:36:07 +0000] "GET /custom_apps/richdocumentscode/proxy.php?req=/hosting/capabilities HTTP/1.1" 200 721 "-" "Nextcloud Server Crawler"
172.18.0.2 - - [25/Jul/2021:20:36:04 +0000] "GET /login HTTP/1.1" 200 7501 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko; compatible; BW/1.1; bit.ly/2W6Px8S) Chrome/84.0.4147.105 Safari/537.36"
ログが多すぎますか?良い点は、Linuxのログと同じように、Dockerログの表示をはるかに簡単にするさまざまなオプションがあることです。
Dockerログをテールして特定の行数のみを表示する
Dockerlogsコマンドには--tail
があります tailコマンドと同様の方法で使用できる属性。
つまり、これを使用して、Dockerログの特定の行数のみを最後から表示できます。
たとえば、コンテナの最後の50行を表示するには、次を使用できます。
docker logs --tail 50 container_name_or_ID
上記のコマンドもこの方法で使用できます
docker logs -n=50 container_name_or_ID
コンテナログをリアルタイムで完全に表示できます。ログを「フォロー」するには、--follow
を使用します または-f
属性。
docker logs -f container_name_or_ID
followオプションを指定してdockerログを実行すると、時間の経過とともに新しいログ行がコンテナーから報告されることに気付くでしょう。
終了するには、 Ctrl + Cを使用するだけです。 キーの組み合わせを入力して、ターミナルプロンプトに戻ります。
docker logs
のほとんどのオプション サブコマンドを組み合わせて、目的の結果を生成できます。
たとえば、docker logs -f
最初からすべてのログで画面がいっぱいになります。あなたはそれを望まないでしょう。あなたができることは、両方のtail
を組み合わせることです およびfollow
このようなオプション:
docker logs -f --tail 20 container_name_or_ID
上記のコマンドは、ログの最後の20行を表示してから、ログをリアルタイムで追跡します。
スケーリングを使用してアプリコンテナを更新する場合、古いコンテナを削除する前に、上記のコマンドが非常に役立ちます。
Dockerログでタイムスタンプを表示
ログエントリのタイムスタンプも表示する場合は、-t
を使用できます。 オプション。
docker logs -t container_name_or_ID
これは、--follow
などの他のオプションと簡単に組み合わせることができます。 および--tail
。
以下のコマンドは、特定のコンテナのログファイルの最後の10行を、それぞれにタイムスタンプが添付された状態で表示します
docker logs -n=10 -t container_name_or_ID
問題を調査する場合、時間が重要な要素になる可能性があります。その場合、--since
および--until
フラグは非常に役立つ可能性があります。
たとえば、過去24時間に発生した問題を調査している場合、次のコマンドは、その時間中にのみ発生したもののログに記録された内容を表示します。
docker logs --since 1440m -t container_name_or_ID
1440m
上記のコマンドは24×60分を示します。 -t
を追加する または--timestamps
フラグを使用すると、報告された行にタイムスタンプのラベルが付けられ、インシデントやエラーをさらに簡単に理解できるようになります。コンテナに問い合わせるときに追加することをお勧めします。
同様に、展開を開始してから最初の24時間後にログの詳細が必要な場合、同等のコマンドは次のようになります。
docker logs --until 1440m -t nextcloud
時間を分単位で指定する以外に、上記の2つのフラグは、-t
という特定のタイムスタンプで使用することもできます。 を生成します。形式は2021-07-28T06:20:00
のようなものです 。
docker logs --since 2021-07-28 -t container_name_or_ID
上記のコマンドは、2021年7月28日からのログを表示します。
Dockerログの完全な概要については、mandocker-logsを使用してmanページを確認することもできます。いくつかの興味深いユースケースでは、コンテナ内からアプリケーション固有のログにアクセスするハイブリッドアプローチを採用することをお勧めします。
これを行うには、Dockerコンテナに入ります:
docker exec -it container_name_or_ID sh
次に、通常のLinuxツールを使用して、アプリケーション関連のログを取得できます。 1つのアプローチは、psコマンドを使用して目的のサービスのプロセスIDを取得することです。
ps aux
このプロセスの詳細を入手してください:
cat /proc/PID_of_process/fd/1
ホスト上のDockerサービス自体のログを確認したい場合、Ubuntu 16.04以降を使用している場合は、journalctlを使用できます。
sudo journalctl -u docker
Linuxでjournalctlコマンドを使用してログを分析する方法Linuxでジャーナルログを表示、フィルタリング、分析するためにjournalctlコマンドを使用するための初心者向けガイド。 LinuxハンドブックAbhishekPrakash Dockerログはどこに保存されますか?
Dockerログは/var / lib / docker / containerにあります。 ホストシステム上のディレクトリ。このディレクトリには、個々のディレクトリ内のすべてのコンテナに関連するログファイルが含まれています。コンテナIDでディレクトリを識別できます。
docker ps
を使用しました その70f19fde9076
を見つけるには NextcloudコンテナのコンテナIDです。
Dockerログが保存されているディレクトリを調べると:
[email protected]:~$ sudo ls -lh /var/lib/docker/containers
total 16K
drwx------ 4 root root 4.0K Jul 27 18:48 0efe12b28562c42619e533ad5f524d56740a7a3739d9e082c758bac95ae2a46f
drwx------ 4 root root 4.0K Jul 27 18:57 12c55f365f93ecb7f91e40bc130ddc2409216a61bbb244cd045a22b4513416d3
drwx------ 4 root root 4.0K Jul 27 18:58 70f19fde907672b9a6e5ff3b7db0c9ecbcb68d419712cb04d03d77694cd2ca4e
drwx------ 4 root root 4.0K Jul 27 18:57 a436399ef16a3efc0a909b9c3f725938e595e0b8fd34644b13f28b2c9bcb4ed7
現在4つのコンテナが実行されており、3番目のコンテナが調査する必要のあるコンテナと一致していることがわかります(70f19fde9076
で始まります)。 )。
このディレクトリの内容を確認すると、ログファイルがすぐそこにあることがわかります!
[email protected]:~$ sudo ls -lh /var/lib/docker/containers/70f19fde907672b9a6e5ff3b7db0c9ecbcb68d419712cb04d03d77694cd2ca4e
total 192K
-rw-r----- 1 root root 150K Jul 27 18:58 70f19fde907672b9a6e5ff3b7db0c9ecbcb68d419712cb04d03d77694cd2ca4e-json.log
drwx------ 2 root root 4.0K Jul 19 17:10 checkpoints
-rw------- 1 root root 5.5K Jul 27 18:58 config.v2.json
-rw-r--r-- 1 root root 1.5K Jul 27 18:58 hostconfig.json
-rw-r--r-- 1 root root 13 Jul 27 18:58 hostname
-rw-r--r-- 1 root root 198 Jul 27 18:58 hosts
drwx------ 3 root root 4.0K Jul 19 17:10 mounts
-rw-r--r-- 1 root root 79 Jul 27 18:58 resolv.conf
-rw-r--r-- 1 root root 71 Jul 27 18:58 resolv.conf.hash
したがって、対応するログファイルは 70f19fde907672b9a6e5ff3b7db0c9ecbcb68d419712cb04d03d77694cd2ca4e-json.logです。 これは、docker logs
を実行したときに読んでいたものと同じファイルです。 最初にコマンド。
すぐに確認させてください:
[email protected]:~$ sudo cat /var/lib/docker/containers/70f19fde907672b9a6e5ff3b7db0c9ecbcb68d419712cb04d03d77694cd2ca4e/70f19fde907672b9a6e5ff3b7db0c9ecbcb68d419712cb04d03d77694cd2ca4e-json.log
{"log":"172.18.0.2 - - [23/Jul/2021:19:36:09 +0000] \"HEAD /.env HTTP/1.1\" 302 1571 \"-\" \"python-requests/2.26.0\"\n","stream":"stdout","time":"2021-07-23T19:36:09.837857567Z"}
{"log":"172.18.0.2 - - [23/Jul/2021:19:49:52 +0000] \"HEAD /c99.php HTTP/1.1\" 302 1565 \"-\" \"python-requests/2.26.0\"\n","stream":"stdout","time":"2021-07-23T19:49:52.996108799Z"}
{"log":"172.18.0.2 - - [24/Jul/2021:16:25:23 +0000] \"HEAD /backup.tar HTTP/1.1\" 302 1571 \"-\" \"python-requests/2.26.0\"\n","stream":"stdout","time":"2021-07-24T16:25:23.445225166Z"}
{"log":"172.18.0.2 - - [24/Jul/2021:16:25:24 +0000] \"HEAD /backup.zip HTTP/1.1\" 302 1569 \"-\" \"python-requests/2.26.0\"\n","stream":"stdout","time":"2021-07-24T16:25:24.772881041Z"}
{"log":"172.18.0.2 - - [25/Jul/2021:20:36:01 +0000] \"GET / HTTP/1.1\" 302 1590 \"-\" \"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko; compatible; BW/1.1; bit.ly/2W6Px8S) Chrome/84.0.4147.105 Safari/537.36\"\n","stream":"stdout","time":"2021-07-25T20:36:03.678967877Z"}
{"log":"172.18.0.2 - - [25/Jul/2021:20:36:07 +0000] \"GET /custom_apps/richdocumentscode/proxy.php?req=/hosting/capabilities HTTP/1.1\" 200 721 \"-\" \"Nextcloud Server Crawler\"\n","stream":"stdout","time":"2021-07-25T20:36:07.404618408Z"}
{"log":"172.18.0.2 - - [25/Jul/2021:20:36:04 +0000] \"GET /login HTTP/1.1\" 200 7501 \"-\" \"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko; compatible; BW/1.1; bit.ly/2W6Px8S) Chrome/84.0.4147.105 Safari/537.36\"\n","stream":"stdout","time":"2021-07-25T20:36:07.619020402Z"}
ログの内容は同じですが、ホストから直接ログファイルを読み取っているため、docker logs
と比較して多くの専門用語があります。 以前に使用したコマンド。
Docker(JSON)のログローテーションを有効にする
デフォルトでは、JSONファイルベースのログの場合、Dockerでのログローテーションは無効になっています。
ログファイルのサイズが大きくなると、ディスク容量に問題が生じる可能性があります。 DockerベースのGhostインスタンスでは、ログファイルのサイズが最大20GBになります。ログローテーションを有効にすることで、このような状況を回避する必要があります。
Dockerのログローテーションを有効にするには、/etc/docker/daemon.json
を編集します ファイル:
sudo nano /etc/docker/daemon.json
次の行を追加してファイルを保存します:
{
"log-driver": "json-file",
"log-opts": {
"max-size": "10m",
"max-file": "3"
}
}
Dockerデーモンを再起動します:
sudo systemctl restart docker
上記の設定はもちろん、JSONロギングがデフォルトとして設定されている一般的なDockerインストールに関連しています。したがって、他のすべてのロギングメカニズム(以下にリスト)には、ローテーションを実装する独自の方法があることに注意してください。
以前のログファイル名に「json」があることに気づきましたか?これは、JSONファイルがDockerのデフォルトのロギングドライバーであるためです。
JSONとは別に、他にも多くのロギングメカニズムから選択できます:
- ローカルファイル
- ログイン
- Graylog Extended Format(GELF)
- Syslog
- Amazon Cloudwatch Logs(AWS)
- Windows(ETW)でのイベントトレース
- Fluentd
- Google Cloudプロジェクトログ(GCP)
- ジャーナル
- Splunk
- Logstash
大規模な展開の場合、 GELF 、 AWS 、 GCP およびFluentd 一元化されたアプローチを実装するため、をお勧めします。ただし、小規模の場合は、 JSON ローカルの間、仕事はうまくいきます 、 Syslog およびジャーナル また、非常に適しています。 Syslog およびLogstash 複雑なログ分析が必要になる場合は特に役立ちます。 ETW はWindows固有ですが、 Splunk リモートロギングに重点を置いています。
Docker Engine 20.10から、「デュアルロギング」と呼ばれる新機能が導入され、docker logs
を確実に実行できるようになりました。 コマンドと、有効なロギングドライバに関係なくログローテーションを実行します。
この記事では、コンテナーレベルとホストシステムレベルの両方で、Dockerコンテナーのログを表示する方法の基本から始めました。また、ホストシステム上にあるコンテナ固有のログファイルの物理的な場所を見つける方法も示しました。ホスト自体のDockerサービスのログを確認する方法を簡単に説明しました。
後で、デフォルトのメカニズムに焦点を当ててロギングドライバーについて説明し、新しいデュアルロギング機能についても説明しました。
これらのポインタが、日常の監視や学習活動に役立つことを願っています。これ以上の考えや提案は大歓迎です!以下のコメントセクションで共有してください。