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

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

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

相关推荐
豆瓣鸡1 小时前
Docker快速入门
运维·docker·容器
VX_182 小时前
Docker镜像直接部署JumpServer
运维·docker·容器
稷下元歌2 小时前
7天学会plc加机器视觉关于运动控制部份,配套视频在bib
开发语言·c++·git·vscode·python·docker·pip
江湖有缘2 小时前
Docker部署Beaver Habit Tracker习惯追踪应用
运维·docker·容器
审判长烧鸡11 小时前
【AI问答/Docker】Docker全命令对照表:命令+中文+示例+示例说明
docker·ai
小肥君12 小时前
docker无法连接GPU资源解决方案
docker·容器·eureka
viva517213 小时前
Docker/历史演进,核心功能,相关工具
docker
友莘居士16 小时前
KingbaseES Docker速查表
运维·docker·容器
原来是猿16 小时前
Docker 【 技术架构(2)】
docker·架构