一、前言
Elasticsearch(以下简称为ES) 是一个分布式的免费开源搜索和分析引擎,适用于包括文本、数字、地理空间、结构化和非结构化数据等在内的所有类型的数据。Elasticsearch 在 Apache Lucene 的基础上开发而成,由 Elasticsearch N.V.(即现在的 Elastic)于 2010 年首次发布。Elasticsearch 以其简单的 REST 风格 API、分布式特性、速度和可扩展性而闻名,是 Elastic Stack 的核心组件;Elastic Stack 是一套适用于数据采集、扩充、存储、分析和可视化的免费开源工具。人们通常将 Elastic Stack 称为 ELK Stack(代指 Elasticsearch、Logstash 和 Kibana),目前 Elastic Stack 包括一系列丰富的轻量型数据采集代理,这些代理统称为 Beats,可用来向 Elasticsearch 发送数据。ES的版本更新非常快,目前已经到了8.4.1,大多数企业中用的还是比较老的版本,在老版本中7.8.0以下,官方是不提供arm64架构的镜像的,而国内目前好多信创环境都要求ARM架构了,这个时候我们就要自己动手丰衣足食了。
二、制作说明
制作ES镜像的方式有两种,第一种采用rpm的方式,第二种采用tar包的方式,需要提前准备相关的安装包及配置文件,且需要在ARM架构的服务器下制作,如鲲鹏CPU-银河麒麟V10、飞腾CPU-银河麒麟V10等。
需要提前下载的文件
- elasticsearch-6.5.4.rpm安装包、elasticsearch-6.5.4.tar.gz安装包
- elasticsearch.yml配置文件
- arm64v8/centos:7的docker镜像
- sysctl.conf文件
- Dockerfile文件
- 一键制作的脚本文件
镜像准备
$ docker pull arm64v8/centos:7
三、采用rpm的方式制作ES镜像
3.1 编写elasticsearch.yml文件
#集群名称 cluster.name: elasticsearch #节点名称 node.name: es-node #数据和日志存储目录 path.data: /usr/share/elasticsearch/data path.logs: /usr/share/elasticsearch/log #内存交换的选项,官网建议为true bootstrap.memory_lock: true #网关设置,设置 host 为 0.0.0.0 ,即可启用该物理机器所有网卡网络访问 network.host: 0.0.0.0 #设置对外服务的http端口,默认为9200 http.port: 9200 #es节点之间通信的端口,默认为 9300 transport.tcp.port: 9300 #解决跨域问题 http.cors.enabled: true http.cors.allow-origin: "*" #xpack组件关闭 (x-pack不支持linux-aarch64) xpack.ml.enabled: false
3.2 编写sysctl.conf文件
vm.max_map_count=655360
3.3 编写Dockerfile文件
FROM xiaohezi/centos7:jdk1.8 MAINTAINER xiaohezi USER es WORKDIR /usr/share/elasticsearch VOLUME ["/usr/share/elasticsearch/data","/usr/share/elasticsearch/log"] CMD ["/usr/share/elasticsearch/bin/elasticsearch"] EXPOSE 9200 9300
3.4 编写一键制作的脚本文件build-elasticsearch-rpm.sh
#!/bin/bash ############################################################### # 作者:何昌涛 # 脚本名:build-elasticsearch-rpm.sh # 时间:2022-09-14 # 功能描述:arm64-v8-elasticsearch6.5.4镜像制作脚本 ############################################################### cd `dirname $0` SH_PATH=`pwd` BASE_PATH=${SH_PATH%/*} echo "" echo "" echo "#########################################################" echo "# 在线拉取arm64v8/centos:7镜像并启动 -- 开始 #" echo "#########################################################" docker run --privileged -it -d --name centos01 arm64v8/centos:7 /usr/sbin/init echo "#########################################################" echo "# 在线拉取arm64v8/centos:7镜像并启动 -- 结束 #" echo "#########################################################" echo "" echo "" echo "#########################################################" echo "# 进入容器,并下载相关依赖 -- 开始 #" echo "#########################################################" #进入容器 docker exec -i centos01 bash << EOF #下载相关依赖 yum install -y java-1.8.0-openjdk yum install -y unzip yum install -y net-tools yum install -y sudo yum install -y vim exit EOF echo "#########################################################" echo "# 进入容器,并下载相关依赖 -- 结束 #" echo "#########################################################" echo "" echo "" echo "#########################################################" echo "# 向容器中拷贝es安装包以及es依赖配置文件 -- 开始 #" echo "#########################################################" docker cp ./elasticsearch-6.5.4.rpm centos01:/usr/local/src/ docker cp ./sysctl.conf centos01:/etc/ echo "#########################################################" echo "# 向容器中拷贝es安装包以及es依赖配置文件 -- 结束 #" echo "#########################################################" echo "" echo "" echo "#########################################################" echo "# 进入容器安装es并修改es依赖配置文件 -- 开始 #" echo "#########################################################" #进入容器 docker exec -i centos01 bash << EOF #rpm方式安装es cd /usr/local/src/ && rpm -ivh elasticsearch-6.5.4.rpm --nodeps --force #新建用户 useradd es #赋予权限 chown -R es:es /etc/elasticsearch/ chown -R es:es /usr/share/elasticsearch/ chown -R es:es /usr/lib/systemd/system/elasticsearch.service chown -R es:es /etc/sysconfig/elasticsearch chown -R es:es /var/lib/elasticsearch chown -R es:es /var/log/elasticsearch mkdir -p /data/elasticsearch/data && mkdir /data/elasticsearch/log chown -R es:es /data && chown -R es:es /data/elasticsearch #修改/etc/sysctl.conf文件中的参数,并使生效 sysctl -p #修改/etc/security/limits.conf文件中的参数 echo "* soft nofile 65536" >> /etc/security/limits.conf echo "* hard nofile 131072" >> /etc/security/limits.conf echo "* soft nproc 2048" >> /etc/security/limits.conf echo "* hard nproc 4096" >> /etc/security/limits.conf #配置es服务 sudo systemctl daemon-reload #将es设置为开机自启动 systemctl enable elasticsearch.service exit EOF echo "#########################################################" echo "# 进入容器安装es并修改es依赖配置文件 -- 结束 #" echo "#########################################################" echo "" echo "" echo "#########################################################" echo "# 制作xiaohezi/centos7:jdk1.8镜像 -- 开始 #" echo "#########################################################" docker commit -a "xiaohezi" centos01 xiaohezi/centos7:jdk1.8 echo "#########################################################" echo "# 制作xiaohezi/centos7:jdk1.8镜像 -- 结束 #" echo "#########################################################" echo "" echo "" echo "#########################################################" echo "#利用Dockerfile制作arm64/elasticsearch:6.5.4镜像--开始 #" echo "#########################################################" docker build -f ./rpm/Dockerfile -t arm64/elasticsearch:6.5.4 . echo "#########################################################" echo "#利用Dockerfile制作arm64/elasticsearch:6.5.4镜像--结束 #" echo "#########################################################"
3.5 完整目录
3.6 一键制作镜像
$ ./build-elasticsearch-rpm.sh
四、采用tar包的方式制作ES镜像
4.1 编写elasticsearch.yml文件
#集群名称 cluster.name: elasticsearch #节点名称 node.name: es-node #数据和日志存储目录 path.data: /usr/share/elasticsearch/data path.logs: /usr/share/elasticsearch/log #内存交换的选项,官网建议为true bootstrap.memory_lock: true #网关设置,设置 host 为 0.0.0.0 ,即可启用该物理机器所有网卡网络访问 network.host: 0.0.0.0 #设置对外服务的http端口,默认为9200 http.port: 9200 #es节点之间通信的端口,默认为 9300 transport.tcp.port: 9300 #解决跨域问题 http.cors.enabled: true http.cors.allow-origin: "*" #xpack组件关闭 (x-pack不支持linux-aarch64) xpack.ml.enabled: false
4.2 编写sysctl.conf文件
vm.max_map_count=655360
4.3 编写Dockerfile文件
FROM xiaohezi/centos7:jdk1.8 ENV VERSION=6.5.4 MAINTAINER xiaohezi COPY ./elasticsearch-${VERSION}.tar.gz /usr/local RUN cd /usr/local && tar zxvf elasticsearch-${VERSION}.tar.gz && rm -f elasticsearch-${VERSION}.tar.gz RUN mkdir -p /data/elasticsearch/data && mkdir /data/elasticsearch/log ADD ./elasticsearch.yml /usr/local/elasticsearch-${VERSION}/config/elasticsearch.yml RUN useradd es RUN chown -R es:es /usr/local/elasticsearch-${VERSION}/ && chown -R es:es /data USER es #WORKDIR指令用于指定容器的一个目录, 容器启动时执行的命令会在该目录下执行 WORKDIR /usr/local/elasticsearch-${VERSION} #目录就会在运行时自动挂载为匿名卷,任何向/data/elasticsearch/data中写入的信息都不会记录进容器存储层,从而保证了容器存储层的无状态化 VOLUME ["/data/elasticsearch/data","/data/elasticsearch/log"] #CMD用于设置默认执行的命令 CMD ["/usr/local/elasticsearch-6.5.4/bin/elasticsearch"] EXPOSE 9200 9300
4.4 编写一键制作的脚本文件build-elasticsearch.sh
#!/bin/bash ############################################################### # 作者:何昌涛 # 脚本名:build-elasticsearch.sh # 时间:2022-09-14 # 功能描述:arm64-v8-elasticsearch6.5.4镜像制作脚本 ############################################################### cd `dirname $0` SH_PATH=`pwd` BASE_PATH=${SH_PATH%/*} echo "" echo "" echo "#########################################################" echo "# 在线拉取arm64v8/centos:7镜像并启动 -- 开始 #" echo "#########################################################" docker run --privileged -it -d --name centos01 arm64v8/centos:7 /usr/sbin/init echo "#########################################################" echo "# 在线拉取arm64v8/centos:7镜像并启动 -- 结束 #" echo "#########################################################" sleep 10s echo "" echo "" echo "#########################################################" echo "# 进入容器,并下载相关依赖 -- 开始 #" echo "#########################################################" #进入容器 docker exec -i centos01 bash << EOF yum install -y java-1.8.0-openjdk yum install -y unzip yum install -y net-tools yum install -y sudo exit EOF sleep 10s echo "#########################################################" echo "# 进入容器,并下载相关依赖 -- 结束 #" echo "#########################################################" echo "" echo "" echo "#########################################################" echo "# 向容器中拷贝es安装包以及es依赖配置文件 -- 开始 #" echo "#########################################################" docker cp ./sysctl.conf centos01:/etc/ echo "#########################################################" echo "# 向容器中拷贝es安装包以及es依赖配置文件 -- 结束 #" echo "#########################################################" echo "" echo "" echo "#########################################################" echo "# 进入容器并修改es依赖配置文件 -- 开始 #" echo "#########################################################" #进入容器 docker exec -i centos01 bash << EOF #修改/etc/sysctl.conf文件中的参数,并使生效 sysctl -p #修改/etc/security/limits.conf文件中的参数 echo "* soft nofile 65536" >> /etc/security/limits.conf echo "* hard nofile 131072" >> /etc/security/limits.conf echo "* soft nproc 2048" >> /etc/security/limits.conf echo "* hard nproc 4096" >> /etc/security/limits.conf exit EOF echo "#########################################################" echo "# 进入容器并修改es依赖配置文件 -- 结束 #" echo "#########################################################" echo "" echo "" echo "#########################################################" echo "# 制作xiaohezi/centos7:jdk1.8镜像 -- 开始 #" echo "#########################################################" docker commit -a "xiaohezi" centos01 xiaohezi/centos7:jdk1.8 echo "#########################################################" echo "# 制作xiaohezi/centos7:jdk1.8镜像 -- 结束 #" echo "#########################################################" echo "" echo "" echo "#########################################################" echo "#利用Dockerfile制作arm64/elasticsearch:6.5.4镜像--开始 #" echo "#########################################################" docker build -f ./Dockerfile -t arm64/elasticsearch:6.5.4 . echo "#########################################################" echo "#利用Dockerfile制作arm64/elasticsearch:6.5.4镜像--结束 #" echo "#########################################################"
注:上面是通过脚本的方式,对容器进行环境初始化,然后再将容器制作成镜像,当然这部分也可以用Dockerfile来完成。推荐使用Dockerfile来构建镜像。
4.5 完整目录结构
4.6 一键制作镜像
$ ./build-elasticsearch.sh
五、优化
5.1 基础镜像的选择 (FROM)
基本原则
- 官方镜像优于非官方的镜像,如果没有官方镜像,则尽量选择Dockerfile开源的
- 固定版本tag而不是每次都使用latest
- 尽量选择体积小的镜像(同一个版本,不同的TAG,其镜像大小也不一样)
示例1:拉取nginx两个TAG的镜像
$ docker pull nginx:1.21.4-alpine $ docker pull nginx:1.21.4
通过docker images nginx 查看镜像
$ docker images nginx REPOSITORY TAG IMAGE ID CREATED SIZE nginx 1.21.4 ea335eea17ab 4 days ago 141MB nginx 1.21.4-alpine b46db85084b8 9 days ago 23.2MB
注:通过上面可以看到同样的版本,不同的TAG,其大小相差很多。这和构建镜像时采用的基础镜像体积大小有关。比如nginx:1.21.4-alpine构建基础镜像时采用的是alpine这个linux作为基础镜像,alpine linux本身就非常小。当然由于体积小,将来可能安装某些软件就比较麻烦,所以适合自己的才是最好的。
5.2 镜像的大小和分层
每一行的RUN命令都会产生一层image layer,这样会导致镜像的臃肿。如上面tar方式制作镜像Dockerfile有4个RUN,就会有4层。
如下改进版Elasticsearch的Dockerfile
FROM pkulaw/centos7:jdk1.8 ENV VERSION=6.5.4 MAINTAINER xiaohezi COPY ./elasticsearch-${VERSION}.tar.gz /usr/local RUN cd /usr/local && tar zxvf elasticsearch-${VERSION}.tar.gz && \ rm -f elasticsearch-${VERSION}.tar.gz && \ mkdir -p /data/elasticsearch/data && \ mkdir -p /data/elasticsearch/log && \ useradd es && \ chown -R es:es /usr/local/elasticsearch-${VERSION}/ && \ chown -R es:es /data ADD ./elasticsearch.yml /usr/local/elasticsearch-${VERSION}/config/elasticsearch.yml USER es #WORKDIR指令用于指定容器的一个目录, 容器启动时执行的命令会在该目录下执行 WORKDIR /usr/local/elasticsearch-${VERSION} #目录就会在运行时自动挂载为匿名卷,任何向/data/elasticsearch/data中写入的信息都不会记录进容器存储层,从而保证了容器存储层的无状态化 VOLUME ["/data/elasticsearch/data","/data/elasticsearch/log"] #CMD用于设置默认执行的命令 CMD ["/usr/local/elasticsearch-6.5.4/bin/elasticsearch"] EXPOSE 9200 9300
通过改进,只有一个RUN,只有一层。
六、预告
下篇我们来排一排Dockerfile完全指南,包含文件复制和目录操作、构建参数和环境变量 (ARG vs ENV)、CMD 和ENTRYPOINT命令、合理使用缓存以及合理使用 .dockerignore等内容,敬请期待!