ログ分析管理OSS(Graylog-6.0.3)のDocker実行Tips

ログ分析管理OSSのGraylogのv6.0.3が公開されていたので早速、Dockerで立ち上げて操作性を確認した。その際、使用したdocker-compose.ymlを備忘かねて公開する。
以下公式HP等に記載あるdocker-compose.yml例をコピペするだけでは正常にサービス稼働しない為、一部改変している。
(参考)
https://hub.docker.com/r/graylog/graylog
https://graylog.org/post/announcing-graylog-6-0/
https://go2docs.graylog.org/current/downloading_and_installing_graylog/docker_installation.htm

## docker-compose.yml
```yaml
version: '3.8'

services:
# MongoDB: https://hub.docker.com/_/mongo/
  mongodb:
    image: "mongo:6.0.15"
    volumes:
      - "mongodb_data:/data/db"
    restart: "on-failure"
    networks:
      - graylog

  opensearch:
    image: "opensearchproject/opensearch:2.12.0"
    environment:
      OPENSEARCH_JAVA_OPTS: "-Xms1g -Xmx1g"
      bootstrap.memory_lock: "true"
      discovery.type: "single-node"
      action.auto_create_index: "false"
      plugins.security.ssl.http.enabled: "false"
      plugins.security.disabled: "true"
      # Can generate a password for `OPENSEARCH_INITIAL_ADMIN_PASSWORD` using a linux device via:
      # tr -dc A-Z-a-z-0-9_@#%^-_=+ < /dev/urandom  | head -c${1:-32}
      OPENSEARCH_INITIAL_ADMIN_PASSWORD: "+_8r#wliY3Pv5-HMIf4qzXImYzZf-M=M"
    ulimits:
      memlock:
        hard: "-1"
        soft: "-1"
      nofile:
        soft: "65536"
        hard: "65536"
    volumes:
      - "os_data:/usr/share/opensearch/data"
    restart: "on-failure"
    networks:
      - graylog

  # Graylog: https://hub.docker.com/r/graylog/graylog/
  graylog:
    hostname: "server"
    image: "graylog/graylog:6.0.3"
    depends_on:
      - mongodb
      - opensearch
    entrypoint: "/usr/bin/tini -- wait-for-it elasticsearch:9200 --  /docker-entrypoint.sh"
    environment:
      TZ: "Asia/Tokyo"
      GRAYLOG_ROOT_TIMEZONE: "Asia/Tokyo"
      GRAYLOG_NODE_ID_FILE: "/usr/share/graylog/data/config/node-id"
      GRAYLOG_HTTP_BIND_ADDRESS: "0.0.0.0:9000"
      GRAYLOG_ELASTICSEARCH_HOSTS: "http://opensearch:9200"
      GRAYLOG_MONGODB_URI: "mongodb://mongodb:27017/graylog"
      # To make reporting (headless_shell) work inside a Docker container
      GRAYLOG_REPORT_DISABLE_SANDBOX: "true"
      # CHANGE ME (must be at least 16 characters)!
      GRAYLOG_PASSWORD_SECRET: "somepasswordpepper"
      # Password: "admin"
      GRAYLOG_ROOT_PASSWORD_SHA2: "8c6976e5b5410415bde908bd4dee15dfb167a9c873fc4bb8a81f6f2ab448a918"
      GRAYLOG_HTTP_EXTERNAL_URI: "http://127.0.0.1:9000/"
    ports:
      - "514:1514/udp"     # Syslog
      - "514:1514/tcp"     # Syslog
      # Graylog web interface and REST API
      - "9000:9000/tcp"
      # Beats
      - "5044:5044/tcp"
      # Syslog TCP
      - "5140:5140/tcp"
      # Syslog UDP
      - "5140:5140/udp"
      # GELF TCP
      - "12201:12201/tcp"
      # GELF UDP
      - "12201:12201/udp"
      # Forwarder data
      - "13301:13301/tcp"
      # Forwarder config
      - "13302:13302/tcp"
    volumes:
      - "graylog_data:/usr/share/graylog/data/data"
      - "graylog_journal:/usr/share/graylog/data/journal"
    restart: "on-failure"
    networks:
      - graylog
volumes:
  mongodb_data:
  os_data:
  graylog_data:
  graylog_journal:
networks:
  graylog:
    driver: "bridge"
```
## docker compose up -d実行画面
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/171475/d61efd48-4140-da25-beae-4bf97cbe679c.png)

▼Graylog 6.0のログイン画面
http://localhost:9000/
ID:admin PW:admin ※上記docker-compose.ymlをそのまま流用した場合
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/171475/11a8db98-5927-1338-7eb3-7baa0782d6df.png)
Graylog 5.x台までは白黒のトレーディングルーム？が背景だったが、6.0はずいぶんとシンプルになっているw
(参考)Graylog 5.0までのログイン画面背景
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/171475/3b70b9e5-0b8c-16ac-dcd7-f46f3b1f2732.png)

## Graylog 6.0のSearch画面
今まで検索ワードの履歴が残らず不便だったが、やっと履歴をだせるようになったのが個人的に一番良いと思ったところ。
あとGraylog 5.x台までは赤色がGUI画面のメインカラーだったが、6.0からは青色がメインカラーに変更されている。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/171475/fbd3e313-74f2-0345-fecb-6d96d9ee1372.png)


## (補足)docker-compose.ymlの解説(ChatGPTにて生成)
```yaml
version: '3.8'
```
この行では、Docker Composeファイルのバージョンを指定しています。ここでは3.8を使用しています。
```yaml
services:
```
この行は、Docker Composeで起動するサービスのグループを定義する開始行です。
```yaml
  mongodb:
    image: "mongo:6.0.15"
    volumes:
      - "mongodb_data:/data/db"
    restart: "on-failure"
    networks:
      - graylog
```
この部分は、MongoDBサービスの設定を定義しています。
image: "mongo:6.0.15" は、使用するMongoDBイメージとバージョンを指定しています。
※もしもAVXに対応しないCPUを利用する場合はimage指定とplatform指定を以下の通りにする。
```yaml
    image: "arm64v8/mongo:6.0.15"
    platform: "linux/arm64/v8"
```
(参考)https://qiita.com/khat/items/6f4702ca105627e3648a

volumes: では、データを永続化するためのボリュームをマウントしています。mongodb_dataボリュームを /data/db にマウントします。
restart: "on-failure" は、Dockerコンテナが異常終了した場合に自動的に再起動するよう指示しています。
networks: では、このサービスが graylog ネットワークに参加することを指定しています。
```yaml
  opensearch:
    image: "opensearchproject/opensearch:2.12.0"
    environment:
      OPENSEARCH_JAVA_OPTS: "-Xms1g -Xmx1g"
      bootstrap.memory_lock: "true"
      discovery.type: "single-node"
      action.auto_create_index: "false"
      plugins.security.ssl.http.enabled: "false"
      plugins.security.disabled: "true"
      # Can generate a password for `OPENSEARCH_INITIAL_ADMIN_PASSWORD` using a linux device via:
      # tr -dc A-Z-a-z-0-9_@#%^-_=+ < /dev/urandom  | head -c${1:-32}
      OPENSEARCH_INITIAL_ADMIN_PASSWORD: "+_8r#wliY3Pv5-HMIf4qzXImYzZf-M=M"
    ulimits:
      memlock:
        hard: "-1"
        soft: "-1"
      nofile:
        soft: "65536"
        hard: "65536"
    volumes:
      - "os_data:/usr/share/opensearch/data"
    restart: "on-failure"
    networks:
      - graylog
```
この部分は、OpenSearchサービスの設定を定義しています。

image: "opensearchproject/opensearch:2.12.0" は、使用するOpenSearchイメージとバージョンを指定しています。
environment: では、OpenSearchの環境変数を設定しています。JVMヒープサイズ、シングルノードディスカバリ、インデックス自動作成無効化、セキュリティ無効化、初期管理パスワードなどが含まれています。
ulimits: では、メモリロックとファイル記述子の制限を設定しています。
volumes: では、データを永続化するためのボリュームをマウントしています。os_data ボリュームを /usr/share/opensearch/data にマウントします。
restart: "on-failure" は、Dockerコンテナが異常終了した場合に自動的に再起動するよう指示しています。
networks: では、このサービスが graylog ネットワークに参加することを指定しています。
```yaml
  graylog:
    hostname: "server"
    image: "graylog/graylog:6.0.3"
    depends_on:
      - mongodb
      - opensearch
    entrypoint: "/usr/bin/tini -- wait-for-it elasticsearch:9200 --  /docker-entrypoint.sh"
    environment:
      TZ: "Asia/Tokyo"
      GRAYLOG_ROOT_TIMEZONE: "Asia/Tokyo"
      GRAYLOG_NODE_ID_FILE: "/usr/share/graylog/data/config/node-id"
      GRAYLOG_HTTP_BIND_ADDRESS: "0.0.0.0:9000"
      GRAYLOG_ELASTICSEARCH_HOSTS: "http://opensearch:9200"
      GRAYLOG_MONGODB_URI: "mongodb://mongodb:27017/graylog"
      # To make reporting (headless_shell) work inside a Docker container
      GRAYLOG_REPORT_DISABLE_SANDBOX: "true"
      # CHANGE ME (must be at least 16 characters)!
      GRAYLOG_PASSWORD_SECRET: "somepasswordpepper"
      # Password: "admin"
      GRAYLOG_ROOT_PASSWORD_SHA2: "8c6976e5b5410415bde908bd4dee15dfb167a9c873fc4bb8a81f6f2ab448a918"
      GRAYLOG_HTTP_EXTERNAL_URI: "http://127.0.0.1:9000/"
    ports:
      - "514:1514/udp"     # Syslog
      - "514:1514/tcp"     # Syslog
      # Graylog web interface and REST API
      - "9000:9000/tcp"
      # Beats
      - "5044:5044/tcp"
      # Syslog TCP
      - "5140:5140/tcp"
      # Syslog UDP
      - "5140:5140/udp"
      # GELF TCP
      - "12201:12201/tcp"
      # GELF UDP
      - "12201:12201/udp"
      # Forwarder data
      - "13301:13301/tcp"
      # Forwarder config
      - "13302:13302/tcp"
    volumes:
      - "graylog_data:/usr/share/graylog/data/data"
      - "graylog_journal:/usr/share/graylog/data/journal"
    restart: "on-failure"
    networks:
      - graylog
```
この部分は、Graylogサービスの設定を定義しています。
hostname: "server" は、このコンテナのホスト名を "server" に設定します。
image: "graylog/graylog:6.0.3" は、使用するGraylogイメージとバージョンを指定しています。
depends_on: では、MongoDBとOpenSearchサービスが起動した後にGraylogが起動するよう指定しています。
entrypoint: では、Graylogの起動時にOpenSearchが利用可能になるまで待機するよう指示しています。
environment: では、Graylogの環境変数を設定しています。タイムゾーン、ノードIDファイル、HTTPバインドアドレス、Elasticsearchホスト、MongoDBURI、パスワードシークレット、rootパスワードハッシュ、外部URIなどが含まれています。
ports: では、ホストとコンテナ間でマッピングする
514:1514/udp と 514:1514/tcp は、SyslogのUDP/TCPポートをマップしています。
9000:9000/tcp は、GraylogウェブインターフェースとRESTAPIのポートをマップしています。
5044:5044/tcp は、Beatsのポートをマップしています。
5140:5140/tcp と 5140:5140/udp は、Syslog TCP/UDPのポートをマップしています。
12201:12201/tcp と 12201:12201/udp は、GELF TCP/UDPのポートをマップしています。
13301:13301/tcp は、Forwarderデータのポートをマップしています。
13302:13302/tcp は、Forwarder設定のポートをマップしています。
この部分では、Graylogのデータを永続化するためのボリュームをマウントしています。
graylog_data ボリュームを /usr/share/graylog/data/data にマウントします。
graylog_journal ボリュームを /usr/share/graylog/data/journal にマウントします。
restart: "on-failure" は、Dockerコンテナが異常終了した場合に自動的に再起動するよう指示しています。
networks: では、このサービスが graylog ネットワークに参加することを指定しています。
```yaml
volumes:
  mongodb_data:
  os_data:
  graylog_data:
  graylog_journal:
```
この部分では、使用するボリュームを定義しています。
mongodb_data は、MongoDBのデータ永続化用のボリュームです。
os_data は、OpenSearchのデータ永続化用のボリュームです。
graylog_data と graylog_journal は、Graylogのデータとジャーナルの永続化用のボリュームです。
```yaml
networks:
  graylog:
    driver: "bridge"
```
この部分では、サービス間の通信に使用するネットワークを定義しています。
graylog という名前のブリッジネットワークを作成します。