ELKスタック on Ubuntu Docker — Elasticsearch+Logstash+Kibana一括構築

ELKスタック on Ubuntu Docker — Elasticsearch+Logstash+Kibana一括構築 モニタリング

この記事のポイント

  • Docker Compose 1ファイルで Elasticsearch + Logstash + Kibana 8.19.16 を同時起動できます
  • 実測では3コンテナ合計で約2.77GiBのメモリを消費しました。VPSは4GB、最低でも2GBが必要です
  • Elasticsearchはシングルノードで起動約39秒、status: greenになりました
  • Logstashへ流したログが Elasticsearch に着弾し、Kibanaの実画面(Discover・Index管理)で確認できました
  • Dockerイメージのタグ(8.19.16)とAptリポジトリのCandidate(8.19.16)は一致しています

「ログを一括収集して可視化したい」「サーバーの状態をブラウザで監視したい」——こうしたニーズに答えるのがELKスタック(Elasticsearch + Logstash + Kibana)です。

結論からいうと、docker compose up -d の1コマンドで3つのサービスをまとめて起動できます。本記事では実際にDockerで ELK 8.19.16 を起動し、メモリ使用量・クラスタヘルス・Logstash経由のログ投入までを計測した実測データと、Kibanaの実GUI画面をそのままお見せします。

注意

本記事のコマンドは Ubuntu 24.04.4 LTS + Docker 20.10.12 / Docker Compose v2.2.3 環境で検証しています。後述のとおり ELK 3コンテナは合計で約2.77GiBのメモリを使いました。1GBのVPSプランではvm.max_map_countを調整してもメモリ不足で落ちます。学習用でも2GB、快適に使うなら4GBプランを選んでください。

ELKスタックとは

ELKスタックは3つのOSSツールの頭文字をとった名称です。

  • Elasticsearch:全文検索エンジン。ログデータを保存・インデックスして高速検索できます
  • Logstash:データパイプライン。アプリやシステムのログを収集・変換してElasticsearchへ転送します
  • Kibana:可視化ダッシュボード。ブラウザから Elasticsearch のデータをグラフや表で確認できます

ログは「アプリ/サーバー → Logstash → Elasticsearch → Kibana」という順で流れます。図にすると次のイメージです。

ELKスタックのデータの流れ(概念図)
ELKスタックのデータの流れ(概念図)

最近は軽量ログ収集のFilebeatを加えて「ELKBスタック」と呼ぶこともありますが、まずはELKの3つを動かすのが定番です。

検証環境とバージョン

今回の実測に使った環境です。Dockerイメージは docker.elastic.co の公式イメージ、バージョンは3つとも 8.19.16 で揃えました。

項目
コンテナOS Ubuntu 24.04.4 LTS(Noble Numbat)
カーネル 5.10.76-linuxkit aarch64
Docker Engine 20.10.12(build e91ed57)
Docker Compose v2.2.3
Elasticsearch / Logstash / Kibana 8.19.16
計測日 2026-06-14

実際に docker --versiondocker compose ps を実行した結果が以下です。3コンテナとも running になっています。

検証環境とELK構成バージョン(実測)
検証環境とELK構成バージョン(実測)

DockerとDocker Composeのインストール

DockerがインストールされていないUbuntu 24.04サーバーでは、まずDockerを入れます。apt update を忘れると古いパッケージが入るので、これは必ず先に実行します。




ubuntu@linuxlab: ~
$ sudo apt update && sudo apt install -y docker.io docker-compose-v2
Reading package lists… Done
Building dependency tree… Done
Setting up docker.io (29.1.3-0ubuntu3~24.04.2) …
Setting up docker-compose-v2 (2.40.3+ds1-0ubuntu1~24.04.1) …
$ docker –version
Docker version 20.10.12, build e91ed57
$ docker compose version
Docker Compose version v2.2.3
$ sudo systemctl enable –now docker
Created symlink /etc/systemd/system/multi-user.target.wants/docker.service

Ubuntu 24.04 のリポジトリで配布される docker.io は実測で 29.1.3-0ubuntu3~24.04.2docker-compose-v22.40.3+ds1-0ubuntu1~24.04.1 でした(22.04でもほぼ同じバージョンが入ります)。古いガイドにある docker-compose(ハイフン付き・v1系)ではなく、プラグイン版の docker compose(スペース区切り)を使います。

docker-compose.yml を作成する

作業ディレクトリを作り、docker-compose.ymlを作成します。ElasticsearchはES_JAVA_OPTSでJVMヒープを512MBに固定し、学習用途では xpack.security.enabled=false で認証を切ってシンプルに動かします。




ubuntu@linuxlab: ~
$ mkdir elk-stack && cd elk-stack
$ cat > docker-compose.yml <<‘EOF’
services:
elasticsearch:
image: docker.elastic.co/elasticsearch/elasticsearch:8.19.16
container_name: elk_es
environment:
– discovery.type=single-node
– xpack.security.enabled=false
– ES_JAVA_OPTS=-Xms512m -Xmx512m
ports:
– “9200:9200”
logstash:
image: docker.elastic.co/logstash/logstash:8.19.16
container_name: elk_logstash
environment:
– LS_JAVA_OPTS=-Xms256m -Xmx256m
– XPACK_MONITORING_ENABLED=false
volumes:
– ./logstash.conf:/usr/share/logstash/pipeline/logstash.conf:ro
ports:
– “5044:5044”
depends_on:
– elasticsearch
kibana:
image: docker.elastic.co/kibana/kibana:8.19.16
container_name: elk_kibana
environment:
– ELASTICSEARCH_HOSTS=http://elasticsearch:9200
ports:
– “5601:5601”
depends_on:
– elasticsearch
EOF

正直、ここで一番詰まりやすいのが version: '3.8' の書き方です。Compose v2では version 行は不要(むしろ警告が出る)なので、上のようにservices:から書き始めます。

手順1:Logstash設定ファイルを作る

LogstashはTCPで受け取ったログをElasticsearchへ転送するパイプラインを設定します。port => 5044 で待ち受け、output でElasticsearchの linuxlab-test-YYYY.MM.dd インデックスへ書き込みます。




ubuntu@linuxlab: ~/elk-stack
$ cat > logstash.conf <<‘EOF’
input {
tcp {
port => 5044
codec => “line”
}
}
filter {
mutate {
add_field => { “source” => “linuxlab-elk-test” }
}
}
output {
elasticsearch {
hosts => [“http://elasticsearch:9200”]
index => “linuxlab-test-%{+YYYY.MM.dd}”
}
stdout { codec => rubydebug }
}
EOF

ELKスタックを起動する

手順2:docker compose up で一括起動

ここが一番のポイントです。docker compose up -d の1コマンドで3コンテナが同時に立ち上がります。




ubuntu@linuxlab: ~/elk-stack
$ sudo docker compose up -d
Network elk-stack_default Created
Container elk_es Creating
Container elk_es Created
Container elk_kibana Creating
Container elk_logstash Creating
Container elk_kibana Created
Container elk_logstash Created
Container elk_es Started
Container elk_logstash Started
Container elk_kibana Started
$ sudo docker compose ps
NAME SERVICE STATUS PORTS
elk_es elasticsearch running 0.0.0.0:9200->9200/tcp
elk_kibana kibana running 0.0.0.0:5601->5601/tcp
elk_logstash logstash running 0.0.0.0:5044->5044/tcp, 9600/tcp

3コンテナすべてがrunningになれば成功です。Elasticsearchの起動は実測で約39秒、Kibanaがブラウザから開けるようになるまではさらに1〜2分かかります。

手順3:コンテナのメモリ使用量を確認する

ここが本記事で一番伝えたい実測値です。docker stats で計測したところ、3コンテナ合計で約2.77GiBを消費していました。内訳はElasticsearch 1.106GiB・Kibana 1.03GiB・Logstash 632.3MiBです。

ELKスタック3コンテナのメモリ使用量(実測)
ELKスタック3コンテナのメモリ使用量(実測)



ubuntu@linuxlab: ~/elk-stack
$ sudo docker stats –no-stream
NAME CPU % MEM USAGE / LIMIT MEM %
elk_es 179.78% 1.106GiB / 11.68GiB 9.47%
elk_kibana 7.98% 1.03GiB / 11.68GiB 8.82%
elk_logstash 2.10% 632.3MiB / 11.68GiB 5.29%

注目したいのは、JVMヒープを512MBに絞っていてもElasticsearchの実メモリは1.1GiB近くまで膨らむ点です。これはヒープ外のメモリ(Luceneのファイルキャッシュ等)を含むためです。起動直後はインデックス構築でCPUが 179%(複数コア)まで跳ねていますが、これは一時的なもので、しばらくすると落ち着きます。

著者アイコン
著者アイコン

「2GBあれば動く」という解説をよく見かけますが、実測すると3コンテナで2.77GiB使っていました。2GBプランだとスワップやOOMで不安定になりがちです。学習用でも4GBプラン、本番なら8GB以上を強くおすすめします。1GBプランで試すなら、後述のとおりJVMヒープを256MBまで削るのが前提です。

Elasticsearchのヘルスチェックとログ投入

Kibanaを開く前に、curlでElasticsearchの状態を確認しておきます。status: greenが出れば正常です。さらにLogstashへテストログを流し込み、Elasticsearchのインデックスに着弾するところまで確認しました。

Elasticsearchヘルスチェックとログ投入(実測)
Elasticsearchヘルスチェックとログ投入(実測)



ubuntu@linuxlab: ~
$ curl -s http://localhost:9200/_cluster/health | python3 -m json.tool
{
“cluster_name”: “docker-cluster”,
“status”: “green”,
“number_of_nodes”: 1,
“number_of_data_nodes”: 1,
“active_shards_percent_as_number”: 100.0
}
$ curl -s http://localhost:9200/ | python3 -c “import json,sys;print(json.load(sys.stdin)[‘version’][‘number’])”
8.19.16
# Logstash の TCP 5044 へテストログを5行流す
$ for i in 1 2 3 4 5; do echo “linuxlab ELK test log line $i” | nc -w1 localhost 5044; done
$ curl -s ‘http://localhost:9200/_cat/indices/linuxlab-test-*?v&h=health,status,index,docs.count,store.size’
health status index docs.count store.size
yellow open linuxlab-test-2026.06.14 5 15.8kb

バージョン「8.19.16」と status: green が確認できました。Logstashへ流した5行のログは、ちゃんと linuxlab-test-2026.06.14 インデックスに 5ドキュメント(15.8kb)として保存されています。これでログ収集パイプラインが端から端まで動いていることが確認できました。

green と yellow の違い

クラスタ全体は green ですが、Logstashが作ったインデックスは yellow です。これは異常ではありません。シングルノード構成ではレプリカ(複製シャード)の割り当て先がないため、レプリカを持つインデックスは yellow になります。学習環境では気にしなくてOKです。

Kibana のGUI画面を確認する

Kibanaが起動したら、ブラウザで http://<サーバーIP>:5601 にアクセスします。実際に起動したKibana 8.19.16 のホーム画面がこちらです。Elasticsearch・Observability・Security・Analytics の4つの入口が並びます。

Kibana 8.19.16 ホーム画面(起動直後の実画面)
Kibana 8.19.16 ホーム画面(起動直後の実画面)

① Discoverビューでログを検索する

左メニューの「Discover」では、Elasticsearchに保存されたログをリアルタイムに検索・フィルタリングできます。先ほどLogstashで流した5件のログが、@timestampmessagesource といったフィールドつきで一覧表示されているのが分かります。

KibanaのDiscoverビュー(投入した5件のログを実表示)
KibanaのDiscoverビュー(投入した5件のログを実表示)

② Dev Toolsでクエリを試す

「Dev Tools」のConsoleは、ElasticsearchのREST APIをブラウザから直接叩ける開発者向けツールです。GET _cluster/health のようなクエリを補完つきで書けるので、curlより手軽に検証できます。

KibanaのDev Tools Console(クエリ実行画面)
KibanaのDev Tools Console(クエリ実行画面)

③ Index Managementでインデックスを管理する

「Stack Management → Index Management」では、Elasticsearch上のインデックスをGUIで管理できます。Logstashが作成した linuxlab-test-2026.06.14 が、ドキュメント数5・サイズ15.82kb・Healthが yellow として表示されています。コマンドで見た値とぴったり一致します。

KibanaのIndex Management(インデックス一覧の実画面)
KibanaのIndex Management(インデックス一覧の実画面)

Aptリポジトリからインストールする方法(Docker未使用の場合)

Dockerを使わずホストに直接入れたい場合は、Elasticの公式Aptリポジトリを追加します。実測したところ、2026-06-14時点のCandidateは Elasticsearch / Kibana が 8.19.16、Logstashが 1:8.19.16-1 でした。今回Dockerで起動したイメージタグと同じ系列です。

Elastic公式aptリポジトリの提供バージョン(実測)
Elastic公式aptリポジトリの提供バージョン(実測)



ubuntu@linuxlab: ~
$ wget -qO- https://artifacts.elastic.co/GPG-KEY-elasticsearch | gpg –dearmor | sudo tee /usr/share/keyrings/elasticsearch-keyring.gpg > /dev/null
$ echo “deb [signed-by=/usr/share/keyrings/elasticsearch-keyring.gpg] https://artifacts.elastic.co/packages/8.x/apt stable main” | sudo tee /etc/apt/sources.list.d/elastic-8.x.list
$ sudo apt update && apt-cache policy elasticsearch | head -6
elasticsearch:
Installed: (none)
Candidate: 8.19.16
Version table:
8.19.16 500
500 https://artifacts.elastic.co/packages/8.x/apt stable/main arm64 Packages

apt版はsystemdサービスとして動くので、再起動後も自動で立ち上がります。一方で3サービス分のチューニングを自分でやる必要があるため、まず構成を理解したい段階ではDocker Composeのほうがおすすめです。

よくあるエラーと解決策

① max virtual memory areas vm.max_map_count is too low

Elasticsearchが起動時に出す定番エラーです。Linuxカーネルのメモリマップ数上限を増やせば解決します。ここだけは順番を間違えると起動しません。




ubuntu@linuxlab: ~
$ sudo sysctl -w vm.max_map_count=262144
vm.max_map_count = 262144
# 再起動後も有効にするには /etc/sysctl.conf に追記
$ echo “vm.max_map_count=262144” | sudo tee -a /etc/sysctl.conf

② Kibana server is not ready yet のまま固まる

Elasticsearchが接続を受け付ける前にKibanaが起動しようとすると表示されます。あわてず、curl http://localhost:9200 が応答するようになるまで2〜3分待ってからブラウザを再読み込みしてください。実測でもKibanaが開けるまでは起動から1〜2分かかりました。

③ Out of Memory(OOM)でコンテナが落ちる

2GB以下のVPSでは、ElasticsearchのJVMヒープを削るのが前提です。docker-compose.ymlES_JAVA_OPTS を次のように下げます。




docker-compose.yml 抜粋
environment:
– ES_JAVA_OPTS=-Xms256m -Xmx256m
# デフォルト512MBを256MBに削減(インデックスが増えると不安定になります)

④ 本番運用ではセキュリティを有効に

本記事は学習用に xpack.security.enabled=false で認証を切っています。インターネットに公開するなら必ず xpack.security.enabled=true に戻し、パスワードとTLSを設定してください。認証なしの9200番ポートを外部公開するのは厳禁です。

まとめ

ELKスタックのDockerによる構築を実測ベースでまとめます。

  • docker compose up -d 1コマンドで Elasticsearch + Logstash + Kibana 8.19.16 が起動します
  • 実測の合計メモリは約2.77GiB(ES 1.106GiB / Kibana 1.03GiB / Logstash 632.3MiB)。学習用でも4GBプランが安心です
  • Elasticsearchは起動約39秒で status: green、シングルノードでも問題なく動きます
  • Logstashへ流したログはインデックス linuxlab-test-* に着弾し、KibanaのDiscover・Index管理画面で確認できました
  • DockerイメージのタグもaptのCandidateも8.19.16で一致。本番ではセキュリティを必ず有効にしてください

ELKは2GBでは厳しいので、VPS選びはメモリ重視が鉄則です。東京リージョンのあるVPSの実測比較はも参考にしてください。

コメント

タイトルとURLをコピーしました