web-dev-qa-db-ja.com

DockerコンテナーログをELKに転送する方法

私のドッカーコンテナーログをELKサーバーに転送する最も簡単な方法は何かを知りたいのですが、これまでのところ、インターネットを検索した後に試したソリューションがまったく機能しませんでした。

基本的に私はdocker-composeを使用して実行するDockerイメージを持っています。このコンテナーはローカルで何もログに記録しません(さまざまなサービスで構成されていますが、それらのいずれもlogstashなどではありません)docker logs -tf imageNameまたはdocker-compose logs。私はコンテナをcomposeで開始しているので、dockerの--logs-driverオプションを使用できません(または、少なくともその方法がわかりません)。

したがって、たとえば、そのログをELKコンテナーに転送する方法について、誰かが私に少し啓蒙してくれるのではないかと思っていました。

前もって感謝します、

よろしく

[〜#〜]ソリューション[〜#〜]

次の方法で問題を解決するために達成できたmadeddieのおかげで、madeddieが彼の投稿で提案した基本的なELK-stack-in-containersを使用したことを述べました。

最初に、コンテナのdocker-compose.ymlファイルを更新して、ロギングリファレンスのエントリを追加します。これは、madeddieが教えてくれたように、サービスごとにエントリを含めました。私のdocker-composeのスニペットは次のようになります

   version: '2'
    services:
      mosquitto:
        image: ansi/mosquitto
        ports:
          - "1883:1883" # Public access to MQTT
          - "12202:12202"  #mapping logs
        logging: 
           driver: gelf
           options: 
             gelf-address: udp://localhost:12202
    redis:
     image: redis
     command: redis-server --appendonly yes
     ports:
       - "6379:6379" # No public access to Redis
       - "12203:12203" #mapping logs
     volumes:
       - /home/dockeruser/redis-data:/data
     logging: 
       driver: gelf
       options: 
         gelf-address: udp://localhost:12203 

次に、ログを転送できるようにするために、サービスごとに異なるポート番号を使用する必要がありました。

最後に、elkコンテナdocker-compose.ymlファイルを更新して、ログを送信していた各updポートを、logstashがリッスンするポートにマップしました

logstash:
  build: logstash/
  command: logstash -f /etc/logstash/conf.d/logstash.conf
  volumes:
    - ./logstash/config:/etc/logstash/conf.d
  ports:
    - "5000:5000"
    - "12202:12201/udp" #mapping mosquitto logs
    - "12203:12201/udp" #mapping redis logs

この構成とgelf {}へのlogstash.confのエントリの追加により、DockerサービスのIPアドレスを適切に設定することが重要になります。

リガード!

7
ndarkness

Docker composeにはロギングキーワードがあります: source

logging: 
  driver: syslog
  options: 
    syslog-address: "tcp://192.168.0.42:123"

だから、そこからどこへ行くべきかわかっているなら、それを求めてください。

そうでない場合は、 gelf logging driver for dockerlogstash gelf input plugin を調べることをお勧めします

たとえば this 基本的なELK-stack-in-containersセットアップを使用する場合、docker-composeファイルを更新し、ポート- "12201:12201/udp"をlogstashに追加します。

logstash.conf入力セクションを次のように編集します。

input {
    tcp {
        port => 5000
    }
    gelf {
    }

}

次に、ロギングドライバーgelf(syslogではなく)とオプションgelf-address=udp://ip_of_logstash:12201(syslog-addressの代わり)を使用するようにコンテナーを構成します。

DockerがLogstashコンテナーのIPアドレスまたはホスト名を見つける方法は、注意する必要がある唯一の魔法です。 docker-composeネーミング、Dockerリンク、または手動で解決できます。

DockerとELKは強力で柔軟ですが、大きくて複雑な獣でもあります。本を読んだり、実験したりするために、真剣に時間をかける準備をしてください。

これらすべてを調査するときに出くわす新しい(できれば非常に具体的な)質問を開くことを恐れないでください。

5
madeddie