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の権限を変更する方法

推薦する

DockerでRedisをデプロイして起動する方法

DockerでRedisをデプロイするまずLinuxにDockerをインストールし、次にDocker...

ツールキット: Bootstrap よりも強力なフロントエンド フレームワーク

注: 現在、最も人気のフロントエンド フレームワークは Bootstrap と Foundation...

Dockerはコンテナポートバインディングのローカルポートを実装します

今日、イメージを起動した後、HTTP リクエスト経由でアクセスできないという小さな問題が発生しました...

CSS初心者向けチュートリアル: 背景画像を画面全体に表示する

インターフェース全体に背景画像を表示したい場合は、当然 body に背景を追加することを考えます。コ...

スクロール時に選択領域のフォント色を暗くするために CSS を使用するサンプルコード

日付ピッカーをカプセル化する場合、選択時にフォントの色を暗くする必要があります。実装後の効果を見てみ...

Vue+Element UI でサマリーポップアップウィンドウを実装するプロセス全体

シナリオ: 検査文書には n 個の検査詳細があり、検査詳細には n 個の検査項目があります。実装効果...

Docker で ElasticSearch をデプロイする方法

1. ElasticSearch とは何ですか? Elasticsearch も Java で開発さ...

MySQL でよく使用される SQL 文を表示する (詳細な説明)

#mysql -uroot -pパスワードを入力してくださいmysql> show full...

MySQLカバーインデックスの詳しい説明

コンセプトインデックスにクエリ要件を満たすすべてのデータが含まれている場合、それはカバーリング イン...

MySQL/MariaDB ルートパスワードリセットチュートリアル

序文パスワードを忘れることは、よく遭遇する問題です。MySQL または MariaDB データベース...

OneProxy に基づいて MySQL の読み取り/書き込み分離と負荷分散を実装する

導入パート1: 冒頭に書いたOneProxy は、民間ソフトウェアによって完全に独立して開発された分...

Docker を使用して Go Web アプリケーションをデプロイする方法

目次なぜ Docker が必要なのでしょうか? Docker デプロイメントの例コードの準備Dock...

Centos7でのパーティションのフォーマットとマウントの実装

Linux では、ハードディスクの追加やパーティションの再マウントといった状況に頻繁に遭遇します。こ...

Windows 10 でカスタムドメイン名をバインドするように Hexo と GitHub を構成する方法

Hexo は Windows 10 でカスタムドメイン名を GitHub にバインドしますまずドメイ...