通过Docker安装 --X-PACK
Elasticsearch同样也提供Docker镜像. 这个镜像使用Centos:7作为基础镜像, 并且支持X-PACK
Docker镜像和标签列表可以在这个网站上找到, www.docker.elastic.co. 源码在这里 https://github.com/elastic/elasticsearch-docker/tree/6.2
镜像类型
镜像有三种类型, basic, 默认类型, 包含部分功能的X-PACK, 免费的授权协议. platinum, 完全的X-PACK功能, 30天的试用. OSS, 不包含X-PACK, 开源版本的Elasticsearch.
platinum镜像开启了X-PACK-SECURITY, 为了访问你的集群, 有必要为elastic用户设置密码, 可以在启动的时候通过ELASTIC_PASSWORD环境变量来设置
docker run -e ELASTIC_PASSWORD=MagicWord docker.elastic.co/elasticsearch/elasticsearch-platinum:6.2.4
platinum可以试用30天, 在那之后, 你可以选择购买, 或者使用免费的授权, 那只包含部分X-PACK功能.
可以简单的通过docker pull来获取Elasticsearch的docker镜像
docker pull docker.elastic.co/elasticsearch/elasticsearch:6.2.4
docker pull docker.elastic.co/elasticsearch/elasticsearch-platinum:6.2.4
docker pull docker.elastic.co/elasticsearch/elasticsearch-oss:6.2.4
从命令行启动Elasticsearch
开发模式
为了开发或者测试, 可以在命令行通过以下命令来快速启动Elasticsearch:
docker run -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" docker.elastic.co/elasticsearch/elasticsearch:6.2.4
生产环境
生产环境使用的话, vm.max_map_count这个内核设置至少设置成262144. 根据你的系统:
- Linux 可以在/etc/sysctl.conf里永久设置
$ grep vm.max_map_count /etc/sysctl.conf
vm.max_map_count=262144
在一台启动的机器上应用设置: sysctl -w vm.max_map_count=262144
- macOS, Docker For Mac
必须使用xhyve virtual machine来设置
$ screen ~/Library/Containers/com.docker.docker/Data/com.docker.driver.amd64-linux/tty
用root登录, 之后和linux上的设置一样
sysctl -w vm.max_map_count=262144
- Windows 和 macOS: Docker toolbox
通过docker-machine来设置
docker-machine ssh
sudo sysctl -w vm.max_map_count=262144
下面的例子启动了2个Elasticsearch节点的集群, 使用docker-compose.yml和下面的命令:
docker-compose up
docker-compose 在linux上没有和docker一起安装, 你需要自己安装 https://docs.docker.com/compose/install/#install-using-pip
节点Elasticsearch监听在本机的9200端口, Elasticsearch2通过docker网络和和Elasticsearch通信.
这个例子还使用了docker命名卷, esdata1和esdata2, 如果不存在则会被创建.
docker-compose.yml
version: '2.2'
services:
elasticsearch:
image: docker.elastic.co/elasticsearch/elasticsearch:6.2.4
container_name: elasticsearch
environment:
- cluster.name=docker-cluster
- bootstrap.memory_lock=true
- "ES_JAVA_OPTS=-Xms512m -Xmx512m"
ulimits:
memlock:
soft: -1
hard: -1
volumes:
- esdata1:/usr/share/elasticsearch/data
ports:
- 9200:9200
networks:
- esnet
elasticsearch2:
image: docker.elastic.co/elasticsearch/elasticsearch:6.2.4
container_name: elasticsearch2
environment:
- cluster.name=docker-cluster
- bootstrap.memory_lock=true
- "ES_JAVA_OPTS=-Xms512m -Xmx512m"
- "discovery.zen.ping.unicast.hosts=elasticsearch"
ulimits:
memlock:
soft: -1
hard: -1
volumes:
- esdata2:/usr/share/elasticsearch/data
networks:
- esnet
volumes:
esdata1:
driver: local
esdata2:
driver: local
networks:
esnet:
可以输入docker-compose down来停止集群, 数据卷会保留, 所以可以用同样的数据再次启动集群, 如果要清楚数据卷, 输入docker-compose down -v.
检查集群的状态
curl http://127.0.0.1:9200/_cat/health
1472225929 15:38:49 docker-cluster green 2 2 4 2 0 0 0 0 - 100.0%
默认情况下, 可以通过docker logs来查看.
配置Elasticsearch
Elasticsearch从/usr/share/elasticsearch/config/读取配置文件.
https://www.elastic.co/guide/en/elasticsearch/reference/6.2/settings.html
https://www.elastic.co/guide/en/elasticsearch/reference/6.2/jvm-options.html
这个镜像提供几种方法来配置Elasticsearch, 常规的方法是提供一个自定义的elasticsearch.yml, 当然也可以用环境变量来设置.
- 通过docker环境变量呈现参数
举个例子, 可以在docker run命令中使用-e "cluster.name=mynewclustername"来设置集群名, 注意双引号是必须的.
- 绑定挂在配置文件
创建自己的配置文件并挂在到镜像对应的文件. 举个例子, 挂在一个custom-elasticsearch.yml, 通过docker run命令运行:
-v full_path_to/custom_elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml
容器会用Elasticsearch用户运行, uid:gid为1000:1000, 挂在的宿主机目录和文件, 例如custom-elasticsearch.yml., 都必须可以被这个用户访问, 对于数据和日志目录, 比如/usr/share/elasticsearch/data, 还需要写入权限.
- 自定义镜像
在某些环境中, 可能准备一个包含你的配置的镜像会更合适. 用Dockerfile, 会十分的方便.
FROM docker.elastic.co/elasticsearch/elasticsearch:6.2.4
COPY --chown=elasticsearch:elasticsearch elasticsearch.yml /usr/share/elasticsearch/config/
然后构建并运行这个镜像.
docker build --tag=elasticsearch-custom .
docker run -ti -v /usr/share/elasticsearch/data elasticsearch-custom
- 覆盖镜像的默认CMD
docker run <various parameters> bin/elasticsearch -Ecluster.name=mynewclustername
Elasticsearch镜像配置SSL/TLS
https://www.elastic.co/guide/en/elasticsearch/reference/6.2/configuring-tls-docker.html
生产环境注意事项
生产环境使用有一些最佳实践, 下面提到的docker参数都假设是针对于docker run的.
- 默认情况下容器使用用户elasticsearch uid:gid 为1000:1000. 如果你挂在本地的目录或者文件, 确保此用户可读,数据和日志目录还需要写入权限, 一个好的策略是, 对本地目录授予组访问权限给1000或者0, 例子如下
mkdir esdatadir
chmod g+rwx esdatadir
chgrp 1000 esdatadir
不得已的时候, 可以强制更改用户.
- 提高nofile和npoc的限制
- 为了性能和稳定性, 禁用swapping
- 镜像跑路9200和9300端口, 对于集群,建议随机暴露端口, --publish-all
- 用ES_JAVA_OPTS来设置堆大小
- 指定固定的版本
- 始终挂在/usr/share/elasticsearch/data目录
- 你的数据不会丢失
- elasticsearch对io很敏感, docker不擅长
- 可以使用高级的卷插件
- 如果你使用devicemapper存储驱动, 不要用默认的loop-lvm模式. 用direct-lvm
- 通过使用不同的日志驱动来中心化你的日志, 而且默认的json格式的日志也不是很适合生产环境