DockerのコンテナログをLogspoutで転送する
Docker コンテナのログはコンテナが終了すると閲覧できなくなります。
障害が発生したときに後からログを確認したいときに、そのコンテナが異常終了していると見られないケースがあるので、外部にログを投げてそれを閲覧できる仕組みが必要でした。
Logspout + Logstash + Elasticsearch + Kibana で実施します。
最初は Docker Compose のロギングドライバ + Fluentd + Elasticsearch + Kibana で作ることを考えていました。
しかし、ログサーバが死んでいたら起動しなかったり、すべての Compose 設定ファイルに log-driver 設定をするのが面倒と思っていたなかで、logspout というソフトウェアを見つけたので利用しました。
仕様
1 台のログ蓄積サーバと、2 台のコンテナ実行サーバで構成します。
コンテナ実行サーバには複数の Docker コンテナがあります。
Logspout を使用して、Docker コンテナ群からログを取得します。
取得したログは各コンテナ実行サーバで動作する Logstash へいったん転送します。
その後、Logstash からログ蓄積サーバで動作する Elasticsearch に転送します。
閲覧時、ユーザーは Kibana Web GUI にアクセスします。この際、Kibana は Elasticsearch のデータを参照します。
環境
コンテナ実行サーバの設定は一部ホスト名の設定を除き、同一の環境・設定になっています。
Logspout, Logstash と Elasticsearch, Kibana は Docker Compose で構成します。
- ログ蓄積サーバ (ホスト名:
orange)- Raspberry Pi 4 model B
- Ubuntu 22.04.2
- Docker 23.0.5 (Build bc4487a)
- Docker Compose v2.17.3
- Elasticsearch 7.13.1
- Kibana 7.13.1
- コンテナ実行サーバ (ホスト名:
tomapi,nuts)-
tomapi- Raspberry Pi 4 model B
- Raspberry Pi OS 64 bit (Bullseye)
-
nuts- Ubuntu 22.04.2
- Docker 23.0.5 (Build bc4487a)
- Docker Compose v2.17.3
- Logspout v3.2.14
- Logstash 8.7.1
-
作業
- ログ蓄積サーバで Elasticsearch と Kibana を立ち上げ
- コンテナ実行サーバで Logspout と Logstash を立ち上げる
- ログが蓄積されていることを確認
- より良いログの閲覧・ダッシュボードの活用
1. ログ蓄積サーバで Elasticsearch と Kibana を立ち上げ
以下の Gist をログ蓄積サーバで compose.yaml として保存します。
以下のコマンドを実行してダウンロードしても構いません。
wget https://gist.github.com/book000/2358c7db69e34442051c268a34245830/raw/compose.yaml
Elasticsearch のデータディレクトリとして es-data ディレクトリを指定しています。
権限の関係で、そのままでは上手く動作しない(Permission denied)のでとりあえず rwxrwxrwx (777) を設定しておくことにします。[1]
以下を実行します。
mkdir es-data
chmod 777 es-data
その後、Docker Compose で立ち上げます。
docker compose up --build -d
2. コンテナ実行サーバで Logspout と Logstash を立ち上げる
以下の Gist をコンテナ実行サーバでそれぞれのファイルを保存します。
以下のコマンドを実行してダウンロードしても構いません。
wget https://gist.github.com/book000/9471df754b741c712eb9be8f6af5c18f/raw/compose.yaml
wget https://gist.github.com/book000/9471df754b741c712eb9be8f6af5c18f/raw/logstash.conf
wget https://gist.github.com/book000/9471df754b741c712eb9be8f6af5c18f/raw/logstash.Dockerfile
保存後、以下の項目を書き換えてください。
-
compose.yamlの 19 行目:<HOSTNAME>を任意のホスト名に変更 -
logstash.confの 47 行目:<IP-ADDRESS>をログ蓄積サーバの IP アドレスに変更
その後、Docker Compose で立ち上げます。
docker compose up --build -d
3. ログが蓄積されていることを確認
ログ蓄積サーバの 5601 番ポートへブラウザでアクセスし、以下の設定をします。
-
Select your spaceと出てきたらDefaultを選択 -
Start by adding your dataと出てきたら、Add dataをクリック - Logstash によってデータが送受信されているはずなので、左上三本線でサイドバーを開き、
AnalyticsのDiscoverにアクセス -
You have data in Elasticsearch. Now, create an index pattern.と表示されたら、Create index patternをクリック
ここでReady to try Kibana? First, you need data.という画面が出てきたら、ログデータが受信できていない。 -
Step 1 of 2: Define an index patternにて、Index pattern nameにlogs-*と入力、Next stepをクリック -
Step 2 of 2: Configure settingsにて、Time fieldに@timestampが選択されていることを確認。Create index patternをクリック - 再度、左上三本線でサイドバーを開き、
AnalyticsのDiscoverにアクセス - コンテナ実行サーバのログが確認できれば OK
| 3 | 4 |
|---|---|
![]() |
![]() |
4. より良いログの閲覧・ダッシュボードの活用
左上三本線でサイドバーを開き、Analytics の Dashboard から、ダッシュボードを作成できます。
複数のサーバからログを受信するならサーバごとのレコードグラフや、コンテナごとのレコードグラフを作っておくと有用かと思います。

また、リアルタイムでログを確認したい場合は、左上三本線でサイドバーを開き、Observability の Logs を開き Stream live を有効にすると確認できます。



Discussion