Elastic:用 Docker 部署 Elastic Stack

文章转载自:https://elasticstack.blog.csdn.net/article/details/100919273

前提条件

首选需要在主机上安装好docker和docker-compose

用 docker 来安装 Elasticsearch

下载 docker image

docker pull docker.elastic.co/elasticsearch/elasticsearch:7.3.2

开发或测试环境

docker run -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" docker.elastic.co/elasticsearch/elasticsearch:7.3.2

# 注意:discovery.type=single-node,该发现允许绕过单节点开发集群中的 bootstrap checks 检查

生产环境

$ grep vm.max_map_count /etc/sysctl.conf
vm.max_map_count=262144

在某些节点中可能无法直接访问外网进行docker 镜像的下载。修复方式:

  • 开启外网访问,(或者)在其他能够访问外网的节点中下载对应镜像 docker pull elasticsearch:7.3.2
  • 把镜像导出为文件 docker save -o elasticsearch-7.3.2-image.tar docker.io/elasticsearch:7.3.2
  • 把导出的文件拷贝到目标机器 scp elasticsearch-7.3.2-image.tar root@192.168.10.221:/tmp
  • 登陆目标机器 ssh root@192.168.10.221
  • 导入目标镜像 docker load < elasticsearch-7.3.2-image.tar

用 docker 来安装 Kibana

下载 docker image

docker pull docker.elastic.co/kibana/kibana:7.3.2

开发或测试环境

docker run --link YOUR_ELASTICSEARCH_CONTAINER_NAME_OR_ID:elasticsearch -p 5601:5601 {docker-repo}:{version}

docker run --link 3839f34c1d2d:elasticsearch -p 5601:5601 docker.elastic.co/kibana/kibana:7.3.2

使用 docker-compose 来启动 Elasticsearch 和 Kibana

创建一个叫做 docker 的目录,并在这个目录里创建一个叫做 docker-compose.yml 的文件。

# docker-compose.yml
version: '2.2'
services:
  es01:
    image: docker.elastic.co/elasticsearch/elasticsearch:7.3.2
    container_name: es01
    environment:
      - node.name=es01
      - discovery.seed_hosts=es02
      - cluster.initial_master_nodes=es01,es02
      - cluster.name=docker-cluster
      - bootstrap.memory_lock=true
      - "ES_JAVA_OPTS=-Xms512m -Xmx512m"
    ulimits:
      memlock:
        soft: -1
        hard: -1
    volumes:
      - esdata01:/usr/share/elasticsearch/data
    ports:
      - 9200:9200
    networks:
      - esnet
  es02:
    image: docker.elastic.co/elasticsearch/elasticsearch:7.3.2
    container_name: es02
    environment:
      - node.name=es02
      - discovery.seed_hosts=es01
      - cluster.initial_master_nodes=es01,es02
      - cluster.name=docker-cluster
      - bootstrap.memory_lock=true
      - "ES_JAVA_OPTS=-Xms512m -Xmx512m"
    ulimits:
      memlock:
        soft: -1
        hard: -1
    volumes:
      - esdata02:/usr/share/elasticsearch/data
    networks:
      - esnet
 
  kibana:
    image: docker.elastic.co/kibana/kibana:7.3.2
    container_name: kibana
    ports: ['5601:5601']    
    networks: ['esnet']
    environment:
      - SERVER_NAME=kibana.localhost
      - ELASTICSEARCH_HOSTS=http://es01:9200
      - I18N_LOCALE=zh-CN
      - ELASTICSEARCH_USERNAME=elastic
      - ELASTICSEARCH_PASSWORD=mypasword
    depends_on: ['es01']
 
volumes:
  esdata01:
    driver: local
  esdata02:
    driver: local
 
networks:
  esnet:

在这个配置中,我们创建了两个 Elasticsearch 的 node:es01 及 es02。节点 es01 侦听 localhost:9200,而 es02 通过 Docker 网络与 es01 对话。同时我们也创建了另外一个kibana 的 docker。

可以通过如下的方式来配置 Kibana。我们可以在 docker-compose.yml 的目录下创建另外一个叫做 kibana.yml 的文件

# kibana.yml
server.name: kibana
server.host: "0"
elasticsearch.hosts: [ "http://elasticsearch:9200" ]
i18n.locale: "zh-CN"
xpack.monitoring.ui.container.elasticsearch.enabled: true

做了一些简单的设置,比如我们配置了 locale 为中文。我们可以修改我们的 docker-compose.yml 文件如下:

# docker-compose.yml
version: '2.2'
services:
  es01:
    image: docker.elastic.co/elasticsearch/elasticsearch:7.3.2
    container_name: es01
    environment:
      - node.name=es01
      - discovery.seed_hosts=es02
      - cluster.initial_master_nodes=es01,es02
      - cluster.name=docker-cluster
      - bootstrap.memory_lock=true
      - "ES_JAVA_OPTS=-Xms512m -Xmx512m"
    ulimits:
      memlock:
        soft: -1
        hard: -1
    volumes:
      - esdata01:/usr/share/elasticsearch/data
    ports:
      - 9200:9200
    networks:
      - esnet
  es02:
    image: docker.elastic.co/elasticsearch/elasticsearch:7.3.2
    container_name: es02
    environment:
      - node.name=es02
      - discovery.seed_hosts=es01
      - cluster.initial_master_nodes=es01,es02
      - cluster.name=docker-cluster
      - bootstrap.memory_lock=true
      - "ES_JAVA_OPTS=-Xms512m -Xmx512m"
    ulimits:
      memlock:
        soft: -1
        hard: -1
    volumes:
      - esdata02:/usr/share/elasticsearch/data
    networks:
      - esnet
  kibana:
    image: docker.elastic.co/kibana/kibana:7.3.2
    container_name: kibana
    networks: ['esnet']
    ports: ['5601:5601']
    environment:
      - ELASTICSEARCH_HOSTS=http://es01:9200
    volumes:
      - ./kibana.yml:/usr/share/kibana/config/kibana.yml            
 
volumes:
  esdata01:
    driver: local
  esdata02:
    driver: local
 
networks:
  esnet:

通过在 kibana 中的 volumes 来把本地的 kibana.yml 文件 bind mount 到我们的 docker 之中的 image 里。这样它代替 docker 里的 /usr/share/kibana/config/kibana.yml 文件从而使用我们在本地设置的 kibana.yml 文件。

定制版本

从上面的 docker-compose.yml 中,我们可以看出来:所有的 Elastic Stack 的各个组件的版本都是一样的。如果我们想修改我们的版本的话,我们需要去修改每一个字符串。这样比较麻烦。为了方便 docker-compose 允许我们创建一个隐形的文件叫做 .env。 它的内容如下:

$ cat .env 
ELASTIC_STACK_VERSION=7.6.1

在这个文件中,我们可以定义 ELASTIC_STACK_VERSION=7.6.1。一旦这样定义后,我们可以把我们的 docker-compose.yml 修改为:

version: '2.2'
services:
  es01:
    image: docker.elastic.co/elasticsearch/elasticsearch:${ELASTIC_STACK_VERSION}
    container_name: es01
    environment:
      - node.name=es01
      - discovery.seed_hosts=es02
      - cluster.initial_master_nodes=es01,es02
      - cluster.name=docker-cluster
      - bootstrap.memory_lock=true
      - "ES_JAVA_OPTS=-Xms512m -Xmx512m"
    ulimits:
      memlock:
        soft: -1
        hard: -1
    volumes:
      - esdata01:/usr/share/elasticsearch/data
    ports:
      - 9200:9200
    networks:
      - esnet
  es02:
    image: docker.elastic.co/elasticsearch/elasticsearch:${ELASTIC_STACK_VERSION}
    container_name: es02
    environment:
      - node.name=es02
      - discovery.seed_hosts=es01
      - cluster.initial_master_nodes=es01,es02
      - cluster.name=docker-cluster
      - bootstrap.memory_lock=true
      - "ES_JAVA_OPTS=-Xms512m -Xmx512m"
    ulimits:
      memlock:
        soft: -1
        hard: -1
    volumes:
      - esdata02:/usr/share/elasticsearch/data
    networks:
      - esnet
 
  kibana:
    image: docker.elastic.co/kibana/kibana:${ELASTIC_STACK_VERSION}
    container_name: kibana
    ports: ['5601:5601']    
    networks: ['esnet']
    environment:
      - SERVER_NAME=kibana.localhost
      - ELASTICSEARCH_HOSTS=http://es01:9200
      - I18N_LOCALE=zh-CN
      - ELASTICSEARCH_USERNAME=elastic
      - ELASTICSEARCH_PASSWORD=mypassword
    depends_on: ['es01']
 
volumes:
  esdata01:
    driver: local
  esdata02:
    driver: local
 
networks:
  esnet:

这样以后如果我们想换一个版本的话,我们只需要修改 .env 文件的版本定义即可。

posted @ 2021-06-29 14:05  哈喽哈喽111111  阅读(530)  评论(1编辑  收藏  举报