Docker环境中Elasticsearch的安装

Docker环境中Elasticsearch的安装

在本章中,我们初步讨论了Docker环境中的Elasticsearch的安装和设置
Elasticsearch的image是使用X-Pack构建的。
X-Pack是一个Elastic Stack的扩展,可将安全性,警报,监控,报告和图形功能捆绑到一个易于安装的软件包中。 虽然X-Pack组件旨在无缝协同工作,您也可以轻松地启用或禁用要使用的功能。
在Elasticsearch 5.0.0之前,您必须安装单独的ShieldWatcherMarvel插件,以获得X-Pack中捆绑在一起的功能。 使用X-Pack,您不再需要担心每个插件是否具有正确的版本,而只需安装您正在运行的Elasticsearch版本的X-Pack就可以了。

安全提示

  • X-Pack已经内置在image中,希望你可以花费一段时间来熟悉一下X-Pack Security
    。默认的elastic用户的密码是changeme

  • X-Pack有30天的试用时间,超过试用期之后,您可以获得一个可用的订阅禁用安全性。 基本许可证是免费的,并包括监控扩展。

获取Elasticsearch的docker image是非常简单的:

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

从命令行运行Elasticsearch

开发模式

一般在开发和测试环境时,往往是通过下面的命令启动的:

docker run -p 9200:9200 -e "http.host=0.0.0.0" -e "transport.host=127.0.0.1" docker.elastic.co/elasticsearch/elasticsearch:5.3.1

生产环境

在生产环境下vm_max_map_count内核参数需要设置为最少262144

linux:
    $ grep vm.max_map_count /etc/sysctl.conf
    vm.max_map_count=262144
    To apply the setting on a live system type: `sysctl -w vm.max_map_count=262144`
OSX with Docker for Mac:
    $ screen ~/Library/Containers/com.docker.docker/Data/com.docker.driver.amd64-linux/tty
    Log in with root and no password. Then configure the sysctl setting as you would for Linux:
    sysctl -w vm.max_map_count=262144
OSX with Docker Toolbox:
    docker-machine ssh
    sudo sysctl -w vm.max_map_count=262144

Elasticsearch集群搭建的例子

下面的例子搭建了一个Elasticsearch集群,有2个Elasticsearch节点:
节点elasticsearch1监听localhost:9200, 节点elasticsearch2使用docker网络和elasticsearch1交互,下面的例子中也使用了
Docker named volumes,名称是esdata1esdata2. 下面是docker-compose.yml文件的内容:

version: '2'
services:
  elasticsearch1:
    image: docker.elastic.co/elasticsearch/elasticsearch:5.3.1
    container_name: elasticsearch1
    environment:
      - cluster.name=docker-cluster
      - bootstrap.memory_lock=true
      - "ES_JAVA_OPTS=-Xms512m -Xmx512m"
    ulimits:
      memlock:
        soft: -1
        hard: -1
      nofile:
        soft: 65536
        hard: 65536
    mem_limit: 1g
    cap_add:
      - IPC_LOCK
    volumes:
      - esdata1:/usr/share/elasticsearch/data
    ports:
      - 9200:9200
    networks:
      - esnet
  elasticsearch2:
    image: docker.elastic.co/elasticsearch/elasticsearch:5.3.1
    environment:
      - cluster.name=docker-cluster
      - bootstrap.memory_lock=true
      - "ES_JAVA_OPTS=-Xms512m -Xmx512m"
      - "discovery.zen.ping.unicast.hosts=elasticsearch1"
    ulimits:
      memlock:
        soft: -1
        hard: -1
      nofile:
        soft: 65536
        hard: 65536
    mem_limit: 1g
    cap_add:
      - IPC_LOCK
    volumes:
      - esdata2:/usr/share/elasticsearch/data
    networks:
      - esnet
volumes:
  esdata1:
    driver: local
  esdata2:
    driver: local
networks:
  esnet:
    driver: bridge

如果想停止集群,可以使用:docker-compose down命令。这样数据卷会依旧存在,所以下次在使用docker-compose up启动集群的时候,数据依旧存在的。
如果你想销毁集群并且删除数据卷,那么就需要使用:docker-compose down -v命令。

查看集群状态

curl -u elastic http://127.0.0.1:9200/_cat/health
Enter host password for user 'elastic':
1472225929 15:38:49 docker-cluster green 2 2 4 2 0 0 0 0 - 100.0%

日志消息转到控制台,由配置的Docker日志驱动程序处理。 默认情况下,您可以使用docker logs访问日志。

配置docker中的Elasticsearch

Elasticsearch会从/usr/share/elasticsearch/config/路径下面加载它的配置文件,关于Elasticsearch配置文件的描述可以参考:Configuring ElasticsearchSetting JVM options.
image提供了好几种配置Elasticsearch的方式,比较常用的方式是使用配置文件elasticsearch.yml,当然也可以使用环境变量来设置Elasticsearch的配置。

使用docker环境变量来设置参数

举个例子,为了设置集群的名称,我们可以在使用docker run运行Elasticsearch容器的时候,传递参数:-e "cluster.name=mynewclustername"
注意这块需要使用双引号

通过挂载的方式进行配置

创建您的自定义配置文件,并将其安装在image的相应文件上。 例如在运行docker run的时候要绑定custom_elasticsearch.yml,可以使用下面的命令:

-v full_path_to/custom_elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml

Elasticsearch容器的用户的uid:gid为1000:1000,因此使用这种方式挂载文件,需要保证Elasticsearch的用户有访问这个文件的权限。对于数据目录和
日志目录比如/usr/share/elasticsearch/data还需要写权限

自定义Elasticsearch image

有时候可以通过自定义镜像的方式来修改Elasticsearch的配置,比如下面这个很简单的Dockerfile,就演示了这种方式:

FROM docker.elastic.co/elasticsearch/elasticsearch:5.3.1
ADD elasticsearch.yml /usr/share/elasticsearch/config/
USER root
RUN chown elasticsearch:elasticsearch config/elasticsearch.yml
USER elasticsearch

然后你就可以基于这个dockerfile来创建镜像并运行它:

docker build --tag=elasticsearch-custom .
docker run -ti -v /usr/share/elasticsearch/data elasticsearch-custom

使用命令行参数来配置Elasticsearch

这种方式用的比较少,基本不咋用,下面的例子演示了通过这种方式设置集群的名称:

docker run <various parameters> bin/elasticsearch -Ecluster.name=mynewclustername

一些生产环境的最佳实践

下面提到的任何Docker参数都假定使用docker run

  • Elasticsearch的容器使用用户elasticsearch,它的uid和gid为:1000:1000。因此你想挂载一个本地目录或者文件,需要注意它的读取权限。
  • 使用docker cli正确的设置功能和ulimits是非常重要的:
    --cap-add=IPC_LOCK --ulimit memlock=-1:-1 --ulimit nofile=65536:65536

    , 当然也可以使用上面提到的docker-compose.yml文件的那种设置方式。

  • 确保将bootstrap.memory_lock设置为true,如Disable swapping中所述。
  • Elasticsearch image暴露了TCP端口9200和9300.对于群集,建议将发布的端口随机分配--publish-all,除非您为每个主机锁定一个容器。
  • 使用ES_JAVA_OPTS环境变量来设置堆大小,例如使用16 GB使用-e ES_JAVA_OPTS =“ - Xms16g -Xmx16g”。还建议为容器设置内存限制
  • 将您的部署固定到特定版本的Elasticsearch Docker映像,例如docker.elastic.co/elasticsearch/flasticsearch:5.3.1
  • 始终使用/usr/share/elasticsearch/data上的卷,如上面的例子展示的那样,原因如下:
    • 如果容器被杀死,Elasticsearch节点的数据将不会丢失
    • Elasticsearch是I/O敏感的,Docker存储驱动程序不是快速I/O的理想选择
    • 它允许使用高级Docker卷插件
  • 如果您使用的是devicemapper存储驱动程序(至少基于RedHat(rpm)的发行版),请确保您没有使用默认的loop-lvm模式。配置docker-engine可以改用direct-lvm。
  • 考虑使用不同的日志记录驱动程序集中日志。另请注意,默认的json文件日志驱动程序不适合生产使用。

参考资料:

本文版权归作者所有,禁止一切形式的转载,复制等操作
赞赏

微信赞赏支付宝赞赏

发表评论

电子邮件地址不会被公开。 必填项已用*标注