Dockerコンテナのログ処理の詳細な説明

Dockerコンテナのログ処理の詳細な説明

Docker には多くのログ プラグインがあります。デフォルトでは json-file を使用します。json-file が使用されている場合にのみ、sudo docker logs -f を表示できます。docker log プラグインを表示するには、次のコマンドを入力します。

$ sudo docker info | grep ログ

ここで説明すると、コンテナが実行中の場合、Docker はホスト マシン上にコンテナに関連するファイルを作成し、コンテナによって生成されたログをこのファイルに転送します。 docker logs -f コマンドはファイルの内容を検索し、ターミナルに表示します。

docker logs -f は、サービスがどのノードにデプロイされているかに関係なく、対応するすべてのサービス ログをターミナルに出力することは周知の事実です。そこで質問ですが、各ノードに対応するコンテナー ファイルには、サービスの完全なログ バックアップが保存されるのでしょうか、それともノード サービスに対応するコンテナーによって生成されたログのみが保存されるのでしょうか。

この問題は、各ノードが Filebeat を使用してホスト マシンのコンテナ ログ ファイルをリッスンする場合に、各ノードのコンテナ ログが完全なバックアップである場合、ログが重複してしまうことに関係しています。ノード上のコンテナのログのみが保存されている場合、重複は発生しません。

答えは、ノード上のコンテナのログのみを保持することです。docker logs -f コマンドは、オーバーレイ ネットワーク モデル上でプロトコルのレイヤーを実行し、他のノード上の同じコンテナ ログを集約します。

デフォルトでは、docker の json ファイルが使用されます。まず、デーモンを設定します。

$ sudo dockerd \
--log-driver=jsonファイル \
--log-opt ラベル=サービス名

コンテナを起動するには、次のパラメータを追加する必要があります。

$ sudo docker サービス更新 --label サービス名=test

または、docker-compose.yml で直接マークします。

バージョン: "3"

サービス:
 ゴージンデモ:
  画像: chenghuizhang/go-gin-demo:v3
  ポート:
   -8081:8081
  ネットワーク:
   - かぶせる
  展開する:
   モード: 複製
   レプリカ: 3
  ラベル:
   サービス名: go-gin-demoxxxxxxx
  ログ記録:
   オプション:
    ラベル: "サービス名"

ネットワーク:
 かぶせる:

各ノードに filebeat をインストールし、filebeat.yml を次のように構成します。

ファイルビートプロスペクター:
- タイプ: ログ
  パス:
  		# コンテナログディレクトリ - /var/lib/docker/containers/*/*.log
   # docker が使用するログドライバーは json-file なので、収集されるログの形式は json 形式です。これを true に設定すると、filebeat はログに対して json_decode 処理を実行します json.keys_under_root: true
  tail_files: 真
出力.logstash:
 ホスト: ["172.17.10.114:5044"]

logstash.conf でインデックスを設定します。

出力{
 エラスティックサーチ
  アクション => "インデックス"
  ホスト => ["172.17.10.114:9200"]
  # ログラベルを取得する
  インデックス => "%{attrs.servicename}-%{+YYYY.MM.dd}"
 }
}

Dockerfile ファイルは、プロジェクトによって出力されたログを stdout と stderr に出力する必要があります。そうしないと、json-file ログ ドライバーはコンテナー内のログ出力を収集しません。sudo docker logs -f は、ターミナルにコンテナー ログを表示しません。次のコマンドを Dockerfile に追加する必要があります。

実行 ln -sf /dev/stdout /xx/xx.log \ # 情報
	&& ln -sf /dev/stderr /xx/xx.log # エラー

または、プロジェクトの log4j 構成出力コンソールで:

<アペンダー>
  <コンソール名="コンソール" ターゲット="SYSTEM_OUT">
    <PatternLayout パターン="[%d{DEFAULT}]%m"/>
  </コンソール>
</アペンダー>

ログにコンテナ ID 名とイメージ名を記録する必要がある場合は、コンテナの実行時に次のパラメータを追加できます。

--log-opt タグ="//" 

最後に、json-file ログ プラグインは、コンテナーがローカルの/var/lib/docker/containers/*/ディレクトリのコンソールに出力するログを次の形式で生成します。

{
  "log":"[GIN-debug] [警告] 現在、Gin には Go 1.6 以降が必要であり、まもなく Go 1.7 が必要になります。",
  "ストリーム":"標準エラー出力",
  「属性」:{
    "タグ":"chenghuizhang/go-gin-demo:v3@sha256:e6c0419d64e5eda510056a38cfb803750e4ac2f0f4862d153f7c4501f576798b/mygo.2.jhqptjugfti2t4emf55sehamo/647eaa4b3913",
    "サービス名":"テスト"
  },
  「時間」:「2019-01-29T10:08:59.780161908Z」
}

logstash でログをフォーマットします。

フィルター {
 理解する {
  patterns_dir => "/etc/logstash/conf.d/patterns"
  一致 => {"メッセージ" => "%{TIMESTAMP_ISO8601:time}%{SERVICENAME:attr.servicename}%{DOCKER_TAG:attr.tag}"}
}

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

以下もご興味があるかもしれません:
  • Dockerコンテナ内の設定ファイルの変更の実装
  • spring-boot と docker-java に基づいて Docker コンテナの動的な管理と監視を実装します [完全なソース コードのダウンロード付き]
  • Linux 上で Docker コンテナを作成、一覧表示、削除する方法の概要
  • Dockerコンテナアプリケーションログの表示方法
  • Dockerコンテナの自動終了を停止する方法の詳細な説明
  • dockerコンテナがIP経由でホストマシンにアクセスできない問題を解決する方法の詳細な説明
  • Dockerコンテナを使用してホストネットワークにアクセスする方法
  • Dockerコンテナの操作手順の概要と詳細説明

<<:  Expressを使用してプロジェクトを自動的にビルドするNode.jsのプロセス全体

>>:  ホストがアクセスできるようにMySQLの権限を変更する方法

推薦する

Vue 名前付きスロットの基本的な使用例

序文名前付きスロットは、スロット内の「name」属性を使用して要素にバインドされます。知らせ: 1....

Xshell を使用して VMware 上の Linux 仮想マシンに接続する (グラフィック手順)

はじめに: 最近 Hadoop プラットフォームの構築を勉強し始めたので、ローカルマシンに VMwa...

Vue でバイナリ ファイル ストリームを受信して​​ PDF プレビューを実現する方法

バックグラウンド コントローラー @RequestMapping("/getPDFStre...

MySQL のバックアップとリカバリの設計アイデア

背景まず、背景を説明します。ある制約により、当社の現在のバックアップ戦略では、1 日おきにフル バッ...

Vueはドラッグ可能なツリー構造図を実装します

目次Vue 再帰コンポーネントドラッグイベント最近、Vue を使用して、ドラッグ可能なツリー構造図と...

MySQLスタートアップが起こした事故の実録

目次背景MySQLが完全に起動したかどうかを確認する方法事故最初の変更2回目の改訂要約するMySQL...

MySQL 8.0.11 Community Green Edition の Windows 用インストール手順図

このチュートリアルでは、インストールに最新の MySQL コミュニティ グリーン バージョンである ...

Rancher のデプロイメントと K8S クラスターのインポートに関する問題

Rancher のデプロイメントには、次の 3 つのアーキテクチャがあります。高可用性 Kubern...

HTML コードの書き方に関する提案のまとめ

リソースファイルのプロトコルを省略する画像、メディアファイル、スタイル、スクリプトの URL では、...

Vueブラウザが監視を再開するための具体的な手順

序文ページを共有するときに、ブラウザの戻るボタンをクリックしてプロジェクトのホームページに戻り、訪問...

MySQLクエリステートメント内のユーザー変数のコード分析

前回の記事では、MySQL 最適化の概要 - クエリの合計数を紹介しました。この記事では、クエリ ス...

Nginx プロキシを使用してインターネットを閲覧する方法

私は通常、Tomcatや他のアプリケーションのリバースプロキシとしてnginxを使用しています。実際...

MYSQL メタデータ ロック (MDL ロック) MDL ロックの問題分析

1. はじめにMYSQL の MDL ロックは常に頭痛の種でした。ロックについて話すとき、通常は I...

Reactの親コンポーネントと子コンポーネント間のデータ転送の詳細な説明

目次1. 親コンポーネントが子コンポーネントにデータを渡す1.1. 親コンポーネントコード1.2. ...

Linuxがすべてのコマンドをサポートしていない問題の解決策

Linux がすべてのコマンドをサポートしていない場合はどうすればいいですか?すべてのLinuxコマ...