はじめに
複数の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:
【ポイント】
- Dockerコンテナのロギングドライバの指定を「fluentd」にする。
- WEBサーバ(testserver[12])のfluentd-address設定を「localhost:24224」にすることで、localhost = DockerホストのFluentdポートにログ転送される。
また、ログ管理サーバ(fluentd)のports設定を「24224:24224」にすることで、Dockerホストに来たログをログ管理サーバに転送している。 - tag設定に「{{.Name}}」を付与することで、出力されたログにコンテナ名を付与している。tag設定は後述のFluentd設定で利用している。
- 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>
【ポイント】
- <source>セクションで入力の制御を行う。
- <match>セクションで出力の制御を行う。
また、設定したtag名によって制御を分けることができる。 - 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]#
正しくログ転送されていた。(★部)