Docker安装ELK(Elasticsearch + Logstash + Kibana)

摘要

本文演示如何在Docker环境下安装ELK服务[非集群],以下是搭建并测试的过程。

环境准备

预先创建以下目录结构,给读写权限

bash 复制代码
/data/logstash
    --config
/data/elasticsearch
    --data
    --log
    --plugins
        --ik
/data/kibana
    --config
    --log
    
chmod 777 /data/logstash/config/ 
chmod 777 /data/elasticsearch/data/
chmod 777 /data/elasticsearch/log/
chmod 777 /data/kibana/log/
chmod 777 /data/kibana/config/

预先放行以下端口,命令:

csharp 复制代码
# 查看已开放端口
firewall-cmd --zone=public --list-ports   
# 开放多个端口 9200给es 5601给kibana 4560给logstash
firewall-cmd --zone=public --permanent --add-port=9200/tcp --add-port=5601/tcp --add-port=4560/tcp  
# 重启防火墙
firewall-cmd --reload  

准备ELK配置文件

1)配置elasticsearch安装ik分词器插件。compose映射卷时指定此位置。

命令:

bash 复制代码
cd /data/elasticsearch/plugins/ik
wget https://release.infinilabs.com/analysis-ik/stable/elasticsearch-analysis-ik-9.0.3.zip
unzip elasticsearch-analysis-ik-9.0.3.zip 
ll

2)配置logstash

config下创建logstash.conf并写入配置

配置内容:

ini 复制代码
input {
  tcp {
    mode => "server"
    host => "0.0.0.0"
    port => 4560
    codec => json_lines
  }
}
output {
  elasticsearch {
    hosts => "es:9200"
    index => "logstash-%{+YYYY.MM.dd}"
  }
}  

命令:

bash 复制代码
cd /data/logstash/config
vi logstash.conf
指令:i + 拷贝 + esc  + 输入:wq

3)配置kibana

config下创建kibana.yml并写入配置

配置内容:

yaml 复制代码
server.host: 0.0.0.0
# kibana的监听端口
server.port: 5601
server.name: "kibana"
server.publicBaseUrl: "http://localhost:5601"
# kibana访问es服务器的URL,多个以逗号","隔开
elasticsearch.hosts: ["http://localhost:9200"]
monitoring.ui.container.elasticsearch.enabled: true
ops.interval: 5000
# kibana web语言
i18n.locale: "zh-CN"

命令:

bash 复制代码
cd /data/kibana/config
vi kibana.yml
指令:i + 拷贝 + esc  + 输入:wq

# 赋予kibana用户配置写入权限,注册验证时需要用
sudo chmod 664 /data/kibana/config/kibana.yml 

配置运行docker-compose.yml

执行方式:

css 复制代码
docker-compose.yml -p docker-compose-elk up -d 
或者 
IDEA直接跑(我选IDE可视化管理)

配置内容:

ruby 复制代码
name: docker-compose-elk
services:
elasticsearch:
    container_name: elasticsearch
    image: docker.elastic.co/elasticsearch/elasticsearch:9.0.3
    environment:
      - xpack.security.enabled=false # 关闭 X-Pack 安全认证(免账号密码)
      - xpack.security.http.ssl.enabled=false #关闭 https,强制使用 http
      - xpack.security.transport.ssl.enabled=false #关闭 https,强制使用 http
      - discovery.type=single-node   #声明单节点
      - ES_JAVA_OPTS=-Xms1024m-Xmx1024m
      - TZ=Asia/Shanghai
    ulimits:
      memlock: #允许es把全部堆内存锁在物理内存里,禁止swap,提高搜索/索引性能
        soft: -1
        hard: -1
    ports:
      - "9200:9200"
      - "9300:9300"
    logging:
      driver: "json-file"
      options:
        max-size: "50m"
    volumes:
      - /data/elasticsearch/plugins:/usr/share/elasticsearch/plugins#挂载插件
      - /data/elasticsearch/data:/usr/share/elasticsearch/data
      - /data/elasticsearch/log:/usr/share/elasticsearch/log
    networks:
      - coffeebeans_elk_network

logstash:
    image: docker.elastic.co/logstash/logstash:9.0.3
    container_name: logstash
    environment:
      - TZ=Asia/Shanghai
      - LS_JAVA_OPTS=-Xms256m-Xmx256m #设置Logstash的JVM内存,根据你的系统内存调整
    volumes:
      - /data/logstash/config/logstash.conf:/usr/share/logstash/pipeline/logstash.conf#挂载配置文件
    depends_on:
      - elasticsearch #依赖es
    links:
      - elasticsearch:es #可以用es域名访问elasticsearch服务
    ports:
      - "4560:4560"
    networks:
      - coffeebeans_elk_network

kibana:
    container_name: kibana
    hostname: kibana
    image: docker.elastic.co/kibana/kibana:9.0.3
    user: "root"# 强制以root用户运行 为了能写入es注册令牌
    depends_on:
      - elasticsearch#依赖es
    environment:
      - TZ=Asia/Shanghai
    volumes:
      - /data/kibana/config/kibana.yml:/usr/share/kibana/config/kibana.yml
    ports:
      - "5601:5601"
    networks:
      - coffeebeans_elk_network

# 定义网络
networks:
  coffeebeans_elk_network:

拉了很久拉不下来,怀疑是docker镜像源问题,就重新配置docker远程镜像仓库,重新执行docker pull命令。

bash 复制代码
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
    "registry-mirrors": [
        "https://docker-0.unsee.tech",
        "https://docker-cf.registry.cyou",
        "https://docker.1panel.live",
        "https://docker.xuanyuan.me",
        "https://docker.m.daocloud.io",
        "https://docker.1ms.run",
        "https://ccr.ccs.tencentyun.com",
        "https://hub.xdark.top",
        "https://hub.fast360.xyz",
        "https://docker.tbedu.top",
        "https://docker.hlmirror.com",
        "https://doublezonline.cloud",
        "https://docker.melikeme.cn",
        "https://image.cloudlayer.icu",
        "https://dislabaiot.xyz",
        "https://freeno.xyz",
        "https://docker.kejilion.pro"
    ]
}
EOF
sudo systemctl daemon-reload && sudo systemctl restart docker

#手动预先下载镜像,和IDE内命令执行不冲突
#下到一半卡住了可尝试重新执行以上镜像源命令
docker pull docker.elastic.co/elasticsearch/elasticsearch:9.0.3
docker pull docker.elastic.co/logstash/logstash:9.0.3
docker pull docker.elastic.co/kibana/kibana:9.0.3

测试ELK安装结果linux内访问

sql 复制代码
curl -X GET "localhost:9200" 
curl -X GET "localhost:5601"
curl -X GET "http://127.0.0.1:9200/_cluster/health?pretty" #ES集群状态查询

1)远程访问Elasticsearch

2)远程访问Kibana,配置注册

打开kibana的dev_tools测试ES命令

3)测试logstash日志写入和查询

python 复制代码
#这里我写一个python脚本测试 send_log.py
import socket
import json

# 定义日志数据
log_data = {
    "message": "这是一条测试日志",
    "timestamp": "2025-07-27T15:30:00+08:00",
    " severity": "INFO",
    "logger": "test.logger"
}
# 将日志数据转换为 JSON 格式
json_log = json.dumps(log_data)
# 创建一个 TCP 套接字
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
    # 连接到 Logstash 的 TCP 输入端口
    s.connect(("192.168.233.129", 4560))  #目标服务器IP
    # 发送 JSON 数据
    s.sendall(json_log.encode() + b'\n')

kibana新建数据视图index-patterns

打开discover进行日志筛选

总结

以上我们了解了Docker安装ELK的过程,常见的问题有docker镜像源不可用、elasticsearch启动问题、elk之间的通信不通,需要一一攻破。

关注公众号:咖啡Beans

在这里,我们专注于软件技术的交流与成长,分享开发心得与笔记,涵盖编程、AI、资讯、面试等多个领域。无论是前沿科技的探索,还是实用技巧的总结,我们都致力于为大家呈现有价值的内容。期待与你共同进步,开启技术之旅。

相关推荐
过分不让我用liberty2 小时前
在java项目中项目里集成ES
后端
Python私教2 小时前
Django全栈班v1.04 Python基础语法 20250912 下午
后端·python·django
爱读源码的大都督3 小时前
为什么Spring 6中要把synchronized替换为ReentrantLock?
java·后端·架构
一勺菠萝丶3 小时前
Jenkins 构建 Node 项目报错解析与解决——pnpm lockfile 问题实战
elasticsearch·servlet·jenkins
这里有鱼汤3 小时前
发现一个高性能回测框架,Python + Rust,比 backtrader 快 250 倍?小团队必备!
后端·python
程序员爱钓鱼3 小时前
Go语言实战案例 — 项目实战篇:图书管理系统(文件存储)
后端·google·go
元闰子3 小时前
OLTP上云,哪种架构最划算?·VLDB'25
数据库·后端·云原生
智能化咨询3 小时前
Docker 容器化部署核心实战——Nginx 服务配置与正反向代理原理解析
docker
IT_陈寒3 小时前
Vite 5.0重磅升级:8个性能优化秘诀让你的构建速度飙升200%!🚀
前端·人工智能·后端