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群集上部署

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

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

相关推荐
人生百态,人生如梦34 分钟前
Ubuntu在低版本下使用ccswitch+claudecode(CCSwitch+Docker+Claude)连调教程
linux·ubuntu·docker·claudecode·ccswitch
程序员老赵39 分钟前
Docker 部署 OpenViking:轻松搭建 AI Agent 上下文数据库平台
docker·开源·agent
吴声子夜歌2 小时前
Docker入门与实战——高级镜像构建
docker
坐看风云变幻2 小时前
Betaflight 开发环境搭建保姆级教程(Ubuntu / Windows+WSL / Docker 三方案 + 官方网址大全)
windows·ubuntu·docker·无人机·飞控·betaflight
零基础1232 小时前
Docker 部署实战:从入门到精通
docker·容器
Lvan的前端笔记3 小时前
docker:基于docker的前端部署方案
前端·docker·状态模式
承渊政道3 小时前
自建服务越来越多怎么管理?Docker部署Flare,搭一个自己的数字入口
运维·docker·容器·内网穿透·cpolar·nas·flare
龙腾-虎跃4 小时前
Docker 一键启动服务合集:Redis、MySQL、Kafka、MinIO、Prometheus 等(网盘转存防失效)
redis·mysql·docker·kafka·prometheus·小龙虾·miniio
芷栀夏4 小时前
极空间部署Photopea:Docker运行、网页修图与多设备使用
运维·docker·容器
JeJe同学14 小时前
Docker镜像导入、容器启动
linux·运维·docker