GNU/Linux >> Linux の 問題 >  >> Panels >> Docker

Dockerロギングの完全な初心者向けガイド

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
ライブコンテナでDockerログをリアルタイムで表示する

コンテナログをリアルタイムで完全に表示できます。ログを「フォロー」するには、--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
指定された期間のDockerログの表示

問題を調査する場合、時間が重要な要素になる可能性があります。その場合、--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コンテナに入ります:

docker exec -it container_name_or_ID sh

次に、通常のLinuxツールを使用して、アプリケーション関連のログを取得できます。 1つのアプローチは、psコマンドを使用して目的のサービスのプロセスIDを取得することです。

ps aux

このプロセスの詳細を入手してください:

cat /proc/PID_of_process/fd/1
Dockerシステムサービスログ

ホスト上の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サービスのログを確認する方法を簡単に説明しました。

後で、デフォルトのメカニズムに焦点を当ててロギングドライバーについて説明し、新しいデュアルロギング機能についても説明しました。

これらのポインタが、日常の監視や学習活動に役立つことを願っています。これ以上の考えや提案は大歓迎です!以下のコメントセクションで共有してください。


Docker
  1. DockerコンテナでNginxを実行する方法:ステップバイステップガイド

  2. gawkの初心者向けガイド

  3. DockerでMongoDBをセットアップする

  1. DockerComposeを使用するためのクイックガイド

  2. LinuxでのLVMの完全な初心者向けガイド

  3. セルフホスティングRocket.ChatとDockerの完全ガイド

  1. Linuxパーミッションのビギナーズガイド

  2. Kubernetesとは何ですか?完全ガイド

  3. Grep正規表現:完全ガイド