docker-compose搭建mongo+elasticsearch+graylog運行環境

     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協議,保證收發的效率,犧牲傳輸可靠性,是一個理想的辦法。因爲丟失一條日誌,並不會影響系統的正常運行。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章