前言

今天在公司的linux机器上需要安装es,但是部署过程出现了一点问题,以此记录下

部署流程

1、下载es的镜像,查看dockerhub选择自己需要安装的版本,笔者选择的是7.8.1
docker pull elasticsearch:7.8.1
2、启动容器
es的文件和日志需要挂载到宿主机
所以执行

docker run -p 9200:9200 -p 9300:9300 --name elasticsearch \
   -e "discovery.type=single-node" \
   -v /1/logs:/usr/share/elasticsearch/logs \
   -v /1/data:/usr/share/elasticsearch/data \
   -d elasticsearch:7.8.1

其中discovery.type设置为单机模式,不使用集群,集群模式则需要配置es的配置文件,否则会报错
启动后查看镜像并没有起来
docker ps -a

查看日志docker logs -f 容器id,发现异常日志

Error opening log file ‘logs/gc.log’: Permission denied

这里的网上查询到的解决方法有两种
1、设置挂载目录/1/logs和/1/data的权限,chmod 777 /1/logs和chmod 777 /1/data
2、笔者使用的是公司的腾讯云,并没有直接操作宿主机的权限,所以才有第二种方式,第二种方式的原理是es镜像在启动命令中帮我们提供了扩展方式
通过查看es的镜像制作脚本可以发现启动命令执行的脚本如下
在这里插入图片描述
当我们不设置挂载时可以进入容器看到脚本文件为

if [[ "$(id -u)" == "0" ]]; then
	  # If requested and running as root, mutate the ownership of bind-mounts
		  if [[ -n "$TAKE_FILE_OWNERSHIP" ]]; then
		    chown -R 1000:0 /usr/share/elasticsearch/{data,logs}
		  fi
	   fi

即当我们设置环境变量TAKE_FILE_OWNERSHIP为true后启动时会执行命令
chown -R 1000:0 /usr/share/elasticsearch/{data,logs}
即设置data和logs目录的所有者为1000,1000所对应的用户名即为elasticsearch,
elasticsearch用户具有最大权限

[root@iZbp1e2l6djkne6mrwk17pZ 1]# docker ps -a
CONTAINER ID        IMAGE                    COMMAND                  CREATED             STATUS              PORTS                                            NAMES
abe72f02bff3        elasticsearch:7.8.1      "/tini -- /usr/loc..."   16 minutes ago      Up 16 minutes       0.0.0.0:9200->9200/tcp, 0.0.0.0:9300->9300/tcp   elasticsearch
cbbf28ba9abf        docker.io/mysql:5.7.29   "docker-entrypoint..."   7 months ago        Up 2 months         0.0.0.0:3306->3306/tcp, 33060/tcp                whqmysql
[root@iZbp1e2l6djkne6mrwk17pZ 1]# docker exec -it ab /bin/bash
[root@abe72f02bff3 elasticsearch]# id 1000
uid=1000(elasticsearch) gid=1000(elasticsearch) groups=1000(elasticsearch),0(root)

[root@abe72f02bff3 elasticsearch]# ll           
total 588
-rw-r--r--  1 elasticsearch root  13675 Jul 21 16:38 LICENSE.txt
-rw-r--r--  1 elasticsearch root 544318 Jul 21 16:42 NOTICE.txt
-rw-r--r--  1 elasticsearch root   8165 Jul 21 16:38 README.asciidoc
drwxr-xr-x  2 elasticsearch root   4096 Jul 21 16:45 bin
drwxrwxr-x  1 elasticsearch root   4096 Oct 12 14:24 config
drwxr-xr-x  3 elasticsearch root   4096 Oct 12 14:17 data
drwxr-xr-x  1 elasticsearch root   4096 Jul 21 16:43 jdk
drwxr-xr-x  3 elasticsearch root   4096 Jul 21 16:43 lib
drwxr-xr-x  2 elasticsearch root   4096 Oct 12 14:24 logs
drwxr-xr-x 47 elasticsearch root   4096 Jul 21 16:44 modules
drwxr-xr-x  2 elasticsearch root   4096 Jul 21 16:42 plugins

从而使容器内具有操作宿主机挂载目录的权限

修改启动命令为

docker run -p 9200:9200 -p 9300:9300 --name elasticsearch \
   -e "discovery.type=single-node" \
   -e "TAKE_FILE_OWNERSHIP=true" \
   -v /1/logs:/usr/share/elasticsearch/logs \
   -v /1/data:/usr/share/elasticsearch/data \
   -d elasticsearch:7.8.1

启动后依然启动失败,查看日志发现

OpenJDK 64-Bit Server VM warning: INFO: os::commit_memory(0x00000000c0000000, 1073741824, 0) 
failed; error='Not enough space' (errno=12)

没有足够的内存了,需要的是1g内存

这里es同样提供我们在启动时提供环境变量设置,修改命令为

docker run -p 9200:9200 -p 9300:9300 --name elasticsearch \
   -e "discovery.type=single-node" \
   -e "ES_JAVA_OPTS=-Xms300m -Xmx300m" \
   -e "TAKE_FILE_OWNERSHIP=true" \
   -v /1/logs:/usr/share/elasticsearch/logs \
   -v /1/data:/usr/share/elasticsearch/data \
   -d elasticsearch:7.8.1

至此,es启动成功,访问http://ip:9200可以返回一些额外信息

Logo

更多推荐