Docker上的Elastic栈(ELK)
使用Docker和Docker Compose运行最新版本的Elastic栈。
它使您能够利用Elasticsearch的搜索/聚合功能和Kibana的可视化能力分析任何数据集。
基于Elastic的官方Docker镜像:
其他可用的栈变体:
tls
:在Elasticsearch、Kibana(可选)和Fleet中启用TLS加密searchguard
:支持Search Guard
[!重要] 白金版功能默认启用,30天试用期。试用期结束后,您将无缝保留Open Basic许可证中包含的所有免费功能的访问权限,无需手动干预,也不会丢失任何数据。请参阅如何禁用付费功能部分以选择退出此行为。
简要说明
docker-compose up setup
docker-compose up
理念
我们旨在为任何想要尝试这个强大技术组合的人提供最简单的Elastic栈入门方式。本项目的默认配置是刻意最小化和无偏见的。它不依赖任何外部依赖,并且使用尽可能少的自定义自动化来让一切正常运行。
相反,我们相信良好的文档,以便您可以将此存储库用作模板,对其进行调整,并使其成为您自己的。sherifabdlnaby/elastdocker是基于这一理念构建的项目之一。
目录
要求
主机设置
- Docker Engine 版本 18.06.0 或更新
- Docker Compose 版本 1.28.0 或更新(包括 Compose V2)
- 1.5 GB RAM
[!注意] 特别是在Linux上,确保您的用户拥有与Docker守护进程交互所需的权限。
默认情况下,栈暴露以下端口:
- 5044: Logstash Beats 输入
- 50000: Logstash TCP 输入
- 9600: Logstash 监控 API
- 9200: Elasticsearch HTTP
- 9300: Elasticsearch TCP 传输
- 5601: Kibana
[!警告] Elasticsearch的引导检查被特意禁用,以便在开发环境中轻松设置Elastic栈。对于生产设置,我们建议用户按照Elasticsearch文档中的说明设置主机:重要系统配置。
Docker Desktop
Windows
如果您使用的是Windows版Docker Desktop的传统Hyper-V模式,请确保为C:
驱动器启用了文件共享。
macOS
Mac版Docker Desktop的默认配置仅允许挂载来自/Users/
、/Volume/
、/private/
、/tmp
和/var/folders
的文件。确保将存储库克隆到这些位置之一,或按照文档中的说明添加更多位置。
使用方法
[!警告] 每当切换分支或更新已存在栈的版本时,您必须使用
docker-compose build
重新构建栈镜像。
启动栈
使用以下命令将此存储库克隆到将运行栈的Docker主机上:
git clone https://github.com/deviantony/docker-elk.git
然后,通过执行以下命令来初始化docker-elk所需的Elasticsearch用户和组:
docker-compose up setup
如果一切顺利且设置没有错误完成,启动其他栈组件:
docker-compose up
[!注意] 您也可以通过在上述命令后附加
-d
标志在后台运行所有服务(分离模式)。
给Kibana大约一分钟初始化,然后通过在网络浏览器中打开http://localhost:5601访问Kibana Web UI,并使用以下(默认)凭据登录:
- 用户名:elastic
- 密码:changeme
[!注意] 在初次启动时,Elasticsearch用户
elastic
、logstash_internal
和kibana_system
使用.env
文件中定义的密码值(默认为_"changeme"_)进行初始化。第一个是内置超级用户,其他两个分别由Kibana和Logstash用于与Elasticsearch通信。此任务仅在栈_初次_启动时执行。要在初始化_之后_更改用户密码,请参阅下一节中的说明。
初始设置
设置用户认证
[!注意] 参考Elasticsearch中的安全设置以禁用认证。
[!警告] 从Elastic v8.0.0开始,不再可能使用引导特权的
elastic
用户运行Kibana。
所有上述用户默认设置的_"changeme"_密码是不安全的。为了提高安全性,我们将把所有上述Elasticsearch用户的密码重置为随机密码。
-
重置默认用户的密码
以下命令重置
elastic
、logstash_internal
和kibana_system
用户的密码。请记下这些密码。
docker-compose exec elasticsearch bin/elasticsearch-reset-password --batch --user elastic
docker-compose exec elasticsearch bin/elasticsearch-reset-password --batch --user logstash_internal
docker-compose exec elasticsearch bin/elasticsearch-reset-password --batch --user kibana_system
如果需要(例如,如果您想通过 Beats 和其他组件收集监控信息),可以随时为其余的内置用户重复此操作。
-
替换配置文件中的用户名和密码
将
.env
文件中elastic
用户的密码替换为上一步生成的密码。其值不会被任何核心组件使用,但扩展使用它来连接到 Elasticsearch。[!注意] 如果您不打算使用任何提供的扩展,或者更喜欢创建自己的角色和用户来验证这些服务,那么在堆栈初始化后,可以安全地从
.env
文件中完全删除ELASTIC_PASSWORD
条目。将
.env
文件中logstash_internal
用户的密码替换为上一步生成的密码。其值在 Logstash 管道文件(logstash/pipeline/logstash.conf
)中被引用。将
.env
文件中kibana_system
用户的密码替换为上一步生成的密码。其值在 Kibana 配置文件(kibana/config/kibana.yml
)中被引用。有关这些配置文件的更多信息,请参阅下面的配置部分。
-
重启 Logstash 和 Kibana,以使用新密码重新连接到 Elasticsearch
docker-compose up -d logstash kibana
[!注意] 在 Elastic Stack 安全性 中了解更多关于 Elastic 堆栈的安全性。
注入数据
通过在网络浏览器中打开 http://localhost:5601 来启动 Kibana Web UI,并使用以下凭据登录:
- 用户:elastic
- 密码:<您生成的 elastic 密码>
现在堆栈已完全配置,您可以继续注入一些日志条目。
提供的 Logstash 配置允许您通过 TCP 端口 50000 发送数据。例如,您可以使用以下命令之一(取决于您安装的 nc
(Netcat)版本)通过 Logstash 将日志文件 /path/to/logfile.log
的内容注入到 Elasticsearch 中:
# 执行 `nc -h` 以确定您的 `nc` 版本
cat /path/to/logfile.log | nc -q0 localhost 50000 # BSD
cat /path/to/logfile.log | nc -c localhost 50000 # GNU
cat /path/to/logfile.log | nc --send-only localhost 50000 # nmap
您还可以加载 Kibana 安装提供的示例数据。
清理
默认情况下,Elasticsearch 数据会持久化到卷中。
要完全关闭堆栈并删除所有持久化数据,请使用以下 Docker Compose 命令:
docker-compose down -v
版本选择
此仓库与 Elastic 堆栈的最新版本保持一致。main
分支跟踪当前主要版本(8.x)。
要使用核心 Elastic 组件的不同版本,只需更改 .env
文件中的版本号。如果您正在升级现有堆栈,请记得使用 docker-compose build
命令重新构建所有容器镜像。
[!重要] 在执行堆栈升级之前,请务必注意每个单独组件的官方升级说明。
较旧的主要版本也在单独的分支上得到支持:
release-7.x
:7.x 系列release-6.x
:6.x 系列(生命周期结束)release-5.x
:5.x 系列(生命周期结束)
配置
[!重要] 配置不会动态重新加载,任何配置更改后都需要重启单个组件。
如何配置 Elasticsearch
Elasticsearch 配置存储在 elasticsearch/config/elasticsearch.yml
中。
您还可以通过在 Compose 文件中设置环境变量来指定要覆盖的选项:
elasticsearch:
environment:
network.host: _non_loopback_
cluster.name: my-cluster
有关如何在 Docker 容器中配置 Elasticsearch 的更多详细信息,请参阅以下文档页面:使用 Docker 安装 Elasticsearch。
如何配置 Kibana
Kibana 的默认配置存储在 kibana/config/kibana.yml
中。
您还可以通过在 Compose 文件中设置环境变量来指定要覆盖的选项:
kibana:
environment:
SERVER_NAME: kibana.example.org
有关如何在 Docker 容器中配置 Kibana 的更多详细信息,请参阅以下文档页面:使用 Docker 安装 Kibana。
如何配置 Logstash
Logstash 配置存储在 logstash/config/logstash.yml
中。
您还可以通过在 Compose 文件中设置环境变量来指定要覆盖的选项:
logstash:
environment:
LOG_LEVEL: debug
有关如何在 Docker 容器中配置 Logstash 的更多详细信息,请参阅以下文档页面:为 Docker 配置 Logstash。
如何禁用付费功能
您可以在试用期到期日之前取消正在进行的试用(从而恢复到基本许可证),可以通过 Kibana 的许可证管理面板,或使用 Elasticsearch 的 start_basic
许可 API 来实现。请注意,如果在试用期到期日之前未将许可证切换为 basic
或升级,第二种选择是恢复对 Kibana 访问的唯一方法。
通过将 Elasticsearch 的 xpack.license.self_generated.type
设置从 trial
切换为 basic
(请参阅许可设置)来更改许可证类型只有在初始设置之前完成才会生效。在试用开始后,从 trial
到 basic
的功能损失必须使用第一段中描述的两种方法之一来确认。
如何扩展 Elasticsearch 集群
请按照 Wiki 中的说明操作:扩展 Elasticsearch
如何重新执行设置
要再次运行设置容器并重新初始化 .env
文件中定义了密码的所有用户,只需再次 "up" setup
Compose 服务:
$ docker-compose up setup
⠿ Container docker-elk-elasticsearch-1 Running
⠿ Container docker-elk-setup-1 Created
Attaching to docker-elk-setup-1
...
docker-elk-setup-1 | [+] User 'monitoring_internal'
docker-elk-setup-1 | ⠿ User does not exist, creating
docker-elk-setup-1 | [+] User 'beats_system'
docker-elk-setup-1 | ⠿ User exists, setting password
docker-elk-setup-1 exited with code 0
如何以编程方式重置密码
如果由于任何原因无法使用 Kibana 更改用户的密码(包括内置用户),您可以使用 Elasticsearch API 来实现相同的结果。
在下面的示例中,我们重置了 elastic
用户的密码(注意 URL 中的 "/user/elastic"):
curl -XPOST -D- 'http://localhost:9200/_security/user/elastic/_password' \
-H 'Content-Type: application/json' \
-u elastic:<您当前的 elastic 密码> \
-d '{"password" : "<您的新密码>"}'
可扩展性
如何添加插件
要向任何 ELK 组件添加插件,您需要:
- 在相应的
Dockerfile
中添加RUN
语句(例如RUN logstash-plugin install logstash-filter-json
) - 将相关的插件代码配置添加到服务配置中(例如 Logstash 输入/输出)
- 使用
docker-compose build
命令重新构建镜像
如何启用提供的扩展
在 extensions
目录中提供了几个扩展。这些扩展提供了一些不属于标准 Elastic 堆栈的功能,但可用于丰富额外的集成。
这些扩展的文档在每个单独的子目录中提供,按扩展逐个说明。其中一些需要对默认的 ELK 配置进行手动更改。
JVM 调优
如何指定服务使用的内存量
Elasticsearch 和 Logstash 的启动脚本可以从环境变量的值中附加额外的 JVM 选项,允许用户调整每个组件可以使用的内存量:
服务 | 环境变量 |
---|---|
Elasticsearch | ES_JAVA_OPTS |
Logstash | LS_JAVA_OPTS |
为了适应内存稀缺的环境(Docker Desktop for Mac 默认只有 2 GB 可用),docker-compose.yml
文件中默认将堆大小分配限制为 Elasticsearch 512 MB,Logstash 256 MB。如果要覆盖默认的 JVM 配置,请编辑 docker-compose.yml
文件中相应的环境变量。
例如,要增加 Logstash 的最大 JVM 堆大小:
logstash:
environment:
LS_JAVA_OPTS: -Xms1g -Xmx1g
当未设置这些选项时:
- Elasticsearch 启动时的 JVM 堆大小自动确定。
- Logstash 启动时使用固定的 1 GB JVM 堆大小。
如何启用服务的远程 JMX 连接
与 Java 堆内存类似(见上文),您可以指定 JVM 选项来启用 JMX 并在 Docker 主机上映射 JMX 端口。
使用以下内容更新 {ES,LS}_JAVA_OPTS
环境变量(我已将 JMX 服务映射到端口 18080,您可以更改)。不要忘记使用 Docker 主机的 IP 地址更新 -Djava.rmi.server.hostname
选项(替换 DOCKER_HOST_IP):
logstash:
environment:
LS_JAVA_OPTS: -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.port=18080 -Dcom.sun.management.jmxremote.rmi.port=18080 -Djava.rmi.server.hostname=DOCKER_HOST_IP -Dcom.sun.management.jmxremote.local.only=false
深入探索
插件和集成
请参阅以下 Wiki 页面: