Docker安装EFK日志系统完整指南

Docker 安装 EFK 日志系统完整指南

从零搭建 Elasticsearch + Fluentd + Kibana 日志分析平台

在容器化时代,日志管理变得尤为重要。EFK(Elasticsearch + Fluentd + Kibana)是业界成熟的日志解决方案,相比传统的 ELK,Fluentd 更加轻量灵活。本文将带你通过 Docker 完整部署 EFK 日志系统。

一、EFK 是什么?

组件 作用
Elasticsearch 分布式搜索和分析引擎,负责存储和索引日志数据
Fluentd 日志收集器,负责采集、过滤和转发日志
Kibana 可视化平台,提供日志查询和展示界面

工作流程:Fluentd 收集各类日志 → 过滤处理 → 输出到 Elasticsearch → Kibana 展示查询

二、环境准备

  • Docker 18.09+
  • Docker Compose(可选)
  • 至少 4GB 内存

三、快速启动 Fluentd

3.1 基础启动命令

bash 复制代码
docker run -d \
  -p 24224:24224 \
  -p 24224:24224/udp \
  -v /data:/fluentd/log \
  --name fluentd \
  fluent/fluentd

参数说明

  • -p 24224:Fluentd 默认接收日志的端口
  • -v /data:/fluentd/log:将容器内日志挂载到宿主机 /data 目录

3.2 配置 Docker 容器日志转发

Docker 容器可通过 --log-driver 将日志直接发送到 Fluentd:

bash 复制代码
# 单个容器配置
docker run --log-driver=fluentd --log-opt fluentd-address=localhost:24224 your-app

# 全局配置 /etc/docker/daemon.json
{
  "log-driver": "fluentd",
  "log-opts": {
    "fluentd-address": "localhost:24224"
  }
}

配置后需重启 Docker 服务:

bash 复制代码
systemctl restart docker

四、安装 Elasticsearch

4.1 单节点快速安装

bash 复制代码
docker run -d \
  --name elasticsearch \
  -p 9200:9200 \
  -p 9300:9300 \
  -e "discovery.type=single-node" \
  -e "ES_JAVA_OPTS=-Xms512m -Xmx512m" \
  elasticsearch:7.17.0

4.2 验证安装

bash 复制代码
curl http://localhost:9200

返回示例:

json 复制代码
{
  "name" : "node-1",
  "cluster_name" : "docker-cluster",
  "version" : {
    "number" : "7.17.0",
    "build_flavor" : "default"
  },
  "tagline" : "You Know, for Search"
}

4.3 安装中文分词器(IK)

bash 复制代码
# 进入容器
docker exec -it elasticsearch /bin/bash

# 安装 IK 分词器(版本需与 ES 匹配)
./bin/elasticsearch-plugin install https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v7.17.0/elasticsearch-analysis-ik-7.17.0.zip

# 重启容器生效
docker restart elasticsearch

4.4 安装 Elasticsearch-Head 插件(可视化管理)

bash 复制代码
# 方式一:使用独立容器
docker run -d \
  --name elasticsearch-head \
  -p 9100:9100 \
  mobz/elasticsearch-head:5

# 方式二:使用 git 源码运行
git clone git://github.com/mobz/elasticsearch-head.git
cd elasticsearch-head
npm install
npm run start

注意:Head 插件访问 ES 可能存在跨域问题,需配置 ES:

bash 复制代码
docker run -d \
  --name elasticsearch \
  -p 9200:9200 \
  -e "http.cors.enabled=true" \
  -e "http.cors.allow-origin=*" \
  elasticsearch:7.17.0

五、安装 Kibana

5.1 启动 Kibana

bash 复制代码
docker run -d \
  --name kibana \
  -p 5601:5601 \
  -e ELASTICSEARCH_HOSTS=http://宿主机IP:9200 \
  kibana:7.17.0

5.2 共享网络模式(推荐)

让 Kibana 与 ES 共享网络栈,避免网络配置问题:

bash 复制代码
# 先创建 ES 容器
docker run -d --name elasticsearch -p 9200:9200 -p 9300:9300 elasticsearch:7.17.0

# Kibana 使用 ES 的网络
docker run -d \
  --name kibana \
  --network=container:elasticsearch \
  -e ELASTICSEARCH_URL=http://127.0.0.1:9200 \
  kibana:7.17.0

5.3 访问 Kibana

浏览器打开 http://localhost:5601,首次访问需配置 Index Pattern(如 logstash-*fluentd-*)。

六、Docker Compose 一键部署(推荐)

创建 docker-compose.yml

yaml 复制代码
version: '3.7'

services:
  elasticsearch:
    image: elasticsearch:7.17.0
    container_name: elasticsearch
    environment:
      - cluster.name=docker-cluster
      - discovery.type=single-node
      - bootstrap.memory_lock=true
      - "ES_JAVA_OPTS=-Xms512m -Xmx512m"
      - http.cors.enabled=true
      - http.cors.allow-origin=*
    ulimits:
      memlock:
        soft: -1
        hard: -1
    volumes:
      - esdata:/usr/share/elasticsearch/data
    ports:
      - 9200:9200
      - 9300:9300
    networks:
      - efk-net

  fluentd:
    image: fluent/fluentd:v1.14-debian-1
    container_name: fluentd
    volumes:
      - ./fluentd/conf:/fluentd/etc
      - /var/log:/var/log
      - /var/lib/docker/containers:/var/lib/docker/containers
    ports:
      - 24224:24224
      - 24224:24224/udp
    networks:
      - efk-net
    depends_on:
      - elasticsearch

  kibana:
    image: kibana:7.17.0
    container_name: kibana
    ports:
      - 5601:5601
    environment:
      - ELASTICSEARCH_HOSTS=http://elasticsearch:9200
    networks:
      - efk-net
    depends_on:
      - elasticsearch

volumes:
  esdata:
    driver: local

networks:
  efk-net:
    driver: bridge

启动服务:

bash 复制代码
docker-compose up -d

七、Fluentd 配置详解

7.1 创建配置文件 fluentd/conf/fluent.conf

conf 复制代码
# 接收 Docker 容器日志
<source>
  @type forward
  port 24224
  bind 0.0.0.0
</source>

# 收集宿主机容器日志文件
<source>
  @type tail
  path /var/log/containers/*.log
  pos_file /fluentd/log/containers.log.pos
  tag kubernetes.*
  <parse>
    @type json
    time_format %Y-%m-%dT%H:%M:%S.%NZ
  </parse>
</source>

# 输出到 Elasticsearch
<match **>
  @type elasticsearch
  host elasticsearch
  port 9200
  logstash_format true
  logstash_prefix fluentd
  logstash_dateformat %Y%m%d
  include_tag_key true
  type_name fluentd
  <buffer>
    @type file
    path /fluentd/log/buffer
    flush_mode interval
    flush_interval 5s
    flush_thread_count 2
  </buffer>
</match>

7.2 重启 Fluentd 使配置生效

bash 复制代码
docker-compose restart fluentd

八、高级部署:Kubernetes 中的 EFK

8.1 在 k8s 中部署 Elasticsearch

bash 复制代码
# 使用官方示例
git clone https://github.com/kubernetes/kubernetes.git
cd cluster/addons/fluentd-elasticsearch

# 创建 ES 服务
kubectl create -f es-controller.yaml
kubectl create -f es-service.yaml

8.2 部署 Fluentd(DaemonSet)

bash 复制代码
kubectl create -f fluentd-es-ds.yaml

常见问题处理

  1. Node 标签问题:Fluentd 需要节点有特定标签
bash 复制代码
# 给节点打标签
kubectl label node node-name beta.kubernetes.io/fluentd-ds-ready=true
  1. Docker 日志驱动问题:需使用 json-file 驱动
bash 复制代码
# 修改 /etc/docker/daemon.json
{
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "10m",
    "max-file": "3"
  }
}
systemctl restart docker

8.3 部署 Kibana

bash 复制代码
kubectl create -f kibana-controller.yaml
kubectl create -f kibana-service.yaml

九、日志查看与验证

9.1 查看 Fluentd 日志

bash 复制代码
# Docker 环境
docker logs fluentd

# 宿主机上查看收集的日志
tail -f /data/data.log

9.2 验证数据是否进入 ES

bash 复制代码
# 查看索引
curl http://localhost:9200/_cat/indices

# 搜索日志
curl http://localhost:9200/_search?pretty

9.3 在 Kibana 中查看

  1. 访问 http://localhost:5601
  2. 创建 Index Pattern(如 fluentd-*
  3. 进入 Discover 页面查看日志

十、常见问题与解决方案

问题现象 可能原因 解决方法
Kibana 无法连接 ES 网络不通 检查 ELASTICSEARCH_HOSTS 配置,使用容器名
Fluentd 无法输出到 ES ES 未启动 先启 ES,依赖配置 depends_on
容器日志未收集 Docker 日志驱动不是 json-file 修改 /etc/docker/daemon.json 并重启 Docker
时区不对 容器默认 UTC 时区 挂载 /etc/localtime 或设置 TZ 环境变量
中文乱码 未安装 IK 分词器 安装 elasticsearch-analysis-ik 插件

十一、性能优化建议

  1. 调整 JVM 内存 :设置 ES 的 ES_JAVA_OPTS=-Xms1g -Xmx1g
  2. Fluentd 缓冲区:使用文件缓冲替代内存缓冲
  3. 索引生命周期:配置 ILM 策略自动删除过期日志
  4. 日志采样:对高频日志进行采样收集

十二、总结

通过本文,你已经掌握了以下技能:

  • 使用 Docker 快速部署 Fluentd、Elasticsearch、Kibana
  • 配置 Docker 容器日志转发到 Fluentd
  • 使用 Docker Compose 一键部署 EFK 完整栈
  • 在 Kubernetes 中部署生产级 EFK 日志系统
  • 解决常见的问题和性能瓶颈

EFK 作为容器化时代的日志标准方案,能够有效解决分布式系统的日志聚合和查询问题。建议在生产环境中采用 Docker Compose 或 Kubernetes 方式部署,并配置好日志轮转和索引生命周期管理。

扩展阅读:可以考虑引入 Kafka 作为日志缓冲层,应对高并发场景;或使用 Grafana 替代 Kibana 实现统一监控和日志展示。

相关推荐
原来是猿2 小时前
Linux线程同步与互斥(四):日志系统与策略模式
linux·运维·开发语言·策略模式
立莹Sir3 小时前
商品中台架构设计与技术落地实践——基于Spring Cloud微服务体系的完整解决方案
分布式·后端·spring cloud·docker·容器·架构·kubernetes
九皇叔叔10 小时前
Ubuntu 22.04 版本常用设置
linux·运维·ubuntu
雨奔10 小时前
Kubernetes 联邦 Deployment 指南:跨集群统一管理 Pod
java·容器·kubernetes
杨云龙UP11 小时前
ODA登录ODA Web管理界面时提示Password Expired的处理方法_20260423
linux·运维·服务器·数据库·oracle
songx_9912 小时前
Linux基础2
linux·运维·服务器
陈皮糖..13 小时前
27 届运维实习笔记|第三、四周:从流程熟练到故障排查,企业运维实战深化
运维·笔记·sql·nginx·ci/cd·云计算·jenkins
莫白媛13 小时前
Linux在限制敏感命令下的修改用户密码小白版
linux·运维·服务器
2601_9498146913 小时前
Docker部署Spring Boot + Vue项目
vue.js·spring boot·docker