デーモンとしてdocker出力をstdout/stderrに書き込む方法

デーモンとしてdocker出力をstdout/stderrに書き込む方法

したがって、Docker コンテナをデーモンとして実行できます。

docker run -d --name foo foo

そしてログを読んでください:

docker logs -f foo

しかし、ログを splunk や cloudwatch などに送信できるように、stdout/stderr にのみ書き込む方法を知りたいです。次のようなものです:

(
  docker run --name foo foo &|  capture_logs
) & disown

これを公式に行う方法は何ですか?

答え1

@Michaelが指摘したように、以下の説明にあるように、ログオプションを使用することができます。ドキュメント

一般的に言えば、これを行うには少なくとも 2 つの方法があり、以下で簡単に説明します。

  1. ドライバーの使用splunkここ

まず、イベントコレクタートークンを作成します。ドキュメントトークンは Splunk ドライバー構成内で使用されます。

docker cli の例

docker run -d \
           --log-driver=splunk \
           --log-opt splunk-token=176FCEBF-4CF5-4EDF-91BC-703796522D20 \
           --log-opt splunk-url=https://splunkhost:8088 \
           --log-opt tag=foo-logs \
           --name foo foo

docker-compose の例

version: '3.7'
services:
  foo_app:
  ...
  logging:
    driver: splunk
    options:
      tag: foo-logs
      splunk-token: 176FCEBF-4CF5-4EDF-91BC-703796522D20
      splunk-url: https://splunkhost:8088
  ...
  1. ドライバーの使用syslogここ

docker cli の例:

docker run \
      -–log-driver syslog –-log-opt tag=foo-logs \
      --name foo foo

docker-compose の例:

version: '3.7'
services:
  foo_app:
  ...
  logging:
    driver: syslog
    options:
      tag: foo-logs
  ...

これにより、すべてのコンテナ ログがローカル syslog に送信され、そこからログを取得して、Splunk がログを受信できる外部 UDP ポートに転送できます。

Splunkサーバーがポートでログを受信する場合は、これを構成に追加してrsyslogdサービスを再起動する514必要があります。rsyslogd

# /etc/rsyslog.d/20-splunk.conf
:syslogtag, contains, "foo-logs" @splunk_url:514;RSYSLOG_SyslogProtocol23Format

あるいは、すべてのコンテナに対してグローバルにする場合は、/etc/docker/daemon.json以下のようにファイル自体でログ記録を設定できます (docker サービスを再起動することを忘れないでください)。

の場合にはsyslog

{
  "log-driver": "syslog"
}

の場合にはsplunk

{
  "log-driver": "splunk",
  "log-opts": {
    "splunk-token": "176FCEBF-4CF5-4EDF-91BC-703796522D20",
    "splunk-url": "https://splunkhost:8088",
    ...
  }
}

リストをチェックしてくださいサポートされているログドライバ

関連情報