摘要
本文演示如何在Docker环境下安装ELK服务[非集群],以下是搭建并测试的过程。
环境准备
预先创建以下目录结构,给读写权限
bash
/data/logstash
--config
/data/elasticsearch
--data
--log
--plugins
--ik
/data/kibana
--config
--log
chmod 777 /data/logstash/config/
chmod 777 /data/elasticsearch/data/
chmod 777 /data/elasticsearch/log/
chmod 777 /data/kibana/log/
chmod 777 /data/kibana/config/
预先放行以下端口,命令:
csharp
# 查看已开放端口
firewall-cmd --zone=public --list-ports
# 开放多个端口 9200给es 5601给kibana 4560给logstash
firewall-cmd --zone=public --permanent --add-port=9200/tcp --add-port=5601/tcp --add-port=4560/tcp
# 重启防火墙
firewall-cmd --reload

准备ELK配置文件
1)配置elasticsearch安装ik分词器插件。compose映射卷时指定此位置。
命令:
bash
cd /data/elasticsearch/plugins/ik
wget https://release.infinilabs.com/analysis-ik/stable/elasticsearch-analysis-ik-9.0.3.zip
unzip elasticsearch-analysis-ik-9.0.3.zip
ll

2)配置logstash
config下创建logstash.conf并写入配置
配置内容:
ini
input {
tcp {
mode => "server"
host => "0.0.0.0"
port => 4560
codec => json_lines
}
}
output {
elasticsearch {
hosts => "es:9200"
index => "logstash-%{+YYYY.MM.dd}"
}
}
命令:
bash
cd /data/logstash/config
vi logstash.conf
指令:i + 拷贝 + esc + 输入:wq

3)配置kibana
config下创建kibana.yml并写入配置
配置内容:
yaml
server.host: 0.0.0.0
# kibana的监听端口
server.port: 5601
server.name: "kibana"
server.publicBaseUrl: "http://localhost:5601"
# kibana访问es服务器的URL,多个以逗号","隔开
elasticsearch.hosts: ["http://localhost:9200"]
monitoring.ui.container.elasticsearch.enabled: true
ops.interval: 5000
# kibana web语言
i18n.locale: "zh-CN"
命令:
bash
cd /data/kibana/config
vi kibana.yml
指令:i + 拷贝 + esc + 输入:wq
# 赋予kibana用户配置写入权限,注册验证时需要用
sudo chmod 664 /data/kibana/config/kibana.yml

配置运行docker-compose.yml
执行方式:
css
docker-compose.yml -p docker-compose-elk up -d
或者
IDEA直接跑(我选IDE可视化管理)
配置内容:
ruby
name: docker-compose-elk
services:
elasticsearch:
container_name: elasticsearch
image: docker.elastic.co/elasticsearch/elasticsearch:9.0.3
environment:
- xpack.security.enabled=false # 关闭 X-Pack 安全认证(免账号密码)
- xpack.security.http.ssl.enabled=false #关闭 https,强制使用 http
- xpack.security.transport.ssl.enabled=false #关闭 https,强制使用 http
- discovery.type=single-node #声明单节点
- ES_JAVA_OPTS=-Xms1024m-Xmx1024m
- TZ=Asia/Shanghai
ulimits:
memlock: #允许es把全部堆内存锁在物理内存里,禁止swap,提高搜索/索引性能
soft: -1
hard: -1
ports:
- "9200:9200"
- "9300:9300"
logging:
driver: "json-file"
options:
max-size: "50m"
volumes:
- /data/elasticsearch/plugins:/usr/share/elasticsearch/plugins#挂载插件
- /data/elasticsearch/data:/usr/share/elasticsearch/data
- /data/elasticsearch/log:/usr/share/elasticsearch/log
networks:
- coffeebeans_elk_network
logstash:
image: docker.elastic.co/logstash/logstash:9.0.3
container_name: logstash
environment:
- TZ=Asia/Shanghai
- LS_JAVA_OPTS=-Xms256m-Xmx256m #设置Logstash的JVM内存,根据你的系统内存调整
volumes:
- /data/logstash/config/logstash.conf:/usr/share/logstash/pipeline/logstash.conf#挂载配置文件
depends_on:
- elasticsearch #依赖es
links:
- elasticsearch:es #可以用es域名访问elasticsearch服务
ports:
- "4560:4560"
networks:
- coffeebeans_elk_network
kibana:
container_name: kibana
hostname: kibana
image: docker.elastic.co/kibana/kibana:9.0.3
user: "root"# 强制以root用户运行 为了能写入es注册令牌
depends_on:
- elasticsearch#依赖es
environment:
- TZ=Asia/Shanghai
volumes:
- /data/kibana/config/kibana.yml:/usr/share/kibana/config/kibana.yml
ports:
- "5601:5601"
networks:
- coffeebeans_elk_network
# 定义网络
networks:
coffeebeans_elk_network:

拉了很久拉不下来,怀疑是docker镜像源问题,就重新配置docker远程镜像仓库,重新执行docker pull命令。
bash
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": [
"https://docker-0.unsee.tech",
"https://docker-cf.registry.cyou",
"https://docker.1panel.live",
"https://docker.xuanyuan.me",
"https://docker.m.daocloud.io",
"https://docker.1ms.run",
"https://ccr.ccs.tencentyun.com",
"https://hub.xdark.top",
"https://hub.fast360.xyz",
"https://docker.tbedu.top",
"https://docker.hlmirror.com",
"https://doublezonline.cloud",
"https://docker.melikeme.cn",
"https://image.cloudlayer.icu",
"https://dislabaiot.xyz",
"https://freeno.xyz",
"https://docker.kejilion.pro"
]
}
EOF
sudo systemctl daemon-reload && sudo systemctl restart docker
#手动预先下载镜像,和IDE内命令执行不冲突
#下到一半卡住了可尝试重新执行以上镜像源命令
docker pull docker.elastic.co/elasticsearch/elasticsearch:9.0.3
docker pull docker.elastic.co/logstash/logstash:9.0.3
docker pull docker.elastic.co/kibana/kibana:9.0.3

测试ELK安装结果linux内访问
sql
curl -X GET "localhost:9200"
curl -X GET "localhost:5601"
curl -X GET "http://127.0.0.1:9200/_cluster/health?pretty" #ES集群状态查询
1)远程访问Elasticsearch

2)远程访问Kibana,配置注册

打开kibana的dev_tools测试ES命令

3)测试logstash日志写入和查询
python
#这里我写一个python脚本测试 send_log.py
import socket
import json
# 定义日志数据
log_data = {
"message": "这是一条测试日志",
"timestamp": "2025-07-27T15:30:00+08:00",
" severity": "INFO",
"logger": "test.logger"
}
# 将日志数据转换为 JSON 格式
json_log = json.dumps(log_data)
# 创建一个 TCP 套接字
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
# 连接到 Logstash 的 TCP 输入端口
s.connect(("192.168.233.129", 4560)) #目标服务器IP
# 发送 JSON 数据
s.sendall(json_log.encode() + b'\n')
kibana新建数据视图index-patterns

打开discover进行日志筛选

总结
以上我们了解了Docker安装ELK的过程,常见的问题有docker镜像源不可用、elasticsearch启动问题、elk之间的通信不通,需要一一攻破。
关注公众号:咖啡Beans
在这里,我们专注于软件技术的交流与成长,分享开发心得与笔记,涵盖编程、AI、资讯、面试等多个领域。无论是前沿科技的探索,还是实用技巧的总结,我们都致力于为大家呈现有价值的内容。期待与你共同进步,开启技术之旅。