Skip to content

Instantly share code, notes, and snippets.

@blacknon
Created August 29, 2026 09:21
Show Gist options
  • Select an option

  • Save blacknon/1973bb846976aa0dded92cd3fc2e2089 to your computer and use it in GitHub Desktop.

Select an option

Save blacknon/1973bb846976aa0dded92cd3fc2e2089 to your computer and use it in GitHub Desktop.
elkstack
はい。単体 Docker ホストであれば、かなりシンプルに構成できます。
以下は Elastic Stack 9.5.2 を使った Elasticsearch + Logstash + Kibana の1ノード構成です。9.5.2 は現時点の公式最新版です。
今回はまず動かしやすいように、Elastic の認証機能を無効化した閉域・検証向け構成にしています。
ディレクトリ構成
elk/
├── docker-compose.yml
├── .env
└── logstash/
├── config/
│ └── logstash.yml
└── pipeline/
└── logstash.conf
.env
STACK_VERSION=9.5.2
docker-compose.yml
services:
elasticsearch:
image: docker.elastic.co/elasticsearch/elasticsearch:${STACK_VERSION}
container_name: elasticsearch
restart: unless-stopped
environment:
node.name: elasticsearch
cluster.name: elk-single
discovery.type: single-node
# 今回は閉域・検証用として認証を無効化
xpack.security.enabled: "false"
bootstrap.memory_lock: "true"
# ホストのメモリ容量に応じて変更
ES_JAVA_OPTS: "-Xms2g -Xmx2g"
ulimits:
memlock:
soft: -1
hard: -1
volumes:
- esdata:/usr/share/elasticsearch/data
# Elasticsearchは外部公開しない
ports:
- "127.0.0.1:9200:9200"
networks:
- elk
healthcheck:
test:
[
"CMD-SHELL",
"curl -fs http://localhost:9200/_cluster/health || exit 1"
]
interval: 10s
timeout: 5s
retries: 20
logstash:
image: docker.elastic.co/logstash/logstash:${STACK_VERSION}
container_name: logstash
restart: unless-stopped
environment:
LS_JAVA_OPTS: "-Xms512m -Xmx512m"
volumes:
- ./logstash/config/logstash.yml:/usr/share/logstash/config/logstash.yml:ro
- ./logstash/pipeline:/usr/share/logstash/pipeline:ro
# Persistent Queue等を保存
- logstashdata:/usr/share/logstash/data
ports:
# Beats入力
- "5044:5044"
depends_on:
elasticsearch:
condition: service_healthy
networks:
- elk
kibana:
image: docker.elastic.co/kibana/kibana:${STACK_VERSION}
container_name: kibana
restart: unless-stopped
environment:
SERVER_NAME: kibana
ELASTICSEARCH_HOSTS: '["http://elasticsearch:9200"]'
# 再起動しても暗号化済みSaved Objectを利用できるよう
# 必ず固定値にする
XPACK_ENCRYPTEDSAVEDOBJECTS_ENCRYPTIONKEY: "change-this-to-a-long-random-key-at-least-32-bytes"
ports:
- "5601:5601"
depends_on:
elasticsearch:
condition: service_healthy
networks:
- elk
volumes:
esdata:
logstashdata:
networks:
elk:
driver: bridge
ここで最も重要なのが、
volumes:
- esdata:/usr/share/elasticsearch/data
です。Elastic 公式も Elasticsearch の /usr/share/elasticsearch/data を永続ボリュームにすることを推奨しています。
⸻
Logstash設定
logstash/config/logstash.yml
http.host: "0.0.0.0"
config.reload.automatic: true
config.reload.interval: 5s
# メモリキューではなくディスク上のPersistent Queueを使用
queue.type: persisted
queue.max_bytes: 2gb
dead_letter_queue.enable: true
Logstash の Docker イメージでは /usr/share/logstash/data が永続データ用ディレクトリで、Persistent Queue もこの配下に保存されます。
そのため Compose 側で、
- logstashdata:/usr/share/logstash/data
としています。
⸻
Logstash Pipeline
とりあえず Beats → Logstash → Elasticsearch とするなら、
logstash/pipeline/logstash.conf
input {
beats {
port => 5044
}
}
filter {
}
output {
elasticsearch {
hosts => [
"http://elasticsearch:9200"
]
index => "%{[@metadata][beat]}-%{+YYYY.MM.dd}"
}
# 動作確認用
stdout {
codec => rubydebug
}
}
たとえば Winlogbeat からなら、
Winlogbeat
|
| TCP/5044
v
+-----------------------------------------+
| Docker Host |
| |
| +----------+ +---------------+ |
| | Logstash | ----> | Elasticsearch | |
| | 5044 | | 9200 | |
| +----------+ +-------+-------+ |
| | |
| | |
| +-------v-------+ |
| | Kibana | |
| | 5601 | |
| +---------------+ |
| |
| esdata volume |
| └─ Elasticsearch index |
| ├─ ログデータ |
| └─ Kibana Saved Objects |
| |
| logstashdata volume |
| └─ Persistent Queue |
+-----------------------------------------+
という形になります。
⸻
Kibanaの設定はなぜ残るのか
ここは少し分かりにくいですが、Kibana に kibanadata のような volume を作る必要は基本ありません。
Kibana の以下のような情報は、
* Dashboard
* Visualization
* Data View
* Discover の Saved Search
* Space
* Advanced Settings
* Alert
* Saved Objects
など、Elasticsearch の内部システムインデックスに保存されます。
したがって、
Kibana
↓
Elasticsearch
↓
/usr/share/elasticsearch/data
↓
esdata Docker Volume
という関係になっています。
つまり、
docker compose restart
しても、
docker compose down
docker compose up -d
しても、esdata が残っている限り、
ログデータも Kibana の Dashboard も残ります。
Elastic公式も docker compose down では Docker volume は保持され、再起動後に再利用されるとしています。
ただし、
docker compose down -v
は実行しないでください。
-v を付けると、
esdata
logstashdata
まで削除されます。
⸻
ホスト側で必要な設定
Elasticsearch 9.5 系では、Linux ホスト側で vm.max_map_count=1048576 が必要です。
確認:
sysctl vm.max_map_count
変更:
sudo sysctl -w vm.max_map_count=1048576
永続化:
echo 'vm.max_map_count=1048576' \
| sudo tee /etc/sysctl.d/99-elasticsearch.conf
sudo sysctl --system
⸻
起動
cd elk
docker compose up -d
確認:
docker compose ps
Elasticsearch:
curl http://127.0.0.1:9200
Kibana:
http://Dockerホスト:5601
Logstashログ:
docker compose logs -f logstash
Elasticsearch:
docker compose logs -f elasticsearch
⸻
1点だけセキュリティ上の注意
この例では、
xpack.security.enabled: "false"
なので Kibanaにログイン認証がありません。
したがって、閉域ネットワークならこの構成でも使えますが、業務環境として使うなら、
クライアント
↓ 5044
Logstash
↓
Elasticsearch
管理端末
↓ HTTPS
Kibana
として、Elasticsearch 9200 は外部非公開、Kibana は認証ありにする構成を推奨します。
特に「単体ホストのオンプレELK」として使うのであれば、次の段階として Elasticsearch/Kibanaの認証を有効化しつつ、Winlogbeat → Logstash → Elasticsearch をTLS化した構成まで作っておくと、かなり実運用に近い形になります。
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment