docker-compose搭建mongo+elasticsearch+graylog运行环境

2023-05-16

     graylog是一个小型的开源日志收集、分析、展示框架。

    主要graylog运行需要mongo、elasticsearch,所以他们就组成了一个小的整体。一般在虚拟机上搭建,可以分开安装部署,但是既然是一个日志服务,而且想尽量整理的简单一些,所以考虑直接使用docker容器的方式,而直接一个一个docker run,还是显得很复杂,主要是他们需要做一些配置,而且三个容器之间,graylog依赖于mongo、elasticsearch,还不能先启动graylog。索性就整理一个docker-compose.yml文件,把他们三个一起部署,然后每次要修改配置或者重启就方便很多。

    如下是根据一些资料整理的一个简洁的docker-compose.yml配置:

version: '2'
services: 
  mongodb:
    container_name: mongodb
    image: mongo:3
    restart: always
    volumes:
      - /data/graylog/mongo_data:/data/db


  es:
    image: docker.elastic.co/elasticsearch/elasticsearch-oss:6.8.5
    container_name: es
    restart: always
    volumes:
      - /data/graylog/es_data:/usr/share/elasticsearch/data
    ports:
      - 9200:9200
      - 9300:9300
    environment:
      - TZ=Aisa/Shanghai
      - http.host=0.0.0.0
      - transport.host=localhost
      - network.host=0.0.0.0
      - http.cors.allow-origin=*
      - http.cors.enabled=true
      - discovery.type=single-node
      - 'ES_JAVA_OPTS=-Xms1024m -Xmx1024m'


  graylog:
    image: graylog/graylog:4.0.2
    container_name: graylog
    restart: always
    volumes:
      - /data/graylog/graylog_journal:/usr/share/graylog/data/journal
      - /data/graylog/config:/usr/share/graylog/config
    ports:
      - 9000:9000
      - 12201:12201/udp
    environment:
      - GRAYLOG_HTTP_EXTERNAL_URI=http://192.168.17.100:9000/
    depends_on:
      - mongodb
      - es
    links:
      - mongodb:mongo
      - es:elasticsearch

    需要说明的是:

    1、mongo的配置很简单,就是为了持久化,做了一个存储的映射。

    2、elasticsearch的配置,这里做了端口映射,其实也是没有必要的,因为graylog访问它是根据容器名称来访问的。 环境变量中discovery.type=single-node是必须的,默认就是zen的模式。最重要的一个配置就是jvm参数ES_JAVA_OPTS,这里必须设置至少512m,否则es可能因为启动时内存不足,导致启动失败,然后容器一直处于restarting状态,后续的graylog就连接不上,同样也会启动异常并报错。

    3、graylog这里采用了本地配置映射,用到了/data/graylog/config目录下的graylog.conf,里面配置了很多参数,其实这些参数可以通过环境变量environment的方式添加并覆盖,这里想用自定义的配置文件。但是配置了http_external_uri,访问的时候,页面上的资源文件全部还是请求的容器ip里面的,所以报错,如下图所示,后来通过environment的方式修改了这个变量,所以这里的配置显得很繁琐。

    4、graylog需要依赖其他两个容器,而且访问的时候,直接使用的容器名称做的主机,所以links这里配置需要注意,我们在定义mongodb、elasticsearch services名称的时候可以随便定义,这里叫的是mongodb和es,但是graylog默认使用的是mongo和elasticsearch,所以我们需要在links里面做这样的映射:

    links:
      - mongodb:mongo
      - es:elasticsearch

    如果你的service定义的名字就是mongo和elasticsearch,就不需要映射,直接:

    links:
      - mongo
      - elasticsearch

   5、graylog采用了映射配置文件与环境变量共存的办法,这里配置文件是从github下载,文件名称是graylog.conf,配置项主要是用户登录秘钥和密码sha2的加密串、时区等等。在这个配置文件里面可以很清楚的看到,graylog连接mongo与elasticsearch所使用的url,分别是:

    mongodb_uri = mongodb://mongo/graylog

    elasticsearch_hosts = http://elasticsearch:9200

    所以说前面,我们配置links的为什么要指定一个映射。

    其他的配置:

    password_secret = somepasswordpepper      #对应环境变量就是GRAYLOG_PASSWORD_SECRET=somepasswordpepper

    root_password_sha2 = 8c6976e5b5410415bde908bd4dee15dfb167a9c873fc4bb8a81f6f2ab448a918 #对应环境变量就是#GRAYLOG_ROOT_PASSWORD_SHA2=8c6976e5b5410415bde908bd4dee15dfb167a9c873fc4bb8a81f6f2ab448a918

    root_timezone = PRC  #对应环境变量是 TZ=Asia/Shanghai

   6、前面配置es,graylog,mongodb都做了存储本地映射,尤其是es,mongodb,文件夹的权限必须是777,如下所示:

    

    这个也是在实际中采坑得出的结论,容器启动正常,但是报错,permission denied。

    7、这里在graylog里面不仅配置了links,还配置了depends_on,主要是graylog依赖于mongodb,es,它必须在他们两个服务启动之后,才能启动,相当于做了一个约束,这个很好理解。

    以上这些都做好了,就可以进行启动docker容器了。

    容器启动,es会做初始化,graylog等待连接es,mongodb,这个过程会比较耗时,当我们看到graylog出现server up and running的时候,才可以通过浏览器访问graylog可视化webui。

2021-02-02 16:40:42,493 INFO : org.graylog2.bootstrap.ServerBootstrap - Graylog server up and running.

    访问http://192.168.17.100:9000,用户名密码都是admin,其中192.168.17.100是虚拟机的ip,docker安装在虚拟机中。

     登录,进入首页:

    首页菜单栏的位置会出现两个警告,我们可以点开,一个是es磁盘空间问题,一个是graylog本身刚创建,还没有设置日志收集的输入规则。

    根据提示,我们尝试创建日志收集规则,在launch页面,我们选择gelf udp,然后点击Launch new input按钮。

     在弹出框中,设置title就可以了。采用的是udp的方式,端口使用的是我们在docker-compose.yml中定义的12201/udp。

   点击Save保存按钮,这个input马上就会运行起来,警告也随之消失,变成一个。

     前面这些操作,我们只是搭建了graylog运行环境,以及设置了日志收集输入配置,下面就等待客户端日志发送到服务器了,我们可以通过java编程,也可以通过一个简单的测试,下面通过一个简单的模拟,定时发送消息到graylog中。这里也会启动一个docker,他是一个很小的容器busybox。

    运行的命令:

docker run -d \
           --log-driver=gelf \
           --log-opt gelf-address=udp://localhost:12201 \
           --log-opt tag="log-test-container-B" \
           busybox sh -c 'while true; do echo "This is a log message from container B"; sleep 10; done;'

    运行之后,就会不断的发送日志,我们在graylog的可视化界面中就可以看到日志内容了:

     graylog最新的版本是4.0.2,如果不用最新的版本镜像,进入首页,还有个警告是你使用了一个过时的graylog...

     graylog日志收集方式,默认提供了很多种协议,http,tcp,udp,作为一个日志收集系统,其实大量的日志,并不需要保证每一条都需要保存下来,它不比数据库系统那么高要求,所以使用udp协议,保证收发的效率,牺牲传输可靠性,是一个理想的办法。因为丢失一条日志,并不会影响系统的正常运行。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

docker-compose搭建mongo+elasticsearch+graylog运行环境 的相关文章

随机推荐

  • electron-vue与vuetify整合出现报错:If you‘re seeing “$attrs is readonly“

    如题所示 xff0c 正常情况下electron vue与vuetify的整合 xff0c 因为就是vue与vuetify的整合 xff0c 按照一般的推荐方法 xff0c 基本不会出错 xff0c 但是 xff0c 这里因为electro
  • VISA编程实例(C实现)

    今天写这个文章 xff0c 是因为自己工作中用到了ROHDE amp SCHWARZ xff08 即罗德 施瓦茨公司 xff09 的仪表设备 xff0c 需要通过编程的方式来读取仪表上功率测试结果 xff0c 本来仪表上显示了测试结果 xf
  • mac下通过gcc命令手动编译动态链接库示例

    编译动态链接库 xff0c windows linux mac平台各不相同 xff0c 从文件上来说 xff0c windows下是dll xff0c linux下是so xff0c mac下是dylib xff1b 命令上也会有区别 xf
  • c++中char[]与char*的转换以及char*与数字互转

    在c c 43 43 中 xff0c 字符串操作不可避免 xff0c 而且通常 xff0c char 或者char 就能表示字符串 xff0c 这个跟java语言有很大的差别 xff0c java中char是字符 xff0c string才
  • electron项目构建打包缺少dll文件的问题解决办法

    最近 xff0c 在做electron项目中 xff0c 使用了第三方dll xff0c 开发环境运行一切正常 xff0c 可是当我们打包 xff0c 最后生成的可执行程序再执行 xff0c 发现调用dll总是不成功 xff0c 猜测是少了
  • c/c++中的回调函数

    c c 43 43 中的回调函数是一个很奇怪的东西 xff0c 在java中 xff0c 方法调用的时候 xff0c 参数最多可以传入另一个对象实例 xff0c 然后在方法体内 xff0c 调用实例的方法 xff0c 做不到方法调用的时候
  • 在Windows下配置多个git账号

    本文记录在Windows下配置两个github账号的过程 1 生成并部署SSH key 安装好Git客户端后 xff0c 打开git bash xff0c 输入以下命令生成user1的SSH Key xff1a ssh keygen t r
  • windows命令行下通过cl命令编译动态链接库示例

    一般在windows下写一个c c 43 43 的动态链接库 xff0c 我们都是在visual studio或着visual c 43 43 这些ide里面进行编译和生成的 xff0c 今天介绍 xff0c 如何通过命令行来实现手动编译和
  • gdb命令调试c程序

    一般开发c语言程序 xff0c 都是在ide中编码 xff0c 调试也是使用集成环境 xff0c 有时候 xff0c 我们的程序是在文本编辑器中编写的 xff0c 这时候可能使用gcc编译 xff0c 然后运行可执行程序 遇到需要调试的场景
  • 选择排序算法与示例详解(c语言)

    选择排序是排序算法的一种 xff0c 思想就是 xff0c 每一轮寻找数组中最大的值或者最小的值 xff0c 放在头部或者放入一个新的数组 这样经历一轮遍历 xff0c 数组或者新数组就是排好序的 xff0c 他的目的很明确 xff0c 每
  • 2020年csdn盘点

    十年前就注册了csdn账号 xff0c 之后一直没有写过博客 xff0c 都是看别人的博客 xff0c 等到2015年左右发表了第一篇自己的博客 xff0c 直到2016年底觉着做技术的就需要记录自己的博客 xff0c 不仅是自己学习的过程
  • chrome浏览器安装react-devtools

    react devtools是react开发时的一个浏览器插件 xff0c 对于各大主流高级浏览器都有扩展程序可以安装 xff0c 官方的地址默认是https github com facebook react devtools xff0c
  • react+typescript项目构建

    react项目构建可以很简单 xff0c 但是如果是结合typescript xff0c 其实也不是很麻烦 xff0c 官网也有很明确的说明 有两种办法 xff1a 1 直接构建带有typescript的react项目 xff0c 我们需要
  • react项目启动报错:Uncaught TypeError: Cannot read property ‘forEach‘ of undefined

    如题 xff0c react项目启动报错 xff0c 具体信息 xff0c 如下所示 xff1a 这个问题是因为浏览器安装了react devtools扩展程序导致的 xff0c 很多人的解决办法就是直接禁用react devtools x
  • react组件之间传值

    看过一些文章介绍react组件之间传值 xff0c 无外乎以下几种情况 xff1a 父子组件之间相互传值 xff0c 兄弟节点之间传值 最常见的就是父子组件 xff0c 做法也很简单 xff1a 就是在父组件中直接通过props属性的方式将
  • 利用mocha进行以太坊智能合约编译部署测试

    使用智能合约编程语言solidity编写的智能合约 xff0c 除了可以直接通过以太坊的工具链truffle ganache cli进行测试之外 xff0c 还可以结合mocha进行单元测试 mocha单元测试本质上 xff0c 还是需要对
  • electron报错:Uncaught Error: A dynamic link library (DLL) initialization routine failed

    如题所示 xff0c 我们在进行node 43 electron开发桌面应用的时候 xff0c 经常会遇到这样的问题 xff1a 根据提示是因为ref依赖模块没有合适的编译版本 xff0c 但是我们进行npm install的时候没有报错啊
  • C语言 利用冒泡排序法对10个字符由小到大排序

    span class token macro property span class token directive hash span span class token directive keyword include span spa
  • truffle+ganache-cli构建简单以太坊智能合约并编译部署

    以前接触过以太坊工具链来做区块链练手项目 xff0c 后来荒废了 xff0c 如今再次捡起来 xff0c 算是回忆和加深 之前可能因为网络的原因 xff0c 在truffle各种初始化编译合成智能合约都遇到了好多问题 xff0c 如今再次尝
  • docker-compose搭建mongo+elasticsearch+graylog运行环境

    graylog是一个小型的开源日志收集 分析 展示框架 主要graylog运行需要mongo elasticsearch xff0c 所以他们就组成了一个小的整体 一般在虚拟机上搭建 xff0c 可以分开安装部署 xff0c 但是既然是一个