docker-compose一键部署ELK+Filbeat

文章目录

环境

Ip 主机名 cpu 内存
192.168.10.100 master01 4c 8G
组件 版本
Ubuntu Ubuntu 26.04 server
Docker 29.1.3
docker compose v2
filebeat 7.17.18
elasticsearch 7.17.18
kibana 7.17.18
logstash 7.17.18

具体步骤

创建docker-compose文件夹
powershell 复制代码
mkdir /compose_elkf
cd /compose_elkf
vim docker-compose.yaml
yaml 复制代码
version: '3.3'
services:
  elasticsearch:
    container_name: elasticsearch
    image: elasticsearch:7.17.18
    environment:
      - bootstrap.memory_lock=true
      - discovery.type=single-node
      - "ES_JAVA_OPTS=-Xms4g -Xmx4g"
    ulimits:
      memlock:
        soft: -1
        hard: -1
    ports:
      - 9200:9200
      - 9300:9300
    volumes:
      - ./elasticsearch/data:/usr/share/elasticsearch/data
      - ./elasticsearch/logs:/usr/share/elasticsearch/logs
    stdin_open: true
    tty: true
    network_mode: bridge
    logging:
      driver: "json-file"
      options:
        max-size: "10m"
        max-file: "50"
  kibana:
    container_name: kibana
    image: kibana:7.17.18
    ulimits:
      memlock:
        soft: -1
        hard: -1
    ports:
      - 5601:5601
    links:
      - elasticsearch:elasticsearch
    depends_on:
      - elasticsearch
    stdin_open: true
    tty: true
    network_mode: bridge
    logging:
      driver: "json-file"
      options:
        max-size: "10m"
        max-file: "50"
  logstash:
    container_name: logstash
    image: logstash:7.17.18
    restart: always
    ulimits:
      memlock:
        soft: -1
        hard: -1
    volumes:
      - ./config/logstash.conf:/usr/share/logstash/pipeline/logstash.conf
    ports:
      - 5044:5044
    links:
      - elasticsearch:elasticsearch
    depends_on:
      - elasticsearch
    stdin_open: true
    tty: true
    network_mode: bridge
    logging:
      driver: "json-file"
      options:
        max-size: "10m"
        max-file: "50"
  filebeat:
    user: root
    container_name: filebeat
    image: docker.elastic.co/beats/filebeat:7.17.18
    volumes:
      - /var/log:/usr/share/filebeat/logs
      - ./config/filebeat.yml:/usr/share/filebeat/filebeat.yml
    command: ["--strict.perms=false"]
    ulimits:
      memlock:
        soft: -1
        hard: -1
    stdin_open: true
    tty: true
    network_mode: host
    deploy:
      mode: global
    logging:
      driver: "json-file"
      options:
        max-size: "10m"
        max-file: "50"
创建配置文件目录
powershell 复制代码
mkdir ./config
vim ./config/filebeat.yml
编辑filebeat配置文件

注:hosts需要改成logstash所在节点的ip

yaml 复制代码
filebeat.inputs:
- type: log
  enabled: true
  paths:
    - /usr/share/filebeat/logs/syslog
    - /usr/share/filebeat/logs/messages
  tags: ["syslog"]
  processors:
    - add_host_metadata:
        netinfo.enabled: true
output.logstash:
  hosts: ["192.168.10.100:5044"] #这里写logstash节点的ip
powershell 复制代码
vim ./config/logstash.conf
编辑logstash配置文件
yaml 复制代码
input {
  beats {
    port => 5044
  }
}


filter {

  json {
    source => "message"
  }

  # 从message里获取日志级别
  grok {
    match => {
      "message" => "(?<log_level>TRACE|DEBUG|INFO|WARN|ERROR|FATAL)"
    }
  }

  # 获取ipv4地址
  mutate {
    add_field => { "ipv4" => "%{[host][ip][0]}" }
  }

  # 删除不必要字段
  mutate {
    remove_field => ["agent","@version", "ecs", "log","host"]
  }

  # 格式化时间戳
  date {
    match => ["timestamp", "MMM dd HH:mm:ss", "MMM dd yyyy HH:mm:ss"]
    target => "@timestamp"
  }

  # 添加索引日期
  ruby {
    code => "event.set('indexDay', event.get('@timestamp').time.localtime('+09:00').strftime('%Y%m%d'))"
  }

}
output {
  if "syslog" in [tags] {
  elasticsearch {
    hosts => ["elasticsearch:9200"]
    index => "syslog-%{indexDay}"
    codec => json

  }
}
  stdout {
    codec => rubydebug
  }
}
创建es数据目录
powershell 复制代码
mkdir -p ./elasticsearch/data
mkdir -p ./elasticsearch/logs
给docker-compose文件夹加权
powershell 复制代码
chmod 777 -R /compose_elkf
启动docker-compose
powershell 复制代码
docker compose up -d

如果你的docker-compose版本是v1

powershell 复制代码
docker-compose up -d

访问kibana

http://192.168.10.100:5601

进来是这个页面

这里会提示创建索引模式

如果没有就稍等2,3分钟,es里还没有数据,等待logstash把数据传到es里

可以看到自动匹配了一个索引,名称按照匹配的索引来就行

*代表匹配任意多个字符

时间戳选第一个

这里就可以看到收集到的日志了

显示的格式是已经经过优化的

也可以通过这里显示固定时间段的日志

也可以通过左侧点击自己需要看到的字段

列如,我只想看ipv4,message字段

这个就是最终效果

拿到压缩包后怎么操作

如果觉得上面麻烦,或者无法科学上网。也可以直接下载我主页的compose_elkf.tar.xz资源,包括了所有文件和镜像

cscn的资源强制1g以下,只能压缩成xz格式了

powershell 复制代码
tar -xJvf elkf.tar.xz
vim  ./compose_elkf/config/logstash.conf
# 把hosts改成本地ip
cd compose_elkf
docker compose up -d
# 如果你的docker-compose版本是v1
docker-compose up -d

一些可能的疑问解答

为什么索引名是syslog+日期

索引名称是在logstash.conf里定义的

为什么docker-compose文件里filebeat的网络模式是hosts?

因为如果不是hosts获取ip的时候只会获取容器ip,只有当网络模式是hosts时获取的ip才是服务器ip

web页面里的字段是如何定义的?

是logstash.conf过滤出来的

如message日志本身是不带有ip的,当我们需要获取服务器ip时,需要配置获取并过滤

首先让filebeat抓取网络配置信息

然后通过logstash过滤出ipv4地址并赋值给ipv4这个字段

结尾

注:这套docker-compose只适合监控小群集,机器数量<50台,或者测试环境

如果是大群集,机器数量>100台,则需要elk+filebeat+kafka

其中es和kafka需要部署群集

中间件的群集只能保证应用层的高可用

需要保障硬件高可用还需要单独的运维k8s群集上部署

且密码需要密文和中间件之间通过证书连接来保证安全

后续有时间会出上面说的这一套群集

相关推荐
nuo5342027 小时前
基础 6 —— Docker 容器数据卷
docker·容器
Sinclair8 小时前
安企CMS的安装-Docker 部署
运维·docker·容器
要开心吖ZSH9 小时前
AI医疗分诊与健康咨询助手agent开发——(4-2)从零到一:我给AI医疗分诊助手加了个“知识库大脑“,终于搞懂了RAG是什么
java·docker·agent·医疗·rag
汪汪大队u9 小时前
【无标题】
运维·docker·kubernetes·prometheus
spider_xcxc12 小时前
Docker Compose 容器通信详解:同一个 Compose 文件才能互通吗?
docker·容器·k8s·容器化·容器网络
BaiduPHP13 小时前
docker异常断电,出现docker服务,启动失败
docker·容器·eureka
梦梦代码精15 小时前
多商户商城技术选型实测:ThinkPHP 8与Vue 3结合,B2B2C架构下的开源实践
docker·开源·代码规范
寒冰碧海16 小时前
大模型部署从0到1(三):单机多卡 vLLM 部署Qwen3.6实战|Docker Compose 一键启动
docker·容器·vllm
chexus17 小时前
Docker 镜像瘦身:使用 Maven 拆分 Jar 包
docker·maven·jar
梦梦代码精17 小时前
智能体应用开发平台技术选型:一个自带商业模块的开源方案调研
人工智能·docker·开源