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

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

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

相关推荐
Patrick_Wilson2 天前
从「改个端口」到 502:Next.js on k8s 的容器端口、Service 映射与 env 覆盖
docker·kubernetes·next.js
Suroy2 天前
DockerView-Go:用 Go 写一个终端 Docker 监控工具,顺便做了个 Web 仪表盘
docker
云恒要逆袭2 天前
运行你的第一个Docker容器
后端·docker·容器
宋均浩3 天前
# Docker 镜像瘦身实战:从 1.2G 到 80MB 的五个优化步骤
ci/cd·docker
程序员老赵4 天前
10 分钟部署 OpenCode:Docker 一键安装,浏览器打开就能用 AI 写代码(附完整命令与排错)
docker·容器·ai编程
WangMingHua1114 天前
LM Studio Docker 部署——本地大模型一键启动
docker
曲幽5 天前
别再用网页翻译看源码了!你的私人翻译神器LibreTranslate,部署避坑指南来了
python·docker·web·pot·translate·libretranslate·arogstranslate
武子康7 天前
调查研究-183 Apple container:Mac 上用轻量 VM 跑 Linux 容器,Swift 会改写本地容器体验吗?
docker·容器·apple
Alsn8610 天前
等待学习-学习目录:Docker 容器安全攻防
学习·安全·docker
程序员老赵10 天前
服务器没有桌面?Docker 跑个 Chrome,浏览器就能远程用
docker·容器·devops