0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

UbuntuのechoをFluentdで捕捉する(docker-compose.ymlサンプルあり)

0
Posted at

はじめに

前回記事では、fluentdのdocker composeのサンプルを試した
HTTPアクセスのログをブラウザ(kibana)でグラフィカルに見ることができた


今回は、1つ立ち戻りDocker Logging Driverを試す

サンプルをコピペすれば動くことは自明(?)なので
docker-compose.ymlファイルにubuntuとfluentdをまとめて定義し
さらにdockerネットワークにそれらを所属させて
ubuntuのechoをfluentdに流し込むことを行う

実際には、公式サンプルのままでは指定しているバージョンが古かったりして動かないこともある

fluentd/Dockerfile

公式サンプルとほぼ同じ
バージョンは5.2.4に上げている

# fluentd/Dockerfile

FROM fluent/fluentd:v1.12.0-debian-1.0
USER root
RUN ["gem", "install", "fluent-plugin-elasticsearch", "--no-document", "--version", "5.2.4"]
USER fluent

fluent.conf

コンフィグファイルはサンプルのまま
どこも変更していない

<source>
  @type forward
  port 24224
  bind 0.0.0.0
</source>

<match *>
  @type stdout
</match>

24224ポートで受けた内容を標準出力する

docker-compose.yml

まずは完成形

version: "3"
services:
  fluentd:
    build: ./fluentd
    volumes:
      - ./fluentd/conf:/fluentd/etc
    ports:
      - "24224:24224"
      - "24224:24224/udp"
    networks:
      efk-net:
        ipv4_address: 172.22.0.10
  
  client1:
    image: ubuntu
    tty: true
    stdin_open: true
    networks:
      - efk-net
    depends_on:
      - fluentd
    logging:
      driver: "fluentd"
      options:
        fluentd-address: 172.22.0.10:24224
        fluentd-async-connect: "true"
        fluentd-retry-wait: 2s
        fluentd-max-retries: 30

networks:
  efk-net:
    driver: bridge
    ipam:
      driver: default
      config:
        - subnet: 172.22.0.0/16

ymlファイルの全体像は以上

fluentdのポイント

dockerネットワークに所属する他のコンテナからみたときに
IPアドレスがわかっているほうが都合がよいので
IPアドレスを固定しておく

    networks:
      efk-net:
        ipv4_address: 172.22.0.10

ubuntuのポイント

ロギングは fluentd を指定する
先ほど固定したIPアドレスと、コンフィグファイルで指定したポートがアドレスとなる

    logging:
      driver: "fluentd"
      options:
        fluentd-address: 172.22.0.10:24224
        fluentd-async-connect: "true"
        fluentd-retry-wait: 2s
        fluentd-max-retries: 30

fluentdコンテナが起動するまえにubuntuが立ち上がるとエラーが出る

<エラーメッセージ>

Error response from daemon: failed to initialize logging driver: dial tcp 172.20.10.4:24224: connect: connection refused.

エラーを回避するために、非同期でfluentdに接続するよう設定する

fluentd-async-connect: "true"

参考:My web server tries to connect to fluentd before listening port on docker

コンテナを起動する

コンテナをバックグラウンドで起動する
docker-compose.ymlファイルが存在する階層で以下のコマンドを実行する

docker compose up -d

コンテナのログを画面に表示する

docker compose logs -f

ログ表示を中止するときはCtrl + C

Ubuntuからechoする

Ubuntuコンテナに入る

docker compose exec client1 bash

単純にechoするだけではfluentdのログに表示されない

なぜログがfluentdに流れないのか?

docker container内で叩いたコマンドを docker log に出力する方法
こちらの記事がとても分かりやすい

結論

つまり、コンテナ内で実行したコマンド結果を /proc/1/fd/1 に流せば docker logとして扱われます。

とのことらしい。
PID=1かつファイルディスクリプタ(fd)=1(標準出力)
に対してecho結果をリダイレクトすると
Dockerログとなり、Fluentdに流れる

echo "Hello, Fluentd" > /proc/1/fd/1

<dockerのログ>

2306_fluentdstudy-client1-1  | Hello, Flunetd
2306_fluentdstudy-fluentd-1  | 2023-06-14 12:28:57.000000000 +0000 91cecac07bb7: {"source":"stdout","log":"Hello, Flunetd\r","container_id":"91cecac07bb70f4455d33cab12791c930aaa2b064680002ae0e62b254c01b66d","container_name":"/2306_fluentdstudy-client1-1"}

おわりに

ubuntuコンテナのログをfluentdコンテナの標準出力に表示させた
公式のサンプルでは docker run までしか載っていないが
今回はdocker-compose.ymlにまとめて、1コマンドで環境をつくれるようにした

単純な echo では、ubuntuのログがfluentdに流れなかったが
echo "Hello, Fluentd" > /proc/1/fd/1とすることで
ubuntuのログがfluentdの標準出力に表示されるようになった

以上

今後は、単なるechoではなく、syslogをfluentdに渡したい

参考

糸冬了!!

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?