Docker 一键部署 ELK 实质是通过 Docker Compose 编排三容器协同工作,需配置专用网络、合理分配资源、对齐配置并解决安全认证与系统参数限制问题。

用 Docker 一键部署 ELK(Elasticsearch + Logstash + Kibana)日志系统,核心不是真靠“一条命令”,而是通过 Docker Compose 编排多个容器协同工作,实现标准化、可复现的部署。关键在于网络互通、配置对齐、资源合理分配,避免端口冲突和索引写入失败。
准备基础环境与自定义网络
确保宿主机已安装 Docker 和 Docker Compose(v2.0+),Linux 系统建议 CentOS 7+/Ubuntu 20.04+,内存 ≥4GB(ELK 组件较吃资源)。
- 创建专用桥接网络,让 ELK 容器互相发现:
docker network create elk-net - 新建项目目录(如
/opt/elk),后续所有配置文件、数据卷挂载都放在此处,便于管理 - 提前拉取镜像可加快启动(非必须):
docker pull docker.elastic.co/elasticsearch/elasticsearch:8.12.2docker pull docker.elastic.co/kibana/kibana:8.12.2docker pull docker.elastic.co/logstash/logstash:8.12.2
编写 docker-compose.yml 统一编排
在项目目录下创建 docker-compose.yml,内容需包含三组件服务定义、共享网络、资源限制与健康检查:
- Elasticsearch 服务:启用单节点模式(开发/测试),关闭安全认证(如需生产请开启 xpack);挂载配置、数据、插件目录;设置
ES_JAVA_OPTS="-Xms2g -Xmx2g"防止 OOM - Logstash 服务:挂载自定义
logstash.conf到/usr/share/logstash/pipeline/;通过depends_on确保先于 Kibana 启动;输出目标设为 Elasticsearch 的服务名http://es:9200 - Kibana 服务:配置
ELASTICSEARCH_HOSTS=http://es:9200;映射宿主机 5601 端口;添加healthcheck判断 Kibana 是否就绪
注意:Elasticsearch 8.x 默认启用安全功能,若跳过认证,需在 es 配置中显式设置 xpack.security.enabled: false,并在 kibana 配置中禁用登录页(xpack.security.authc.providers: ["basic"] → 改为 ["none"] 或注释)。
配置 Logstash 实现日志接入
在项目目录新建 logstash.conf,定义标准输入→过滤→输出流程:
-
input:推荐使用
beats插件接收 Filebeat 发送的日志(端口 5044),比直接读文件更稳定;也可加file插件监听 Nginx 或应用日志路径(需挂载宿主机目录) -
filter:用
grok解析常见日志格式(如 Nginx access log、Java 异常堆栈);用date插件提取时间戳字段,确保 @timestamp 正确 -
output:直连 Elasticsearch,指定 index 名称(如
nginx-access-%{+YYYY.MM.dd}),启用pipeline.workers: 2提升吞吐
示例片段:output { elasticsearch { hosts => ["http://es:9200"] index => "app-log-%{+YYYY.MM.dd}" } }
启动并验证 ELK 运行状态
执行命令一键拉起全部服务:cd /opt/elk && docker-compose up -d
- 检查容器状态:
docker-compose ps,确认 es、logstash、kibana 均为healthy或Up - 访问 Kibana:
http://[宿主机IP]:5601,首次进入会引导设置索引模式(Index Pattern),填入app-log-*或filebeat-*(取决于 Logstash 输出或 Filebeat 直连) - 验证日志写入:用 curl 向 Logstash 的 beats 端口模拟发送一条日志,或启动一个带 Filebeat 的 Nginx 容器,稍等 1–2 分钟后在 Kibana 的 Discover 页面查看是否出现新文档
常见卡点:Elasticsearch 启动失败多因 vm.max_map_count 过低,需在宿主机执行 sysctl -w vm.max_map_count=262144 并写入 /etc/sysctl.conf 持久化。











