Docker化部署:手把手搭建ES+FileBeat+Kibana日志监控栈

张开发
2026/4/18 21:13:57 15 分钟阅读

分享文章

Docker化部署:手把手搭建ES+FileBeat+Kibana日志监控栈
1. 为什么需要ELK日志监控栈在开发和运维过程中日志就像系统的黑匣子记录了所有关键操作和异常信息。但原始日志往往分散在各个服务器上格式杂乱无章。想象一下当系统出现故障时你需要像侦探一样在多台服务器之间来回切换用grep命令在数百万行日志中大海捞针——这简直是程序员的噩梦。ELKElasticsearch Logstash Kibana组合就是为解决这个问题而生。不过在实际使用中我发现用FileBeat替代Logstash更加轻量高效。FileBeat就像个专业的快递小哥专门负责收集日志并快速投递给Elasticsearch而Logstash更像是个全能型选手功能强大但资源消耗也大。对于大多数日志采集场景FileBeat已经足够好用。Docker化部署的优势在于环境隔离和快速复制。我经历过多次在我的机器上能跑的尴尬场景用Docker部署ELK栈后所有依赖和环境配置都被打包成标准化的容器在任何支持Docker的机器上都能一键启动再也不用担心环境差异导致的各种玄学问题。2. 环境准备与Docker网络配置2.1 基础环境检查首先确认你的Linux系统已经安装Docker和Docker Compose。我推荐使用Ubuntu 20.04 LTS或CentOS 7这两个系统对Docker的支持最稳定。用以下命令检查环境# 检查Docker版本 docker --version # 检查Docker Compose版本 docker-compose --version如果还没安装Docker可以用这个一键安装脚本适用于大多数Linux发行版curl -fsSL https://get.docker.com | sh sudo systemctl enable --now docker2.2 创建专用Docker网络为了让ES、FileBeat和Kibana三个容器能够互相通信我们需要创建一个专用网络。这就像给它们建了个专属聊天室既安全又高效docker network create --driver bridge elk-net我建议给网络设置固定子网避免IP冲突docker network create --driver bridge \ --subnet172.20.0.0/16 \ --gateway172.20.0.1 \ elk-net验证网络是否创建成功docker network ls | grep elk-net3. 部署Elasticsearch容器3.1 单节点ES部署配置Elasticsearch是日志存储和搜索的核心我们先部署单节点版本适合开发和测试环境。这里有个坑要注意ES默认会使用2GB内存对于测试环境来说太浪费了我们需要调整JVM参数docker run -d \ --name elasticsearch \ --net elk-net \ -p 9200:9200 -p 9300:9300 \ -e discovery.typesingle-node \ -e ES_JAVA_OPTS-Xms512m -Xmx512m \ -e xpack.security.enabledfalse \ -v es-data:/usr/share/elasticsearch/data \ docker.elastic.co/elasticsearch/elasticsearch:8.6.2参数说明-Xms512m -Xmx512m限制JVM堆内存为512MBxpack.security.enabledfalse关闭安全认证简化测试环境配置es-data数据卷持久化存储日志数据3.2 验证ES是否正常运行等待约1-2分钟ES启动较慢然后检查curl -X GET http://localhost:9200/_cluster/health?pretty看到类似输出说明成功{ cluster_name : docker-cluster, status : green, timed_out : false, number_of_nodes : 1, number_of_data_nodes : 1, active_primary_shards : 1, active_shards : 1, relocating_shards : 0, initializing_shards : 0, unassigned_shards : 0, delayed_unassigned_shards : 0, number_of_pending_tasks : 0, number_of_in_flight_fetch : 0, task_max_waiting_in_queue_millis : 0, active_shards_percent_as_number : 100.0 }4. 部署Kibana可视化平台4.1 启动Kibana容器Kibana需要连接到ES注意环境变量ELASTICSEARCH_HOSTS的配置docker run -d \ --name kibana \ --net elk-net \ -p 5601:5601 \ -e ELASTICSEARCH_HOSTShttp://elasticsearch:9200 \ -e I18N_LOCALEzh-CN \ docker.elastic.co/kibana/kibana:8.6.2这里有个实用技巧通过--net elk-net网络Kibana可以直接用容器名elasticsearch访问ES服务不需要知道具体IP。4.2 检查Kibana日志Kibana启动时间较长约2-3分钟可以实时查看日志docker logs -f kibana当你看到这条日志时说明启动完成[info][server] Kibana is now available访问http://localhost:5601应该能看到中文界面的Kibana。5. 配置FileBeat日志采集5.1 使用Docker部署FileBeat传统方式是直接在主机安装FileBeat但我推荐用Docker部署保持环境一致性docker run -d \ --name filebeat \ --net elk-net \ --user root \ -v /var/log:/host/var/log:ro \ -v ${PWD}/filebeat.yml:/usr/share/filebeat/filebeat.yml \ docker.elastic.co/beats/filebeat:8.6.2关键配置说明--user root以root权限读取系统日志/var/log:/host/var/log:ro将主机日志目录挂载为只读filebeat.yml配置文件通过卷挂载5.2 编写FileBeat配置文件创建filebeat.yml文件内容如下filebeat.inputs: - type: log enabled: true paths: - /host/var/log/*.log - /host/var/log/messages output.elasticsearch: hosts: [elasticsearch:9200] indices: - index: syslog-%{yyyy.MM.dd} setup.ilm.enabled: false setup.template.name: syslog setup.template.pattern: syslog-*注意路径/host/var/log对应容器内的挂载点不是主机的/var/log。5.3 测试FileBeat配置先验证配置是否正确docker exec filebeat filebeat test config docker exec filebeat filebeat test output如果看到Config OK和Elasticsearch connection success就说明配置正确。6. Kibana数据可视化实战6.1 创建索引模式登录Kibana进入Stack Management 索引模式创建新索引模式syslog-*时间字段选择timestamp6.2 探索日志数据进入Discover页面选择syslog-*索引模式你应该能看到实时采集的系统日志。这里分享几个实用技巧在搜索框输入error快速过滤错误日志点击字段右侧的Add按钮可以固定常用字段到表格显示使用时间选择器右上角可以查看特定时间段的日志6.3 创建监控仪表盘进入Dashboard 创建新仪表盘添加数据表可视化选择syslog-*索引配置显示字段如message,host.name,log.file.path添加柱状图展示日志时间分布保存后你就拥有了一个实时日志监控看板7. 生产环境优化建议经过多次实战我总结出这些优化经验性能调优给ES分配的内存不要超过主机内存的50%设置vm.max_map_count262144通过sysctl -w为ES和Kibana配置单独的docker-compose.yml方便管理日志管理在FileBeat中配置exclude_lines过滤无关日志使用multiline配置合并Java异常堆栈设置ES索引生命周期策略自动清理旧日志安全加固启用ES和Kibana的安全认证限制FileBeat容器的能力--cap-dropALL使用readonly文件系统挂载日志目录遇到ES启动失败时先检查日志docker logs elasticsearch | grep -i error最常见的问题是内存不足或vm.max_map_count设置过小。

更多文章