DockerコンテナログをFluentdで一元管理する(基本設定のみ)

2021-10-17

はじめに

複数のDockerコンテナから出るログを、Fluentdを用いて一元管理する。
本記事ではFluentdにログ転送する基本的な設定を記載する。

システム環境

WEBサーバ(Nginx)を2台と、ログ管理サーバ(Fluentd)を1台、Dockerで環境構築する。

環境構築はdocker-composeを使用している。docker-composeについてはこちらを参考に。

構成図

ディレクトリ構成

<任意のディレクトリ>
L docker-compose.yml
L nginx
 L Dockerfile
L fluentd
 L Dockerfile
 L docker2fluentd.conf

設定ファイルの準備

docker-compose.yml

version: '3'

services:
  testserver1:
    image: testserver:vrfy
    build: ./nginx
    hostname: testserver1
    networks:
      - dockernet
    logging:
      driver: fluentd ★ポイント(1)
      options:
        fluentd-address: localhost:24224 ★ポイント(2)
        tag: docker.{{.Name}} ★ポイント(3)
        fluentd-async-connect: 'true' ★ポイント(4)

  testserver2:
    image: testserver:vrfy
    build: ./nginx
    hostname: testserver2
    networks:
      - dockernet
    logging:
      driver: fluentd ★ポイント(1)
      options:
        fluentd-address: localhost:24224 ★ポイント(2)
        tag: docker.{{.Name}} ★ポイント(3)
        fluentd-async-connect: 'true' ★ポイント(4)

  fluentd:
    image: fluentd:vrfy
    build: ./fluentd
    hostname: fluentd
    ports:
      - 24224:24224 ★ポイント(2)
    restart: always
    environment:
      - FLUENTD_CONF=docker2fluentd.conf ★ポイント(5)

networks:
  dockernet:

【ポイント】

  1. Dockerコンテナのロギングドライバの指定を「fluentd」にする。
  2. WEBサーバ(testserver[12])のfluentd-address設定を「localhost:24224」にすることで、localhost = DockerホストのFluentdポートにログ転送される。
    また、ログ管理サーバ(fluentd)のports設定を「24224:24224」にすることで、Dockerホストに来たログをログ管理サーバに転送している。
  3. tag設定に「{{.Name}}」を付与することで、出力されたログにコンテナ名を付与している。tag設定は後述のFluentd設定で利用している。
  4. FLUENTD_CONF設定に、独自に作成するファイル名を指定する。

Dockerfile (nginx用)

FROM nginx:latest

最新のNginxイメージをpullしているだけ。

Dockerfile (fluentd用)

FROM fluentd:v1.14-1
COPY docker2fluentd.conf /fluentd/etc/docker2fluentd.conf

【ポイント】
独自に作成した設定ファイル「docker2fluentd.conf」を、Dockerコンテナの/fluentd/etc/docker2fluentd.confにコピーしている。

docker2fluentd.conf

<source> ★ポイント(1)
  @type forward
  port 24224
  bind 0.0.0.0
</source>

<match docker.*> ★ポイント(2)
  @type stdout ★ポイント(3)
</match>

【ポイント】

  1. <source>セクションで入力の制御を行う。
  2. <match>セクションで出力の制御を行う。
    また、設定したtag名によって制御を分けることができる。
  3. stdout(=標準出力)を設定することで、ログ管理サーバの標準出力に転送されたログが記録される。

Dockerコンテナのビルド・起動

[root]# docker-compose build
Building testserver1
Sending build context to Docker daemon  2.048kB
Step 1/1 : FROM nginx:latest
 ---> ad4c705f24d3
Successfully built ad4c705f24d3
Successfully tagged testserver:vrfy
Building testserver2
Sending build context to Docker daemon  2.048kB
Step 1/1 : FROM nginx:latest
 ---> ad4c705f24d3
Successfully built ad4c705f24d3
Successfully tagged testserver:vrfy
Building fluentd
Sending build context to Docker daemon  3.584kB
Step 1/2 : FROM fluentd:v1.14-1
 ---> 3134b06b92a8
Step 2/2 : COPY docker2fluentd.conf /fluentd/etc/docker2fluentd.conf
 ---> Using cache
 ---> 3dc8b2705684
Successfully built 3dc8b2705684
Successfully tagged fluentd:vrfy
[root]# 
[root]# docker-compose up -d
Creating network "test_dockernet" with the default driver
Creating network "test_default" with the default driver
Creating test_testserver2_1 ... done
Creating test_testserver1_1 ... done
Creating test_fluentd_1     ... done
[root]# 
[root]# docker-compose ps
       Name                     Command               State                 Ports               
------------------------------------------------------------------------------------------------
test_fluentd_1       tini -- /bin/entrypoint.sh ...   Up      0.0.0.0:24224->24224/tcp, 5140/tcp
test_testserver1_1   /docker-entrypoint.sh ngin ...   Up      80/tcp                            
test_testserver2_1   /docker-entrypoint.sh ngin ...   Up      80/tcp                            
[root]#

ログ転送テスト

WEBサーバにHTTPアクセスしてアクセスログを出力させ、ログ管理サーバに転送されることを確認する。

WEBサーバ#1,2でcurlコマンドを使ってHTTPアクセスする。

[root]# docker exec -it test_testserver1_1 bash
root@testserver1:/# curl http://localhost
<!DOCTYPE html>
<html>
〜〜〜省略〜〜〜
<p><em>Thank you for using nginx.</em></p>
</body>
</html>
root@testserver1:/# 

[root]# docker exec -it test_testserver2_1 bash
root@testserver2:/# curl http://localhost
<!DOCTYPE html>
<html>
〜〜〜省略〜〜〜
<p><em>Thank you for using nginx.</em></p>
</body>
</html>
root@testserver2:/#

ログ管理サーバの標準出力を確認する。

[root]# docker logs test_fluentd_1 
〜〜〜省略〜〜〜
2021-09-19 09:23:24 +0000 [info]: starting fluentd-1.14.0 pid=10 ruby="2.7.4"
2021-09-19 09:23:25 +0000 [info]: spawn command to main:  cmdline=["/usr/bin/ruby", "-Eascii-8bit:ascii-8bit", "/usr/bin/fluentd", "--config", "/fluentd/etc/docker2fluentd.conf", "--plugin", "/fluentd/plugins", "--under-supervisor"]
2021-09-19 09:23:28 +0000 [info]: adding match pattern="docker.*" type="stdout"
2021-09-19 09:23:29 +0000 [info]: adding source type="forward"
2021-09-19 09:23:29 +0000 [info]: #0 starting fluentd worker pid=19 ppid=10 worker=0
2021-09-19 09:23:29 +0000 [info]: #0 listening port port=24224 bind="0.0.0.0"
2021-09-19 09:23:29 +0000 [info]: #0 fluentd worker is now running worker=0
★2021-09-19 09:25:46.000000000 +0000 docker.test_testserver1_1: {"container_name":"/test_testserver1_1","source":"stdout","log":"127.0.0.1 - - [19/Sep/2021:09:25:46 +0000] \"GET / HTTP/1.1\" 200 615 \"-\" \"curl/7.64.0\" \"-\"","container_id":"9932f83b0ee096c4554bed6d4dcda004559b20f5993719cd2ab4bcae8ffe59ec"}
★2021-09-19 09:26:57.000000000 +0000 docker.test_testserver2_1: {"container_id":"7e0467aa07243a9344ac4d769dd599030d138754572126fb8e974374ee925d60","container_name":"/test_testserver2_1","source":"stdout","log":"127.0.0.1 - - [19/Sep/2021:09:26:57 +0000] \"GET / HTTP/1.1\" 200 615 \"-\" \"curl/7.64.0\" \"-\""}
[root]#

正しくログ転送されていた。(★部)

IT技術Docker,Fluentd

Posted by dai