Dockerコンテナのログ分析

Dockerコンテナのログ分析

コンテナログを表示する

まず、 docker run -it --rm -d -p 80:80 nginx:1.15.8-alpineコマンドを使用して、nginx コンテナを起動します。例外がない場合は、 d2408a7931c95a3a83ffeca2fba887763cf925a67890ef3be4d9ff838aa25b00のような長いコンテナー ID の文字列が返されます。次に、curl -i http://127.0.0.1 を使用してサービスにアクセスし、nginx コンテナが起動して正常に実行されていることを確認します。最後に、 docker logs -f d24​​を使用してコンテナのログ出力を表示します。次のようになります。

172.17.0.1 - - [2019年3月24日:03:51:21 +0000] "GET / HTTP/1.1" 200 612 "-" "curl/7.29.0" "-"

一般的に、コンテナ ID の最初の 3 桁で十分です。

上記はコンテナログを表示する私たちの日常的な方法であり、非常にシンプルで実用的です。

コンテナログファイルストレージ

コンテナ ログは、ローカル ディスクに json ファイルとして保存されます。ファイル パスを表示するには、次の方法を使用できます: docker inspect d42 | grep Log検索:

"ログパス": "/var/lib/docker/containers/d2408a7931c95a3a83ffeca2fba887763cf925a67890ef3be4d9ff838aa25b00/d2408a7931c95a3a83ffeca2fba887763cf925a67890ef3be4d9ff838aa25b00-json.log",

注 1: Mac には /var/lib/docker ディレクトリはありません。Mac 用の Docker は動作が異なるため、Linux システムを使用して練習するのが最適です。

注2: LogPathの内容が空の場合、おそらくdockerエンジンのバージョンが原因と思われます。dockerのバージョンをdocker-ce 18.09.3にアップグレードすることができます。

d2408a7931c95a3a83ffeca2fba887763cf925a67890ef3be4d9ff838aa25b00-json.logファイルを確認すると、次の内容が表示されます。

{"log":"172.17.0.1 - - [24/Mar/2019:03:51:21 +0000] \"GET / HTTP/1.1\" 200 612 \"-\" \"curl/7.29.0\" \"-\"\r\n","stream":"stdout","time":"2019-03-24T03:51:21.982476951Z"}

この情報のログ フィールドの内容は、以前に docker logs コマンドを通じて表示された内容と一致しています。

コンテナ ログはコンテナのライフサイクルに従い、コンテナが破棄されると破棄されます。 docker stop 24 を使用して、テストした nginx サービスをシャットダウンします。 --rm パラメータはコンテナの起動時に使用されるため、シャットダウン後に自動的にクリーンアップされて削除され、/var/lib/docker/containers/d2408a7931c95a3a83ffeca2fba887763cf925a67890ef3be4d9ff838aa25b00 ディレクトリは存在しなくなり、対応するログ ファイルも削除されていることがわかります。

コンテナログファイルのローテーション戦略

デフォルトでは、Docker コンテナのログは JSON ファイルに書き込まれるため、オンラインで実行するとディスクがいっぱいになる可能性があります。戦略を調整して実行することができます。 /etc/docker/daemon.json を変更し (存在しない場合は手動で作成します)、次のコンテンツを追加します。

{
 「ログオプション」: {
 "最大サイズ": "1m",
 "最大ファイル": "3"
 }
}

変更が完了したら、Docker サービスを再起動します。

systemctlデーモンリロード
systemctl docker.service を再起動します。

新しいログ記録ポリシーをテストするには、次のコマンドを使用してコンテナを作成します。

docker run -d --rm alpine:3.6 sh -c "while true; do echo hello world; usleep 10; done"

このアルパイン コンテナーは、10 マイクロ秒ごとに hello world を出力し、高頻度の出力を維持し、ログ ファイルをすばやく生成します。

注: シェル内の時間制御

1. sleep: デフォルト値は秒です。
sleep 1sは1秒の遅延を意味します
sleep 1mは1分間の遅延を意味します
sleep 1hは1時間の遅延を意味します
sleep 1dは1日遅延することを意味する

2. usleep: デフォルトはマイクロ秒単位です。

1秒 = 1000ミリ秒 = 1000000マイクロ秒

前の記事のログファイルの表示方法に従ってください

#パスワード
コンテナ
# ls -lah
合計 260万
drwx------ 4 root root 4.0K 3月24日 16:22 .
drwx------ 3 root root 4.0K 3月24日 16:21 ..
-rw-r----- 1 ルート ルート 647K 3月24日 16:22 aa3307f5b42770319129e126122be123cfd8e0ebe1c412371ad27e62faa007e3-json.log
-rw-r----- 1 ルート ルート 977K 3月24日 16:22 aa3307f5b42770319129e126122be123cfd8e0ebe1c412371ad27e62faa007e3-json.log.1
-rw-r----- 1 ルート ルート 977K 3月24日 16:21 aa3307f5b42770319129e126122be123cfd8e0ebe1c412371ad27e62faa007e3-json.log.2

ログ ファイル戦略は 3 つの 1M ファイルを維持することであり、これは私たちの設定と一致していることが簡単にわかります。

テストが完了したら、docker stop aa3 を使用してテスト サイトをクリーンアップすることを忘れないでください。実際のニーズに応じて、max-size を調整することもできます。

nginx コンテナ ログ

Docker コンテナのログ戦略を理解した後、よく使用されるコンテナがどのように処理されるかを見てみましょう。まずは nginx コンテナを見てみましょう。

まず、docker run -it --rm -d -p 80:80 nginx:1.15.8-alpine で nginx コンテナを作成し、次に docker exec -it b6d sh でコンテナに入り、/etc/nginx/nginx.conf をチェックして次の内容を確認します。

error_log /var/log/nginx/error.log 警告;
access_log /var/log/nginx/access.log メイン;

つまり、nginx はエラー ログとアクセス ログを対応するログ ファイルに書き込みます。 /var/log/nginx ディレクトリの表示を続けます。

ログファイル
合計 0
drwxr-xr-x 2 root root 39 3月 4日 07:54 .
drwxr-xr-x 3 root root 18 3月 4 07:54 ..
lrwxrwxrwx 1 root root 11 1月 31 23:32 access.log -> /dev/stdout
lrwxrwxrwx 1 root root 11 Jan 31 23:32 error.log -> /dev/stderr

ここで秘密が登場します。access.log ファイルはソフト リンクを介して標準出力にリダイレクトされ、エラー ログ error.log は標準エラーにリダイレクトされます。このように、docker log コマンドを使用して nginx アクセス ログを表示できます。

さらに検証するには、次の内容を含む nginx dockerfile ファイルを確認します。

# リクエストとエラーのログを docker ログコレクターに転送する
 && ln -sf /dev/stdout /var/log/nginx/access.log \
 && ln -sf /dev/stderr /var/log/nginx/error.log

nginx イメージの作成時にログ ファイルの出力が定義されていることがわかります。

また、docker stop 524 を使用してサイトをクリーンアップします。このクリーンアップ手順は、今後導入されることはありません。

mysql コンテナ ログ

MySQLコンテナを起動する

docker run --rm -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7

mysql コンテナのログ出力を確認するのは難しくありません。以下はその抜粋です。

データベースを初期化しています
2019-03-24T08:48:19.102726Z 0 [警告] 暗黙の DEFAULT 値を持つ TIMESTAMP は非推奨です。--explicit_defaults_for_timestamp サーバー オプションを使用してください (詳細についてはドキュメントを参照してください)。
2019-03-24T08:48:20.241459Z 0 [警告] InnoDB: 新しいログ ファイルが作成されました。LSN=45790
2019-03-24T08:48:20.414933Z 0 [警告] InnoDB: 外部キー制約システム テーブルを作成しています。
2019-03-24T08:48:20.509897Z 0 [警告] 既存の UUID が見つからないため、このサーバーが初めて起動されたと想定します。新しい UUID を生成しています: 935a6ee7-4e11-11e9-b135-0242ac110002。
2019-03-24T08:48:20.519148Z 0 [警告] Gtid テーブルは使用準備ができていません。テーブル 'mysql.gtid_executed' を開くことができません。
2019-03-24T08:48:20.519843Z 1 [警告] root@localhost が空のパスワードで作成されました。--initialize-insecure オプションをオフにすることを検討してください。
2019-03-24T08:48:24.066683Z 1 [警告] --skip-name-resolve モードで 'user' エントリ 'root@localhost' は無視されます。
2019-03-24T08:48:24.066730Z 1 [警告] --skip-name-resolve モードで 'user' エントリ 'mysql.session@localhost' は無視されます。
2019-03-24T08:48:24.066740Z 1 [警告] --skip-name-resolve モードで 'user' エントリ 'mysql.sys@localhost' は無視されます。
2019-03-24T08:48:24.066756Z 1 [警告] 'db' エントリ 'performance_schema mysql.session@localhost' は --skip-name-resolve モードで無視されます。
2019-03-24T08:48:24.066761Z 1 [警告] 'db' エントリ 'sys mysql.sys@localhost' は --skip-name-resolve モードで無視されます。
2019-03-24T08:48:24.066772Z 1 [警告] 'proxies_priv' エントリ '@ root@localhost' は --skip-name-resolve モードで無視されます。
2019-03-24T08:48:24.066814Z 1 [警告] 'tables_priv' エントリ 'user mysql.session@localhost' は --skip-name-resolve モードで無視されます。
2019-03-24T08:48:24.066822Z 1 [警告] 'tables_priv' エントリ 'sys_config mysql.sys@localhost' は --skip-name-resolve モードで無視されます。
データベースが初期化されました
証明書の初期化
RSA秘密鍵の生成

MySQL Dockerfile ファイルを見ると、MySQL イメージの起動エントリが entrypoint.sh にあることがわかります。スクリプトから、次のことがわかります。

echo 'データベースを初期化しています'
"$@" --initialize-insecure
echo 'データベースが初期化されました'

これは、mysql コンテナが起動されたときの出力の対応方法です。 entrypoint.sh は比較的複雑です。主な機能は、mysqld を起動してログを出力することです。この記事の焦点では​​ないため、詳しくは紹介しません。

要約する

  1. デフォルトでは、Docker コンテナはローカル JSON ファイルに出力し、そのサイズと量を制御できます。
  2. アプリケーション コンテナ ログは、最初にログ ファイルを生成し、次にアプリケーション ログ ファイルを nginx などの標準出力にソフト接続することができます。また、mysql などの起動時にログを直接標準出力に出力することもできます。

以上がこの記事の全内容です。皆様の勉強のお役に立てれば幸いです。また、123WORDPRESS.COM を応援していただければ幸いです。

以下もご興味があるかもしれません:
  • Docker コンテナのログを表示およびクリーンアップする方法 (テスト済みで効果的)
  • docker view container log コマンドの実装

<<:  史上最もシンプルな MySQL データのバックアップと復元のチュートリアル (パート 1) (パート 35)

>>:  1つの記事でJSONPの原理と応用を理解する

推薦する

MySQL における冗長インデックスと重複インデックスの違い

MySQL では、1 つの列に複数のインデックスを作成できます。意図的であるかどうかにかかわらず、M...

jsはCanvasを使用して複数の画像を1つの実装コードにマージします

解決 関数 mergeImgs(リスト) { const imgDom = document.cre...

MySQL におけるデフォルトの使用法の詳細な説明

NULL および NOT NULL 修飾子、DEFAULT 修飾子、AUTO_INCREMENT 修...

Vueはページキャッシュ機能を実装する

この記事の例では、ページキャッシュ機能を実装するためのVueの具体的なコードを参考までに共有していま...

Web ページのソース ファイルを表示できない場合はどうすればよいですか?

Q: Outlook または IE のどちらを使用している場合でも、マウスを右クリックすると、ポッ...

JavaScriptはパスワードボックスの検証情報を実装します

この記事では、パスワードボックスの検証情報を実装するためのJavaScriptの具体的なコードを例と...

相対幅と絶対幅が競合する場合の HTML+CSS div ソリューション

相対幅と絶対幅が競合する場合のdivソリューション概要: 一般的に、絶対幅を使用する場合は px を...

Mysql5.7.14 インストールと設定方法操作グラフィックチュートリアル(パスワード問題解決)

この記事は主に、以前のインストール方法を使用して MySQL 5.7.14 をインストールするときに...

モバイルでのHTML5経由のファイルアップロード

ほとんどの場合、PC でファイルをアップロードするにはプラグインが使用され、フラッシュが導入されても...

CentOS7 で MySQL のスケジュールされた自動バックアップを実装する方法

実稼働環境で起こる最も嬉しいことは、シナリオによっては、更新または削除時にパラメータを無視せざるを得...

Dockerがログファイルを保存する場所の詳細な説明

目次ログはどこに保存されますか?コンテナ内のアプリケーションからのログを表示するDockerデーモン...

JavaScript関数におけるこのポイントの問題の詳細な説明

このキーワードどのオブジェクトが関数を呼び出しますか? また、関数内の this はどのオブジェクト...

LeetCode の SQL 実装 (183. 注文をしたことがない顧客)

[LeetCode] 183.注文しない顧客Web サイトに、Customers テーブルと Or...

高度な CSS の 3 つの方法を使用して複数行の省略を実装するサンプル コード

序文これは古くからの要望ですが、オンラインで解決策を探している人はまだ多く、特に検索結果の上位にラン...

重要なmysqlログファイルの概要

著者: 丁易出典: https://chengxuzhixin.com/blog/post/mysq...