Docker搭建ELK


ElasticSearch簡介

Elasticsearch 是一個分布式的免費開源搜索和分析引擎,適用於包括文本、數字、地理空間、結構化和非結構化數據等在內的所有類型的數據。Elasticsearch 在 Apache Lucene 的基礎上開發而成,由 Elasticsearch N.V.(即現在的 Elastic)於 2010 年首次發布。Elasticsearch 以其簡單的 REST 風格 API、分布式特性、速度和可擴展性而聞名,是 Elastic Stack 的核心組件;Elastic Stack 是一套適用於數據采集、擴充、存儲、分析和可視化的免費開源工具。人們通常將 Elastic Stack 稱為 ELK Stack(代指 Elasticsearch、Logstash 和 Kibana),目前 Elastic Stack 包括一系列豐富的輕量型數據采集代理,這些代理統稱為 Beats,可用來向 Elasticsearch 發送數據。

Elasticsearch 的用途是什么?

Elasticsearch 在速度和可擴展性方面都表現出色,而且還能夠索引多種類型的內容,這意味着其可用於多種用例:

  • 應用程序搜索
  • 網站搜索
  • 企業搜索
  • 日志處理和分析
  • 基礎設施指標和容器監測
  • 應用程序性能監測
  • 地理空間數據分析和可視化
  • 安全分析
  • 業務分析

Elasticsearch 索引是什么?

Elasticsearch 索引指相互關聯的文檔集合。Elasticsearch 會以 JSON 文檔的形式存儲數據。每個文檔都會在一組鍵(字段或屬性的名稱)和它們對應的值(字符串、數字、布爾值、日期、數值組、地理位置或其他類型的數據)之間建立聯系。

Elasticsearch 使用的是一種名為倒排索引的數據結構,這一結構的設計可以允許十分快速地進行全文本搜索。倒排索引會列出在所有文檔中出現的每個特有詞匯,並且可以找到包含每個詞匯的全部文檔。
在索引過程中,Elasticsearch 會存儲文檔並構建倒排索引,這樣用戶便可以近實時地對文檔數據進行搜索。索引過程是在索引 API 中啟動的,通過此 API 您既可向特定索引中添加 JSON 文檔,也可更改特定索引中的 JSON 文檔。

Docker run 安裝

內核設置必須設置為vm.max_map_count至少262144用於生產用途。

vi /etc/sysctl.conf
vm.max_map_count=262144

ElasticSearch

docker network create elastic

docker run -itd --name es01-test --net elastic -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" -e ES_JAVA_OPTS="-Xms512m -Xmx512m" docker.elastic.co/elasticsearch/elasticsearch:7.16.3

查看效果

curl localhost:9200

{
  "name" : "e55c439c43e2",
  "cluster_name" : "docker-cluster",
  "cluster_uuid" : "IpA90qJnSiCapy0Q1b8keQ",
  "version" : {
    "number" : "7.16.3",
    "build_flavor" : "default",
    "build_type" : "docker",
    "build_hash" : "4e6e4eab2297e949ec994e688dad46290d018022",
    "build_date" : "2022-01-06T23:43:02.825887787Z",
    "build_snapshot" : false,
    "lucene_version" : "8.10.1",
    "minimum_wire_compatibility_version" : "6.8.0",
    "minimum_index_compatibility_version" : "6.0.0-beta1"
  },
  "tagline" : "You Know, for Search"
}

Kibana

應確保kibana的版本和elasticSearch的版本一致。

docker run -itd --name kib01-test --net elastic --link es01-test:elasticsearch -p 5601:5601 -e "ELASTICSEARCH_HOSTS=http://elasticsearch:9200" -e ES_JAVA_OPTS="-Xms128m -Xmx128m" docker.elastic.co/kibana/kibana:7.16.3

網頁端查看效果(注:55601是virtualBox Nat網絡端口映射):

Docker Compose 安裝方式

先強制刪除es01-test和kib01-test(或者采用先stop 再rm的方式,-f是強制刪除)

docker rm -f es01-test
docker rm -f kib01-test

docker-compose.yml

version: '2.2'
services:
  elasticsearch:
    image: elasticsearch:7.16.3  #鏡像
    container_name: elk_elasticsearch  #定義容器名稱
    restart: always  #開機啟動,失敗也會一直重啟
    environment:
      - "cluster.name=elasticsearch" #設置集群名稱為elasticsearch
      - "discovery.type=single-node" #以單一節點模式啟動
      - "ES_JAVA_OPTS=-Xms256m -Xmx256m" #設置使用jvm內存大小
    volumes:
      - /data/elk/elasticsearch/plugins:/usr/share/elasticsearch/plugins #插件文件掛載
      - /data/elk/elasticsearch/data:/usr/share/elasticsearch/data #數據文件掛載
    ports:
      - 9200:9200
    networks:
      - elastic 
  kibana:
    image: kibana:7.16.3
    container_name: elk_kibana
    restart: always
    depends_on:
      - elasticsearch #kibana在elasticsearch啟動之后再啟動
    environment:
      - ELASTICSEARCH_URL=http://elasticsearch:9200 #設置訪問elasticsearch的地址
    ports:
      - 5601:5601
    networks:
      - elastic 
  logstash:
    image: logstash:7.16.3
    container_name: elk_logstash
    restart: always
    volumes:
      - /data/elk/logstash/logstash.conf:/usr/share/logstash/pipeline/logstash.conf #掛載logstash的配置文件
    depends_on:
      - elasticsearch #kibana在elasticsearch啟動之后再啟動
    links:
      - elasticsearch:es #可以用es這個域名訪問elasticsearch服務
    ports:
      - 4560:4560
    networks:
      - elastic 
  mysql:
    restart: always
    image: mysql:8.0
    container_name: mysql-lable
    volumes:
      - /apps/mysql/mydir:/mydir
      - /apps/mysql/datadir:/var/lib/mysql
      - /apps/mysql/conf/my.cnf:/etc/my.cnf
      # 數據庫還原目錄 可將需要還原的sql文件放在這里
      - /apps/mysql/source:/docker-entrypoint-initdb.d
    environment:
      - "MYSQL_ROOT_PASSWORD=uu001"
      - "MYSQL_DATABASE=uudemo"
      - "TZ=Asia/Shanghai"
    ports:
      # 使用宿主機的3306端口映射到容器的3306端口
      # 宿主機:容器
      - 3306:3306

networks:
  elastic:
    driver: bridge

/apps/mysql/conf/my.conf,內容如下:

[mysqld]
user=mysql
default-storage-engine=INNODB
character-set-server=utf8
character-set-client-handshake=FALSE
collation-server=utf8_unicode_ci
init_connect='SET NAMES utf8'
[client]
default-character-set=utf8
[mysql]
default-character-set=utf8

/data/elk/logstash/logstash.conf,內容如下:

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

執行以下命令,以守護進程方式啟動

cd /data/elk
chmod 777 elasticsearch/data
docker-compose up -d

錯誤解決

1. 安裝后外網無法訪問。

解決:docker run -p后面仿照官網加了127.0.0.1:9200:9200,這個127.0.0.1是回環地址,外網訪問不到,去掉127.0.0.1即可。

2.訪問ui settings Elasticsearch plugin is red

解決:安裝版本不一致,保持一致即可

3. kibana server is not ready yet

通過查看日志分析問題

docker ps |grep kib

docker logs kibana的容器名稱

發下以下錯誤:(大概意思是未發現es結點)
解決:查看配置文件(通過卷映射或者到容器內查看)

docker exec -it kibana容器名稱 /bin/bash
ls

LICENSE.txt NOTICE.txt README.txt bin config data node node_modules package.json plugins src x-pack

cd config
ls

kibana.yml node.options

cat kibana.yml

#
# ** THIS IS AN AUTO-GENERATED FILE **
#

# Default Kibana configuration for docker target
server.host: "0.0.0.0"
server.shutdownTimeout: "5s"
elasticsearch.hosts: [ "http://elasticsearch:9200" ]

從這里可以看出kibana默認連接的是http://elasticsearch:9200,這里可以修改這里,也可以在docker run的時候 加上--link es實例名稱:elasticsearch

links實質是在kibana的etc/hosts設置一個對應的映射。

3.ElasticsearchException[failed to bind service]; nested: AccessDeniedException[/usr/share/elasticsearch/data/nodes];
解決:權限問題。執行以下命令配置權限

cd /data/elk
chmod 777 elasticsearch/data

查看效果:

需要如要設置登錄密碼,需要配置Xpack,(后續再補充)

引用

https://www.elastic.co/guide/en/kibana/current/docker.html
https://www.cnblogs.com/woshimrf/p/docker-es7.html
https://www.jianshu.com/p/2d78ce6bc504


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM