Docker コンテナのログ設定方法

DockerBeginner
オンラインで実践に進む

はじめに

Docker はアプリケーションをコンテナ化するための広く採用されているプラットフォームですが、これらのコンテナのログを管理することは、健全で効率的な Docker 環境を維持する上で重要な側面です。このチュートリアルでは、アプリケーションの動作をより良く可視化し制御するために、Docker コンテナのロギング設定方法を、基本から高度なテクニックまで、段階的に解説します。

Docker ロギング入門

Docker は、開発者がアプリケーションを一貫性があり再現可能な方法でパッケージ化およびデプロイすることを可能にする、人気のコンテナ化プラットフォームです。Docker コンテナ内でアプリケーションを実行する場合、ロギングは監視とトラブルシューティングの重要な側面です。Docker は、コンテナ化されたアプリケーションのロギングを設定および管理するためのいくつかのオプションを提供しています。

Docker ロギングについて

Docker は、コンテナによって生成されたログを処理するためにロギングドライバを使用します。ロギングドライバは、ログの保存方法とアクセス方法を決定します。Docker は、さまざまなロギングドライバをサポートしており、以下のようなものがあります。

  • json-file:デフォルトのロギングドライバで、ホストのファイルシステム上に JSON 形式でログを保存します。
  • syslog:ログを syslog サーバーに送信します。
  • journald:ログを systemd ジャーナルに送信します。
  • gelf:ログを Graylog Extended Log Format (GELF) エンドポイントに送信します。
  • fluentd:ログを Fluentd サーバーに送信します。
  • awslogs:ログを Amazon CloudWatch Logs に送信します。
  • splunk:ログを Splunk エンタープライズまたは Splunk Cloud インスタンスに送信します。

ロギングドライバの選択は、アプリケーションの要件、実行しているインフラストラクチャ、ログ管理および分析に使用しているツールによって異なります。

コンテナログへのアクセス

実行中のコンテナのログにアクセスするには、docker logsコマンドを使用できます。このコマンドを使用すると、特定のコンテナのログを表示したり、リアルタイムでログを追跡したり、さまざまな基準に基づいてログをフィルタリングしたりできます。

## コンテナのログを表示
docker logs my-container

## リアルタイムでログを追跡
docker logs -f my-container

## ログの最後の10行を表示
docker logs --tail 10 my-container

デフォルトでは、docker logsコマンドは、コンテナ用に指定されたロギングドライバからのログを取得します。json-fileドライバを使用している場合、ログはホストのファイルシステム上に保存され、ホストからも直接アクセスできます。

Docker コンテナのロギング設定

ロギングドライバの設定

Docker コンテナのロギングドライバは、いくつかの方法で設定できます。

  1. Docker デーモン全体のロギングドライバを設定する:

    ## Docker デーモンの設定ファイル編集
    
    ## ロギングドライバの設定を追加
    
    ## Docker デーモンを再起動
    
  2. 特定のコンテナのロギングドライバを設定する:

    ## 特定のロギングドライバでコンテナを実行
    docker run -d --log-driver=syslog --log-opt syslog-address=tcp://192.168.1.100:514 my-app
    
  3. Docker サービスのロギングドライバを設定する:

    ## 特定のロギングドライバで Docker サービスを作成
    docker service create --log-driver=fluentd --log-opt fluentd-address=192.168.1.100:24224 my-service
    

ロギングオプションの設定

ロギングドライバによっては、ロギング動作をカスタマイズするためのさまざまなオプションを設定できます。一般的なオプションには以下があります。

  • max-size:ログファイルが回転する前の最大サイズ。
  • max-file:保持するログファイルの最大数。
  • syslog-address:syslog サーバーのアドレス。
  • fluentd-address:Fluentd サーバーのアドレス。
  • awslogs-group:CloudWatch Logs グループの名前。
  • splunk-url:Splunk インスタンスの URL。

これらのオプションは、コンテナの実行時またはサービスの作成時に --log-opt フラグを使用して設定できます。

ログデータの表示

ロギングドライバとオプションを設定したら、適切なツールを使用してログデータを閲覧できます。たとえば、json-file ドライバを使用している場合は、ホストのファイルシステム上で直接ログを表示できます。Syslog や Fluentd などのリモートロギングサービスを使用している場合は、それぞれの管理インターフェースを通じてログにアクセスする必要があります。

高度なロギング技術

Fluentd によるログの集約

Fluentd は、Docker コンテナを含むさまざまなソースからのログを集約および処理するために使用できる、人気のオープンソースデータコレクタです。Fluentd を Docker と一緒に使用するには、以下の手順に従います。

  1. ホストマシンに Fluentd をインストールします。

    ## Ubuntu 22.04 に Fluentd をインストール
    sudo apt-get update
    sudo apt-get install -y td-agent
    
  2. Fluentd を設定して Docker コンテナからのログを収集します。

    ## Fluentd の設定ファイル (td-agent.conf) を編集
    sudo vim /etc/td-agent/td-agent.conf
    
    ## 以下の設定を追加
    <source>
      @type docker
      tag docker.*
      dump_stdin true
    </source>
    
    <match docker.**>
      @type forward
      send_timeout 60s
      recover_wait 10s
      heartbeat_interval 1s
      hard_timeout 60s
      <server>
        host 192.168.1.100
        port 24224
      </server>
    </match>
    
  3. Fluentd サービスを再起動します。

    sudo systemctl restart td-agent
    
  4. fluentd ロギングドライバを使用して Docker コンテナを実行します。

    docker run -d --log-driver=fluentd --log-opt fluentd-address=192.168.1.100:24224 my-app
    

この設定により、Docker コンテナからのログは Fluentd サーバーに転送され、そこでさらに処理、分析、保存できます。

Elasticsearch と Kibana への統合

もう 1 つの高度なロギング技術は、Docker ログを Elasticsearch と Kibana に統合することです。Elasticsearch は強力な検索および分析エンジンであり、Kibana はログデータの視覚化および分析のための使いやすいインターフェースを提供します。

Docker ログを Elasticsearch と Kibana に統合するには、logstash ロギングドライバまたは elastic ロギングドライバを使用できます。ここでは、logstash ドライバを使用した例を示します。

  1. Docker Compose を使用して Elasticsearch と Kibana スタックを実行します。

    version: "3"
    services:
      elasticsearch:
        image: elasticsearch:7.9.2
        environment:
          - discovery.type=single-node
      kibana:
        image: kibana:7.9.2
        ports:
          - 5601:5601
      logstash:
        image: logstash:7.9.2
        command: logstash -f /etc/logstash/conf.d/logstash.conf
        volumes:
          - ./logstash.conf:/etc/logstash/conf.d/logstash.conf
    
  2. 以下の設定を含む logstash.conf ファイルを作成します。

    input {
      docker {
        host => "unix:///var/run/docker.sock"
        tags => ["docker"]
      }
    }
    
    output {
      elasticsearch {
        hosts => ["elasticsearch:9200"]
        index => "docker-%{+YYYY.MM.dd}"
      }
    }
    
  3. Elasticsearch、Kibana、Logstash スタックを実行します。

    docker-compose up -d
    
  4. logstash ロギングドライバを使用して Docker コンテナを実行します。

    docker run -d --log-driver=logstash --log-opt logstash-address=logstash:5000 my-app
    

この設定により、Docker コンテナからのログは Logstash に転送され、Logstash はそれらを Elasticsearch に送信します。その後、Kibana を使用してログデータを視覚化および分析できます。

まとめ

この包括的なガイドでは、Docker コンテナのロギング設定方法を、基本的な設定から高度なロギング技術まで学びます。このチュートリアルを完了するまでに、Docker 環境のロギング機能を最適化する方法を深く理解し、問題のトラブルシューティング、アプリケーションの監視、整理整頓された効率的なコンテナ化されたインフラストラクチャの維持に役立つ知識を習得します。