核心是用docker-compose统一编排elasticsearch、logstash、kibana三服务,确保同网络互通、配置对齐、职责分明;需提前准备docker环境、调大vm.max_map_count、创建elk-net网络及/opt/elk目录,再通过docker-compose.yml定义服务依赖与配置,最后启动并验证kibana访问及索引模式创建。

用 Docker 搭建 ELK 运行环境,核心是让 Elasticsearch、Logstash、Kibana 三个服务在同一个网络下稳定互通、配置对齐、职责清晰。不推荐手动 run 多个容器硬写 IP,统一用 docker-compose 编排是最可靠、易维护的方式。
基础环境准备
确保宿主机已安装:
- Docker(20.10+)和 Docker Compose v2.x(推荐使用
docker compose命令) - 配置国内镜像源(如阿里云或中科大),加速 elasticsearch、logstash、kibana 镜像拉取
- 关闭 SELinux 或设为 permissive(CentOS/RHEL 下避免挂载失败)
- 调整系统参数:
sysctl -w vm.max_map_count=262144,否则 Elasticsearch 启动会报 bootstrap check failed
创建专用网络与项目目录
避免容器间靠 IP 通信出错,先建一个自定义桥接网络:
docker network create elk-net
新建项目目录(如 /opt/elk),后续所有配置文件、数据卷都放这里,结构清晰、便于管理。
编写 docker-compose.yml
在项目目录下创建该文件,定义三服务及协同规则:
-
Elasticsearch:启用
discovery.type=single-node(开发/测试),设置ES_JAVA_OPTS="-Xms2g -Xmx2g"防止 OOM;挂载 config、data、plugins 目录;绑定0.0.0.0:9200 -
Logstash:挂载自定义
logstash.conf到/usr/share/logstash/pipeline/;通过depends_on确保先于 Kibana 启动;输出目标写成http://es:9200(服务名自动解析) -
Kibana:配置
ELASTICSEARCH_HOSTS=http://es:9200;映射宿主机 5601 端口;添加健康检查判断是否就绪
注意:Elasticsearch 8.x 默认开启安全认证,若跳过登录,需在 es 配置中显式设 xpack.security.enabled: false,并在 kibana 配置中禁用认证提供者(如设 xpack.security.authc.providers: ["none"])。
配置 Logstash 接入日志
在项目目录新建 logstash.conf,典型结构如下:
input {
beats {
port => 5044
}
}
filter {
grok { match => { "message" => "%{COMBINEDAPACHELOG}" } }
date { match => [ "timestamp", "dd/MMM/yyyy:HH:mm:ss Z" ] }
}
output {
elasticsearch {
hosts => ["http://es:9200"]
index => "nginx-access-%{+YYYY.MM.dd}"
}
}
这样可接收 Filebeat 发来的日志,解析 Nginx 格式,并按日期写入索引。实际使用时,可根据日志类型调整 grok 表达式。
启动与验证
执行命令一键启动:
cd /opt/elk && docker compose up -d
等待几分钟后:
- 访问
http://localhost:5601,能打开 Kibana 页面即说明整体连通 - 在 Kibana 的 Stack Management → Index Patterns 中创建索引模式(如
nginx-access-*) - 配合 Filebeat(部署在日志源服务器)推送日志,即可在 Discover 中看到实时数据











