本篇博客,将介绍如何在 Linux 上快速高效地使用 Docker 部署最新版 Graylog 6.1,配套多机器的 Open Search 集群以及MongoDB。
目前网络上的大多数部署教程都是基于 Graylog3.x 版本,再新一点也不过 4.x,用来提供数据服务的都是 Elastic Search。然而最新版的 Graylog 已经移除了对 Elastic Search 的支持,仅支持 graylog-datanode 或 Open Search。当然,你也可以通过安装 Graylog 插件的方式扩展,实现继续使用 Elastic Search 作为搜索引擎的目的。但是很遗憾,笔者在配置的时候并不知道还有这样的插件、以及该如何下载,因此直接选用了 Open Search。配置前后零零散散也踩了很多坑,特在本篇博客整理记录。
0. 概述
什么是 Graylog?什么是Open Search?MongoDB是用来做什么的?
Graylog 是一款开源的日志管理平台,用于集中收集、存储和实时分析系统或应用的日志数据。
OpenSearch 是基于 Elasticsearch 分支的搜索引擎,负责存储和快速检索 Graylog 接收的海量日志数据。
MongoDB 是 NoSQL 数据库,在此架构中存储 Graylog 的配置、用户权限等元数据信息。
三者协作:Graylog 处理日志输入和可视化,OpenSearch 提供搜索能力,MongoDB 管理配置,构成完整的日志分析系统。这种组合常用于企业监控、安全审计和故障排查,替代传统的 ELK(Elasticsearch+Logstash+Kibana)方案。
1. 前置条件和服务架构
首先,本博客的所有脚本和命令,都是基于 Debian10 操作系统的。如果使用 CentOS 或者其他操作系统,请注意命令的替换。
架构
笔者安装时是用了两台机器,机器A部署 Graylog,opensearch node1,mongodb,机器B部署opensearch node2, 3, 4。以下是架构的简要示意图。注意,如果你也需要跨机器提供服务,那么首先要确保你的两台机器能够互相连通。由于笔者使用的是公司机器,默认就是在同一片子网下的,所以在这里不需要额外处理 。
1 | +-----------------------+ |
考虑到直接在原生系统上安装这些应用服务比较繁杂,并且环境配置上容易出现各种各样的问题,因此,这里选择了使用 Docker 进行安装。
安装 Docker
可以直接参考官方文档(docker安装)来安装 docker。
1 | sudo apt-get update |
安装完成后,启动docker,设置开机自启并查看运行状态。状态为 active(running) 即可。
1 | # 启动服务 |
正常运行以后,接下来配置 docker 不用 sudo 也可以运行,这样方便其他用户在脚本中调用。不过这一步不是必须的,可以跳过,只是默认状态下都要加上sudo才能执行 docker 命令,不是很方便。
1 | sudo usermod -aG docker <username> |
开放网络端口
如果你也和我一样,需要跨机器部署,或者不只是在 localhost 访问,那么务必确保机器的网络端口已经开放。首先安装 net-tools,便于查看 IP 规则。
1 | sudo apt reinstall net-tools -y |
如果要用的端口并没有开放,那么我们需要添加开放端口的规则。
1 | # 开放指定端口 |
注意查看你的 iptables 规则,如果发现有 DROP,那么在这条规则之后的规则都会被丢弃,即不会生效。当时为了排查这已经配置规则却仍然不生效的问题,花了很长时间,结果发现是开发机自带了一条 DROP,新配置的规则都被丢弃了。
其他配置
在安装OpenSearch之前,还需要修改一些系统配置,让OpenSearch的性能表现更好。如果不设置,即使运行了也会抛警告,甚至抛错,如下所示。这一点在 OpenSearch 的官方文档中也提到了。
1 | ERROR [PreflightCheckService] Preflight check failed with error: /proc/sys/vm/max_map_count value should be at least 262144 but is 65530 (set via "vm.max_map_count" sysctl) |
1 | # 1. Disable memory paging and swapping performance on the host to improve performance. |
2. 安装 MongoDB
因为只需要在主节点安装即可,所以这里没有用到 Mongo 集群和副本。MongoDB 是用来保存 graylog 和 opensearch 的配置项的,所以 Graylog 必须在 mongo 启动成功以后才能成功启动。
1 | $ docker pull mongo |
其实也可以把这些过程放到脚本中,但是为了安装完以后创建用户并验证,所以单独拎出来了。如果要通过客户端连接 mongo 那么还需要安装 mongosh。只是想要确认是否成功运行了的话,启动以后可以通过 docker ps
来查看当前是否成功运行mongo。看到有 mongo 容器在正常运行就ok。
安装 mongosh 的方式可以参考这篇文档 安装 mongosh - MongoDB Shell。
3. 根据集群拓扑写部署脚本
话不多说,先放脚本。这里其实可以把 IP 地址换成参数,可读性会更强一点。
主节点脚本
1 | OPEN_SEARCH_VERSION=2.12.0 # OpenSearch 版本 |
从节点脚本
1 | OPEN_SEARCH_VERSION=2.12.0 # OpenSearch 版本 |
脚本中包含了拉取镜像的指令。如果之前已经执行过一遍,或者已经拉取过镜像,要注意不要重复拉取,把 docker pull
那几行注释掉。如果重复拉取了 OpenSearch 的镜像,不管是同版本还是不同版本,都可能导致一些依赖问题。按照官网社区的 Issue 回复,需要保持 OpenSearch clean 的环境。可以通过 docker images
查看当前已经拉去的镜像,通过 docker rmi <images-id>
删除指定的镜像。
关于脚本中一些配置项的解释
graylog
- GRAYLOG_HTTP_ENABLE_CORS 配置跨域访问
- GRAYLOG_ELASTICSEARCH_HOSTS 虽然现在不支持 ES了,但是配置的字段名还是没有改,这里要配置所有的 open search 节点地址
open search
- cluster.name 同一个集群名字一定要一样
- discovery.seed_hosts 这里要填写所有的opensearch node的通信地址,否则无法互相发现。
- network.bind_host 这是为了能够被外部,而不仅仅是 localhost 访问
- cluster.initial_master_nodes 这里也要填写所有的节点名字,对应的就是 node.name
- OPENSEARCH_JAVA_OPTS 这里的 Xms 和 Xmx 对应的是 JVM 可用的最大最小内存,这个值要谨慎设置,不能乱填,需要结合你的机器情况来填写,笔者使用的机器只有16G,所以分配的比较少。官方文档上指出,分配的内存不要超过机器内存的一半,也不要超过 32g。如果超过了,就会频繁 GC,影响效率。笔者之前分配多了,导致节点之间发生竞争和宕机,服务挂掉了。
- DISABLE_SECURITY_PLUGIN 禁用安全插件,看上去这很不安全,但是如果不加上这一行,就又会有很多抛错要处理……权衡了一下还是禁用了
- http.port 这个要配置外部访问端口
- transport.port 这个字段是 OpenSearch 内部的通信端口
- -p 9202:9202 -p 9302:9302 这一行很重要,不可以忽略,需要这里的映射关系,才能够让我们配置的 9202,也同样作用于docker,否则还是不生效的。
部署
直接运行上述的脚本是无法直接成功的。在此之前,还有一些基础工作要做。
首先,要创建文件夹,并添加用户权限,用来读写数据。否则 OpenSearch 启动以后会有权限问题,无法正常启动。
1 | # 以node_4为例,每个节点都需要创建对应的文件夹 |
然后,分别在主节点和从节点的机器上执行部署脚本 bash ctor_os.sh
,等待运行完成。这几个节点启动和初始化需要一些时间,可以通过 docker logs <container-name>
来查看运行日志。例如 docker logs es_1
可以查看 node_1 的运行日志。确认没有 ERROR ,看到 cluster 状态从 YELLOW 转为 GREEN 的日志以后,可以在浏览器访问,查看集群运行情况。
正常运行的 OpenSearch 集群如下所示:
1 | http://7.25.140.167:9200/_cluster/health?pretty |

截图的时候部署了5个节点,实际情况请根据自身的架构拓扑判断哈,主要核对 OpenSearch 节点数量、status 等信息。
通过 docker logs graylog
查看 graylog 节点运行状态,看到运行成功以后,在浏览器访问 http://7.25.140.167:9000
,会看到登录界面,输入用户名(默认为 admin),密码即脚本文件中的密码登录。如下所示即为成功。

注意点
如果已经启动过,但是发现有问题,需要停止容器运行,并删掉容器,否则下次直接运行脚本会有问题。因为脚本中的命令是 docker run
,会新建一个容器,而不是运行已有的容器。
1 | docker stop graylog |
如果 OpenSearch 之前启动过,修改配置以后要重启的时候,必须要删除对应的本地数据,否则节点会选举失败,导致无法加入集群等一系列问题。清空存盘数据的指令如下:
1 | # 主节点机器 |
4. Graylog 配置
部署成功以后,还需要进行 INPUTS 配置,否则无法收集到日志。点击 System ,找到菜单中的 INPUTS。

这里就直接根据自己的需求选择合适的 INPUTS 即可。我这里选择的是 GELF HTTP(便于测试)。除了勾选 Global 以外,没有做其他的操作。
直接在主节点机器上执行如下命令:
1 | curl -XPOST http://127.0.0.1:12201/gelf -p0 -d '{"message":"hello berry", "host":"127.0.0.1", "facility":"test", "topic": "meme"}' |
回到 Search 页面,可以看到已经显示我们刚才发送的消息。注意,如果配置的不是 GELF HTTP,那么直接用上述命令测试,是不会成功的。

后记
配置过程中尝试了很多种方式,除了直接使用 docker run
外,还使用了 docker compose
和 docker stack
。其中,如果只需要单机配置的话,使用 docker compose 其实更方便,只需要一个配置文件,就能够一步到位解决网络和环境变量的问题。至于 docker stack,这是最初我在尝试跨机器建立集群时,官方文档推荐我采用的方式,但是经过实践发现,使用 docker stack 总是会出现 OOM 导致进程异常退出,但是除了错误代码143指向 OOM 以外,又没有任何的错误信息,包括系统日志中也没有 OOM 的 ERR。没有线索,排查不下去,因此最后还是采用了最原生的办法。
Graylog 还可以配置定期删除索引,防止磁盘被占满。可以在 System -> Indices
面板进行配置。
一些查看当前存储占用情况的 API :
1 | # 查看集群存储统计(需开放 9200 端口) |
参考文档
这里仅列出了官方文档,如果你有足够的部署经验,那么官方文档足以解决你的全部问题。
- Graylog 官方文档:https://docs.graylog.org
- OpenSearch 文档:https://opensearch.org/docs
- MongoDB 手册:https://docs.mongodb.com
- 如何在 Debian 10 上安装和使用 Docker
- 安装 mongosh - MongoDB Shell
- 本文作者: Berry
- 本文链接: https://wuxinberry.github.io/2025/03/16/Graylog61-deploy/
- 版权声明: 本博客所有文章除特别声明外,均采用 MIT 许可协议。转载请注明出处!