第一步:環境準備
請確保您的機器上已經安裝了 Docker 和 Docker Compose。
第二步:創建項目目錄和配置文件
為了讓 Docker Compose 能夠正確地構建和管理容器,我們需要創建一個特定的目錄結構。
創建一個主目錄,例如 elk-stack。
在 elk-stack 內部,創建 docker-compose.yml 文件。
在 elk-stack 內部,創建一個 logstash 目錄,并在其中再創建一個 pipeline 目錄。
在 logstash/pipeline 目錄中,創建 logstash.conf 文件。
最終的目錄結構如下:
elk-stack/
├── docker-compose.yml
└── logstash/└── pipeline/└── logstash.conf
第三步:編寫配置文件
現在,我們將填充這些文件的內容。
- docker-compose.yml
這是最核心的編排文件。它定義了 ELK 的三個服務,并將它們連接在一起。請將以下內容復制到 elk-stack/docker-compose.yml 文件中。
重要提示:Elasticsearch, Kibana, 和 Logstash 的版本號必須完全一致,否則可能會出現兼容性問題。這里我們使用 8.14.0 版本。
version: '3.8'services:elasticsearch:image: elasticsearch:8.14.0container_name: elasticsearchenvironment:- discovery.type=single-node- xpack.security.enabled=false # 為方便測試,禁用安全功能。生產環境強烈建議開啟!- ES_JAVA_OPTS=-Xms1g -Xmx1g # 根據您的機器內存調整,建議至少1GBvolumes:- es-data:/usr/share/elasticsearch/dataports:- "9200:9200"- "9300:9300"networks:- elk-netkibana:image: kibana:8.14.0container_name: kibanaenvironment:- ELASTICSEARCH_HOSTS=http://elasticsearch:9200 # 指向 Elasticsearch 容器ports:- "5601:5601"depends_on:- elasticsearchnetworks:- elk-netlogstash:image: logstash:8.14.0container_name: logstashvolumes:- ./logstash/pipeline:/usr/share/logstash/pipeline:ro # 掛載 Logstash 管道配置ports:- "5000:5000/tcp" # 為數據輸入開放 TCP 端口- "5000:5000/udp"depends_on:- elasticsearchnetworks:- elk-netvolumes:es-data:driver: localnetworks:elk-net:driver: bridge
配置說明:
discovery.type=single-node: 告知 Elasticsearch 這是一個單節點實例,無需進行集群發現。
xpack.security.enabled=false: 為了簡化初次設置,我們禁用了 Elasticsearch 的安全特性(如用戶名密碼認證)。在生產環境中,請務必將其設置為 true 并配置好密碼。
volumes: 我們為 Elasticsearch 的數據創建了一個名為 es-data 的持久化數據卷,這樣即使容器被刪除,數據也不會丟失。同時,我們將本地的 Logstash 配置文件掛載到了 Logstash 容器中。
networks: 我們創建了一個名為 elk-net 的橋接網絡,讓三個容器可以通過服務名(elasticsearch, kibana, logstash)相互通信。
depends_on: 確保 Elasticsearch 容器啟動后,Kibana 和 Logstash 才會啟動。
2. logstash/pipeline/logstash.conf
這個文件定義了 Logstash 的數據處理管道:從哪里接收數據(input),如何處理數據(filter),以及將數據發送到哪里(output)。
將以下內容復制到 elk-stack/logstash/pipeline/logstash.conf 文件中。
input {# 通過 TCP 協議監聽 5000 端口,接收 JSON 格式的日志tcp {port => 5000codec => json_lines}
}filter {# 此處可以添加過濾規則,例如 grok, mutate 等# 暫時留空作為示例
}output {# 將處理后的數據輸出到 Elasticsearchelasticsearch {hosts => ["http://elasticsearch:9200"]index => "logstash-%{+YYYY.MM.dd}" # 索引名稱格式}# 同時在 Logstash 容器的控制臺打印輸出,方便調試stdout {codec => rubydebug}
}
這個配置表示 Logstash 會:
Input: 監聽 TCP 端口 5000,并期望接收到的每行都是一個獨立的 JSON 對象。
Output: 將數據發送到名為 elasticsearch 的主機的 9200 端口,并根據日期創建索引(例如 logstash-2025.06.26)。
第四步:啟動和驗證 ELK Stack
萬事俱備,現在可以啟動整個技術棧了。
啟動服務
在 elk-stack 目錄下,打開終端并運行以下命令:
docker-compose up -d (有的版本是docker cpmpose)
這個命令會在后臺(-d)拉取鏡像并啟動所有服務。第一次啟動可能需要一些時間來下載鏡像。
檢查容器狀態
等待一兩分鐘后,運行以下命令檢查所有容器是否都已正常運行:
docker-compose ps
應該能看到 elasticsearch, kibana, 和 logstash 三個容器的狀態都是 Up 或 running。
驗證服務
Elasticsearch: 在瀏覽器或使用 curl 訪問 http://localhost:9200。如果看到一個包含版本信息的 JSON 響應,說明 Elasticsearch 已成功運行。
Kibana: 在瀏覽器中訪問 http://localhost:5601。應該能看到 Kibana 的歡迎界面。由于啟動需要時間,如果無法訪問請稍等片刻再刷新。
第五步:發送并查看測試日志
現在,我們來測試整個數據流是否通暢。
發送日志到 Logstash
打開一個新的終端,使用 netcat (或 nc) 工具向 Logstash 的 5000 端口發送一條 JSON 格式的日志。
echo '{"level": "info", "service": "my-app", "message": "這是一個測試日志"}' | nc localhost 5000
如果您沒有 nc,也可以使用 curl:
curl -X POST -H "Content-Type: application/json" -d '{"level": "info", "service": "my-app", "message": "這是另一個測試日志"}' http://localhost:5000
注意:此處的 curl 能否成功取決于您的 input 插件,對于 tcp 插件,nc 是更可靠的測試工具。
在 Kibana 中查看日志
打開 Kibana 界面 (http://localhost:5601)。
點擊左上角的漢堡菜單 (?),進入 Management > Stack Management。
在 Kibana 分類下,選擇 Data Views (或舊版中的 Index Patterns)。
點擊 Create data view。
在 Name 和 Index pattern 字段中輸入 logstash-*,Kibana 應該會自動識別出我們剛剛創建的索引。
點擊 Save data view to Kibana。
創建成功后,再次點擊左上角的漢堡菜單 (?),進入 Analytics > Discover。
應該能看到剛剛發送的那條測試日志了!可以展開日志條目查看詳細的 JSON 字段。
若是想監控jar包,可以參考
https://blog.csdn.net/CodeTom/article/details/148954231?sharetype=blogdetail&sharerId=148954231&sharerefer=PC&sharesource=CodeTom&spm=1011.2480.3001.8118