やりたいこと
- docker-composeでWEBサーバとfluent-bitのコンテナを立ち上げ、WEBサーバのログをlogging-driver経由でfluent-bitにforwardしたい
- docker-compose.yaml はこんな↓感じ
version: '3.8'
services:
fluent-bit:
container_name: fluent-bit
image: fluent/fluent-bit
command: ["/fluent-bit/bin/fluent-bit", "-c", "/fluent-bit/etc/fluent-bit.conf"]
volumes:
- ./fluent-bit.conf:/fluent-bit/etc/fluent-bit.conf
- ./parsers.conf:/fluent-bit/etc/parsers.conf
http-echo:
image: hashicorp/http-echo:latest
command: ['-text', 'Hello World', '-listen', ':8080']
ports:
- 8080:8080
depends_on:
- fluent-bit
logging:
driver: "fluentd"
options:
fluentd-address: fluent-bit:24224
tag: "docker.logging_driver.mylog"
[SERVICE]
Flush 5
Daemon Off
Log_Level info
Parsers_File parsers.conf
Plugins_File plugins.conf
[INPUT]
Name forward
Host 0.0.0.0
Listen 0.0.0.0
Port 24224
[OUTPUT]
Name stdout
Match *
Format json_lines
現象
- 以下のエラーメッセージが表示され、コンテナの起動に失敗する
ERROR: for fluent-bit_http-echo_1 Cannot start service http-echo: failed to initialize logging driver: dial tcp: lookup fluent-bit: Temporary failure in name resolution
ERROR: for http-echo Cannot start service http-echo: failed to initialize logging driver: dial tcp: lookup fluent-bit: Temporary failure in name resolution
ERROR: Encountered errors while bringing up the project.
期待する動作
- WEBサーバ及びfluent-bitのコンテナが起動し、WEBサーバのログがfluent-bitに転送されること
- docker-composeの同一ネットワーク内ならホストにポートをバインドしなくてもcontainer_nameで接続できるものだと思っていたのだが?
- 各コンテナへのpingはcontainer_nameでも通る
試したこと(1)
- fluent-bitの起動(初期化)処理のタイミングの問題で接続に失敗するのではないかと考え、fluentd-async-connectにtrueを設定
logging:
driver: "fluentd"
options:
fluentd-address: fluent-bit:24224
fluentd-async-connect: 'true'
fluentd-retry-wait: '2000ms'
fluentd-max-retries: '30'
tag: "docker.logging_driver.mylog"
- 結果: WEBサーバコンテナが応答しなくなり、docker自体も応答しなくなった(最終的にdocker自体を再起動することになった)
試したこと(2)
- WEBサーバとfluent-bitのdocker-compose.yamlを分割し、fluent-bitの起動確認後、WEBサーバを起動してみた
- この時、ネットワークは名前付きネットワークを作成し、双方ともそこに参加させた
- 結果: (1) と変わらず
試したこと(3)
- fluent-bitのports設定に24224:24224を設定
- portsに以下の設定を追加(要するにホストのポートにコンテナのポートを公開した)
ports:
- 24224:24224
- 24224:24224/udp
- 結果:
- あっさりと接続が確立され、WEBサーバのログがfluent-bitに転送された
- 課題:
- この設定だと外部にfluent-bitが公開されてしまう(0.0.0.0:24224で公開された状態)
- 最終的にはVPS上で動かしたいのでfluent-bitを外部公開したくない(なのでcontainer_nameで接続できることが望ましい)
暫定的な対策
- fluent-bitのports設定を↓のように設定した
ports:
- 127.0.0.1:24224:24224
- 127.0.0.1:24224:24224/udp
- WEBサーバ側は↓のように設定する(localhostを指定する)
logging:
driver: "fluentd"
options:
fluentd-address: localhost:24224
- これで自ホスト以外の接続は弾くことができる
- ポートが公開状態にはなるが、外部からは接続できないのでとりあえずは要件を満たした形になった
- 無意味にホストのポートが消費されているのが多少気に食わないが...
- docker-composeの同一ネットワーク内であるにも関わらず、container_nameで接続できない件は不明のまま
- fluent-bitの公式イメージの問題なのか? udpで接続するアプリケーションはcontainer_nameでは接続できない制限があるのか?
参考資料
(2021/07/17)