安装前问题:
- 数据存在哪?
- 配置文件存在哪?
- 如果删除了容器,配置文件/数据怎么保留下来?
- es很耗内存,怎么做限制?
- 怎么实现容器内数据和宿主机数据同步?
- 如何实现es集群,怎么用DockerFile实现一键部署集群?
1. 安装
- 进入docker商店,选择需要的版本;
https://hub.docker.com/_/elasticsearch - 执行命令下载镜像;
quxianglin@quxianglin-PC:~$ docker pull elasticsearch:7.13.1 7.13.1: Pulling from library/elasticsearch 7a0437f04f83: Pull complete 4f39cdc68a09: Pull complete 64236e0195a6: Pull complete 5a43a6ed4a9b: Pull complete
- 启动镜像:
可以参考官网的文档:https://www.elastic.co/guide/en/elasticsearch/reference/7.13/docker.html
这篇文章写的很详细,有单机配置的,有集群配置的;
- 配置单机使用,参数:-e “discovery.type=single-node”
- 使用Docker Compose启动多节点群集,查找这一段:
- 同步配置文件到宿主机:
命令:-v full_path_to/custom_elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml
- 配置单机使用,参数:-e “discovery.type=single-node”
2. 我的容器配置:
docker run -d -p 9200:9200 -p 9300:9300 --name es01 -e ES_JAVA_OPTS="-Xms256m -Xmx256m" -v /usr/local/docker/es01/config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml -v /usr/local/docker/es01/data:/usr/share/elasticsearch/data -e "discovery.type=single-node" elasticsearch:7.13.1
配置详解:
docker run -d -p 9200:9200 -p 9300:9300 --name es01 -e ES_JAVA_OPTS="-Xms256m -Xmx256m" -v /usr/local/docker/es01/config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml -v /usr/local/docker/es01/data:/usr/share/elasticsearch/data -e “discovery.type=single-node” elasticsearch:7.13.1
-d:是在后台运行;
-p 9200:9200 -p 9300:9300:将容器的9200映射到宿主机的9200端口,第一个9200是宿主机的端口,第二个9200是容器的端口;
–name es01:将容器别名为es01;
-e ES_JAVA_OPTS="-Xms256m -Xmx256m":设置容器需要的java最小内存和最大内存;
-v /usr/local/docker/es01/config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml:将宿主机上的/usr/local/docker/es01/config/elasticsearch.yml同步到容器的/usr/share/elasticsearch/config/elasticsearch.yml;
-v /usr/local/docker/es01/data:/usr/share/elasticsearch/data:将宿主机上的/usr/local/docker/es01/data同步到容器的/usr/share/elasticsearch/data;
-e “discovery.type=single-node” :设置成单机配置;
3. 容器结构:
quxianglin@quxianglin-PC:~$ docker exec -it es01 /bin/bash
[root@bfeb8a67d6d9 elasticsearch]# ls ## 总的目录
LICENSE.txt NOTICE.txt README.asciidoc bin config data jdk lib logs modules plugins
[root@bfeb8a67d6d9 elasticsearch]# cd bin ## bin目录的内容
[root@bfeb8a67d6d9 bin]# ls
elasticsearch elasticsearch-keystore elasticsearch-sql-cli
elasticsearch-certgen elasticsearch-migrate elasticsearch-sql-cli-7.13.1.jar
elasticsearch-certutil elasticsearch-node elasticsearch-syskeygen
elasticsearch-cli elasticsearch-plugin elasticsearch-users
elasticsearch-croneval elasticsearch-saml-metadata x-pack-env
elasticsearch-env elasticsearch-service-tokens x-pack-security-env
elasticsearch-env-from-file elasticsearch-setup-passwords x-pack-watcher-env
elasticsearch-geoip elasticsearch-shard
[root@bfeb8a67d6d9 bin]# cd ..
[root@bfeb8a67d6d9 elasticsearch]# cd config
[root@bfeb8a67d6d9 config]#
[root@bfeb8a67d6d9 config]# ls ## config文件的目录结构
elasticsearch.keystore jvm.options log4j2.file.properties role_mapping.yml users
elasticsearch.yml jvm.options.d log4j2.properties roles.yml users_roles
[root@bfeb8a67d6d9 config]# cd .. ## 返回
[root@bfeb8a67d6d9 elasticsearch]# cd data
[root@bfeb8a67d6d9 data]# ls ## data目录结构
nodes
[root@bfeb8a67d6d9 data]# cd nodes
[root@bfeb8a67d6d9 nodes]# ls
0
[root@bfeb8a67d6d9 nodes]# cd ..
[root@bfeb8a67d6d9 data]# cd ..
[root@bfeb8a67d6d9 elasticsearch]# cd ..
[root@bfeb8a67d6d9 share]# cd ..
[root@bfeb8a67d6d9 usr]# cd ..
[root@bfeb8a67d6d9 /]# cd ..
4. 复制文件
## 复制配置文件
quxianglin@quxianglin-PC:~$ docker cp es01:/usr/share/elasticsearch/config/elasticsearch.yml /usr/local/docker/es01/config/elasticsearch.yml
open /usr/local/docker/es01/config/es01_elasticsearch.yml: permission denied
quxianglin@quxianglin-PC:~$ sudo chmod -R 777 /usr/local/docker/
请输入密码
[sudo] quxianglin 的密码:
验证成功
quxianglin@quxianglin-PC:~$ docker cp es01:/usr/share/elasticsearch/config/elasticsearch.yml /usr/local/docker/es01/config/es01_elasticsearch.yml
quxianglin@quxianglin-PC:~$
## 复制数据文件
quxianglin@quxianglin-PC:~$ docker cp es01:/usr/share/elasticsearch/data /usr/local/docker/es01/data
quxianglin@quxianglin-PC:~$
5. 常见错误:
- 错误:
/merged/usr/share/elasticsearch/config/elasticsearch.yml\" caused \“not a directory\”"": unknown: Are you trying to mount a directory onto a file (or vice-versa)? Check if the specified host path exists and is the expected type.
原因分析:在同步配置文件到宿主机时,宿主机上没有elasticsearch.yml文件;宿主机默认会创建一个elasticsearch.yml文件夹,导致文件夹和文件对应不上,这个文档也说过(https://blog.youkuaiyun.com/u013958151/article/details/103093616);
这是一个常见的错误,第一次在配置的时候基本上都会遇到,正确的做法是:先在宿主机的对应目录下新建一个elasticsearch.yml文件,并且内容不能错误,不能影响容器正常启动,因为容器就是根据宿主机上的这个配置文件运行的;
6. 问题解答
安装前问题:
- 数据存在哪?
- 配置文件存在哪?
- 如果删除了容器,配置文件/数据怎么保留下来?
- es很耗内存,怎么做限制?
- 怎么实现容器内数据和宿主机数据同步?
上面已经解答了这几个问题,可以使用卷技术将配置文件和数据文件同步到宿主机上,因为是复制同步,因此删除容器,不会对宿主机的文件产生影响,再次创建容器,默认会加载宿主机上的配置文件和数据文件;
经测试没有问题; - 如何实现es集群,怎么用DockerFile实现一键部署集群?
7. 所有命令
-
先构建一个容器,将里面需要持久化的配置文件和数据库文件/文件夹拷贝出来,方便映射,不然程序跑不起来;
docker run -d -p 9200:9200 -p 9300:9300 --name es01 -e “discovery.type=single-node” elasticsearch:7.13.1
-
将容器内的配置文件和数据库文件/文件夹拷贝出来
docker cp es01:/usr/share/elasticsearch/config/elasticsearch.yml /usr/local/docker/es01/config/elasticsearch.yml
docker cp es01:/usr/share/elasticsearch/data /usr/local/docker/es01/data
-
删除容器,重新构建带配置关系的容器
docker rm -f es01
docker run -d -p 9200:9200 -p 9300:9300 --name es01 -e ES_JAVA_OPTS="-Xms256m -Xmx256m" -v /usr/local/docker/es01/config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml -v /usr/local/docker/es01/data:/usr/share/elasticsearch/data -e “discovery.type=single-node” elasticsearch:7.13.1