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
常见问题处理:
- Node 标签问题:Fluentd 需要节点有特定标签
bash
# 给节点打标签
kubectl label node node-name beta.kubernetes.io/fluentd-ds-ready=true
- 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 中查看
- 访问
http://localhost:5601 - 创建 Index Pattern(如
fluentd-*) - 进入 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 插件 |
十一、性能优化建议
- 调整 JVM 内存 :设置 ES 的
ES_JAVA_OPTS=-Xms1g -Xmx1g - Fluentd 缓冲区:使用文件缓冲替代内存缓冲
- 索引生命周期:配置 ILM 策略自动删除过期日志
- 日志采样:对高频日志进行采样收集
十二、总结
通过本文,你已经掌握了以下技能:
- 使用 Docker 快速部署 Fluentd、Elasticsearch、Kibana
- 配置 Docker 容器日志转发到 Fluentd
- 使用 Docker Compose 一键部署 EFK 完整栈
- 在 Kubernetes 中部署生产级 EFK 日志系统
- 解决常见的问题和性能瓶颈
EFK 作为容器化时代的日志标准方案,能够有效解决分布式系统的日志聚合和查询问题。建议在生产环境中采用 Docker Compose 或 Kubernetes 方式部署,并配置好日志轮转和索引生命周期管理。
扩展阅读:可以考虑引入 Kafka 作为日志缓冲层,应对高并发场景;或使用 Grafana 替代 Kibana 实现统一监控和日志展示。