Elasticsearch也可以以docker镜像的形式使用。该镜像以Centos:8
做为基础镜像。
在www.docker.elastic.co上有完整的已发布的docker镜像和标签。相关的源文件在Github上。
这些镜像在Elastic许可(Elastic License)下是免费使用的。他们包含了开源的和免费的商业化的特性还有访问付费商业功能。
获取 Elasticsearch for Docker 就像针对 Elastic Docker 注册表发出 docker pull 命令一样简单
docker pull docker.elastic.co/elasticsearch/elasticsearch:7.10.2
或者,您可以下载仅包含 Apache 2.0 许可证下可用功能的其他 Docker 映像。
启动一个单节点的Elasticsearch集群作为学习和测试,指定单节点发现以绕过引导程序检查:
docker run -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" docker.elastic.co/elasticsearch/elasticsearch:7.10.2
使用Docker启动一个三节点的Elasticsearch集群,你需要使用Docker Compose
:
version: '2.2'
services:
es01:
image: docker.elastic.co/elasticsearch/elasticsearch:7.10.2
container_name: es01
environment:
- node.name=es01
- cluster.name=es-docker-cluster
- discovery.seed_hosts=es02,es03
- cluster.initial_master_nodes=es01,es02,es03
- bootstrap.memory_lock=true
- "ES_JAVA_OPTS=-Xms512m -Xmx512m"
ulimits:
memlock:
soft: -1
hard: -1
volumes:
- data01:/usr/share/elasticsearch/data
ports:
- 9200:9200
networks:
- elastic
es02:
image: docker.elastic.co/elasticsearch/elasticsearch:7.10.2
container_name: es02
environment:
- node.name=es02
- cluster.name=es-docker-cluster
- discovery.seed_hosts=es01,es03
- cluster.initial_master_nodes=es01,es02,es03
- bootstrap.memory_lock=true
- "ES_JAVA_OPTS=-Xms512m -Xmx512m"
ulimits:
memlock:
soft: -1
hard: -1
volumes:
- data02:/usr/share/elasticsearch/data
networks:
- elastic
es03:
image: docker.elastic.co/elasticsearch/elasticsearch:7.10.2
container_name: es03
environment:
- node.name=es03
- cluster.name=es-docker-cluster
- discovery.seed_hosts=es01,es02
- cluster.initial_master_nodes=es01,es02,es03
- bootstrap.memory_lock=true
- "ES_JAVA_OPTS=-Xms512m -Xmx512m"
ulimits:
memlock:
soft: -1
hard: -1
volumes:
- data03:/usr/share/elasticsearch/data
networks:
- elastic
volumes:
data01:
driver: local
data02:
driver: local
data03:
driver: local
networks:
elastic:
driver: bridge
该Docker Compose示例文件启动了一个三节点的Elasticsearch集群。节点es01
监听localhost:9200
端口,es02
和es03
在Docker网络上与es01
进行交互。
请注意该配置将会在所有网络实例上暴露端口9200,并且鉴于Docker如何在Linux上操作iptables
,这意味着您的Elasticsearch集群可公开访问,可能会忽略任何防火墙设置。
如果您不想公开端口9200而是使用反向代理,将docker-compose.yml
文件中的9200:9200
替换为127.0.0.1:9200:9200
。然后只能从主机本身访问Elasticsearch。
Docker命名了data01
,data02
和data03
卷来存储节点数据目录,以便数据在重启后仍然存在。如果它们不存在docker-compose会在您启动集群时创建它们。
注意
Docker Compose在Linux上没有预装Docker
有关安装说明,请参阅 docs.docker.com:
在Linux上安装Compose
docker-compose
启动集群docker-compose up
_cat/nodes
请求去查看启动并运行的节点curl -X GET "localhost:9200/_cat/nodes?v=true&pretty"
日志消息进入控制台并由配置的Docker日志驱动程序处理。默认情况下,您可以使用docker logs
访问日志。
使用docker-compose down
停止集群。当您使用docker-compose up
重新启动集群时,Docker卷中的数据将被保留和加载。要在关闭集群时删除数据卷,请指定-v
选项: docker-compose down -v
。
请查看在Elasticsearch Docker容器中加密通信和在启用TLS的Docker中运行Elastic Stack。
在生产环境中在Docker中运行Elasticsearc 时,以下要求和建议适用。
vm.max_map_count
设置为至少262144
vm.max_map_count
内核设置必须至少设置为262144
才能用于生产。
您如何设置vm.max_map_count
取决于您的平台:
vm.max_map_count
设置应该在/etc/sysctl.conf
中永久设置:
grep vm.max_map_count /etc/sysctl.conf
vm.max_map_count=262144
要在实时系统上应用设置,请运行:
sysctl -w vm.max_map_count=262144
vm.max_map_count
设置必须在xhyve
虚拟机中设置:
screen ~/Library/Containers/com.docker.docker/Data/vms/0/tty
sysctl
配置vm.max_map_count
:sysctl -w vm.max_map_count=262144
Ctrl a d .
退出screen
会话vm.max_map_count
设置必须通过docker-machine
设置:
docker-machine ssh
sudo sysctl -w vm.max_map_count=262144
vm.max_map_count 设置必须在 docker-desktop 容器中设置:
wsl -d docker-desktop
sysctl -w vm.max_map_count=262144
elasticsearch
用户可读默认情况下,Elasticsearch使用uid:gid 1000:0
作为用户elasticsearch
在容器内运行。
重要:
一个例外是 Openshift,它使用任意分配的用户 ID 运行容器。
Openshift 呈现持久卷,gid 设置为 0,无需任何调整即可工作。
如果您要绑定挂载本地目录或文件,则elasticsearch
用户必须可以读取它。此外,此用户必须具有对数据和日志目录的写访问权限。一个好的策略是授予组访问本地目录的 gid 0
的权限。
例如,通过绑定挂载准备一个本地目录用于存储数据:
mkdir esdatadir
chmod g+rwx esdatadir
chgrp 0 esdatadir
作为最后的手段,您可以强制容器通过环境变量TAKE_FILE_OWNERSHIP
改变用于数据和日志目录的任何绑定安装的所有权。执行此操作时,它们将归 uid:gid 1000:0
所有,它提供对 Elasticsearch 进程所需的读/写访问权限。
增加的nofile和nproc的ulimit必须可用于Elasticsearch容器。验证Docker守护程序的初始化系统是否将它们设置为可接受的值。
要检查ulimit的 Docker守护程序默认值,请运行:
docker run --rm centos:8 /bin/bash -c 'ulimit -Hn && ulimit -Sn && ulimit -Hu && ulimit -Su'
如果需要,请在守护程序中调整它们或按容器覆盖它们。 例如,在使用docker run时,设置:
--ulimit nofile=65535:65535
为了性能和节点稳定性,需要禁用交换分区。有关执行此操作的方法的信息,请参阅禁用交换分区。
如果您设置了bootstrap.memory_lock: true
,您还需要在 Docker Daemon 中定义ulimit memlock: true
,或者为容器显式设置如示例compose文件中所示。当使用docker run
命令时,你可以指定:
-e "bootstrap.memory_lock=true" --ulimit memlock=-1:-1
该镜像暴露出TCP端口9200
和9300
。针对生产环境的集群,建议使用--publish-all
随机化已发布的端口,除非您为每个主机固定一个容器。
设置堆的大小,你可以绑定挂载一个JVM配置文件在/usr/share/elasticsearch/config/jvm.options.d
下,它包含您所需的堆大小设置。
请注意,根jvm.options
文件默认设置堆大小为1GB,任何你设置到绑定挂载的JVM配置文件中的值都将覆盖它。
虽然通过绑定安装的 JVM 选项设置堆大小是推荐的方法,但是你依然可以通过使用ES_JAVA_OPTS
环境变量来设置堆大小来配置它。例如,要使用 16 GB,请在docker run
中指定-e ES_JAVA_OPTS="-Xms16g -Xmx16g"
。请注意,虽然默认根 jvm.options 文件将默认堆设置为 1 GB,但您在ES_JAVA_OPTS
中设置的任何值都将覆盖它。上面的 docker-compose.yml 文件将堆大小设置为 512 MB。
重要
即使限制对容器的内存访问,也必须配置堆大小。
将您的开发环境固定到特定版本的 Elasticsearch Docker镜像。比如docker.elastic.co/elasticsearch/elasticsearch:7.10.2
。
出于以下原因,您应该绑定使用在/usr/share/elasticsearch/data
上的卷:
loop-lvm
模式如果您使用的是设备映射器存储驱动程序,请不要使用默认的loop-lvm
模式。 配置docker-engine
以使用direct-lvm。
考虑使用不同的日志驱动程序来集中日志。另外请注意,默认的json-file
日志驱动程序并不适合生产环境使用。
当你在Docker中运行时,Elasticsearch的配置文件是从/usr/share/elasticsearch/config/
中进行加载的。
要使用自定义的配置文件,你需要绑定挂载镜像中的配置文件。
您可以使用Docker环境变量设置单独的Elasticsearch配置参数。示例compose文件和单节点示例就是用的这个方法。
要使用文件的内容来设置环境变量,请在环境变量名称后加上_FILE
。这对于将密码等秘钥传递给Elasticsearch而不直接指定它们很有用。
例如,要从文件内容设置Elasticsearch引导程序密码,您可以绑定挂载文件并将ELASTIC_PASSWORD_FILE
环境变量设置为挂载位置。如果将密码文件挂载到/run/secrets/bootstrapPassword.txt
,请指定:
-e ELASTIC_PASSWORD_FILE=/run/secrets/bootstrapPassword.txt
您还可以覆盖镜像的默认命令以将 Elasticsearch 配置参数作为命令行选项传递。 例如:
docker run bin/elasticsearch -Ecluster.name=mynewclustername
虽然绑定挂载您的配置文件通常是生产中的首选方法,但您也可以创建一个自定义Docker镜像来包含您的配置的。
创建自定义配置文件并将它们绑定挂载到Docker镜像中的相应文件上。例如,要使用docker run
绑定挂载custom_elasticsearch.yml
,请指定:
-v full_path_to/custom_elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml
重要
该容器使用elasticsearch用户(uid:gid 1000:0)运行Elasticsearch。
绑定挂载的主机目录和文件必须可由该用户访问,并且数据和日志目录必须可由该用户写入。
默认的,Elasticsearch会自动的生成一个keystore文件来存储安全配置。此文件已经被混淆,但是未被加密。如果你想用一个密码对你的安全配置进行加密,那你必须使用elasticsearch-keystore
实用程序来创建收密码保护的keystore,并将其作为/usr/share/elasticsearch/config/elasticsearch.keystore
绑定挂载到容器。为了在启动时为 Docker 容器提供密码,请将 Docker 环境值 KEYSTORE_PASSWORD
设置为您的密码值。例如,一个docker run
命令可能包含如下配置:
-v full_path_to/elasticsearch.keystore:/usr/share/elasticsearch/config/elasticsearch.keystore
-E KEYSTORE_PASSWORD=mypassword
在某些环境中,可能准备一个包含自己定义的配置的镜像会很有用。一个最简单的实现该功能的Dockerfile
如下:
FROM docker.elastic.co/elasticsearch/elasticsearch:7.10.2
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
某些插件需要额外的安全权限。您必须通过以下方式明确接受它们:
tty
并在出现提示时允许权限。--batch
标志添加到插件安装命令来检查安全权限并接受它们(如果适用)。有关更多信息,请参阅插件管理。
您现在已经设置了一个测试的Elasticsearch环境。在开始认真的开发或使用Elasticsearch投入生产之前,您必须进行一些额外的设置: