用 Docker 執行 FluentD

Posted by blueskyson on August 16, 2022

此範例會參考官方的範例來寫一個 Dockerfile 用以執行 FluentD,並且讓 FlentD 透過 HTTP 來接收 json 檔案,並直接輸出到 stdout。

作業系統: Ubutu 20.04 安裝 curl、docker、postman

下載範例檔案

新增一個工作目錄:

$ mkdir custom-fluentd
$ cd custom-fluentd

從 Github 下載 fluent.conf 和 entrypoint.sh,此時最新版為 v1.15:

$ curl https://raw.githubusercontent.com/fluent/fluentd-docker-image/master/v1.15/alpine/fluent.conf > fluent.conf
$ curl https://raw.githubusercontent.com/fluent/fluentd-docker-image/master/v1.15/alpine/entrypoint.sh > entrypoint.sh
$ chmod +x entrypoint.sh

新增插件目錄,目錄中的 plugins scripts 會被複製進這個 Docker Image 中:

$ mkdir plugins

下載 Dockerfile 範例:

curl https://raw.githubusercontent.com/fluent/fluentd-docker-image/master/Dockerfile.sample > Dockerfile

製作 Dockerfile

在 Dockerfile 中填入 MAINTAINER 和下載 Fluentd plugins,預設範例已經有 fluent-plugin-elasticsearch。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
FROM fluent/fluentd:v1.15-1
MAINTAINER Jack_Lin <jacklin@cybersoft4u.com>

USER root

RUN apk add --no-cache --update --virtual .build-deps \
        sudo build-base ruby-dev \
 # cutomize following instruction as you wish
 && sudo gem install fluent-plugin-elasticsearch \
 && sudo gem sources --clear-all \
 && apk del .build-deps \
 && rm -rf /home/fluent/.gem/ruby/2.5.0/cache/*.gem

COPY fluent.conf /fluentd/etc/
COPY entrypoint.sh /bin/

USER fluent

改寫 fluent.conf:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# Hello World configuration will take events received on port 18080 using
# HTTP as a protocol

# set Fluentd's configuration parameters
<system>
    Log_Level info
</system>

# define the HTTP source which will provide log events
<source>
    @type http
    port 18080
</source>

# accept all log events regardless of tag and write them to the console
<match *>
    @type stdout
</match>

建置 Docker Image:

$ docker build -t custom-fluentd:latest ./

測試

用剛剛建立的 Docker Image 啟動一個 Container:

  • 命名為 custom-docker-fluent-logger
  • 將 logs 目錄掛載到 Container
  • 把連接埠 18080 對應到主機的 18080。
$ mkdir -p logs
$ docker run -it --rm --name custom-docker-fluent-logger -v $(pwd)/logs:/fluentd/logs -p 18080:18080 custom-fluentd:latest

接著打開 Postman,傳送一個 json 到 localhost:18080。

每傳送一次,在 custom-docker-fluent-logger 就會輸出一行 {"Hello": "World"}: