如何制作ARM64v8的Elasticsearch镜像

本文涉及的产品
检索分析服务 Elasticsearch 版,2核4GB开发者规格 1个月
简介: 在信创环境下一键制作arm64v8-elasticsearch6.5.4镜像。

一、前言


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等内容,敬请期待!

相关实践学习
使用阿里云Elasticsearch体验信息检索加速
通过创建登录阿里云Elasticsearch集群,使用DataWorks将MySQL数据同步至Elasticsearch,体验多条件检索效果,简单展示数据同步和信息检索加速的过程和操作。
ElasticSearch 入门精讲
ElasticSearch是一个开源的、基于Lucene的、分布式、高扩展、高实时的搜索与数据分析引擎。根据DB-Engines的排名显示,Elasticsearch是最受欢迎的企业搜索引擎,其次是Apache Solr(也是基于Lucene)。 ElasticSearch的实现原理主要分为以下几个步骤: 用户将数据提交到Elastic Search 数据库中 通过分词控制器去将对应的语句分词,将其权重和分词结果一并存入数据 当用户搜索数据时候,再根据权重将结果排名、打分 将返回结果呈现给用户 Elasticsearch可以用于搜索各种文档。它提供可扩展的搜索,具有接近实时的搜索,并支持多租户。
相关文章
|
9月前
|
Docker 容器
x86 平台利用 qemu-user-static 实现 arm64 平台 docker 镜像的运行和构建
x86 平台利用 qemu-user-static 实现 arm64 平台 docker 镜像的运行和构建
895 1
|
3月前
|
消息中间件 存储 Apache
MQ产品使用合集之有RocketMQ arm架构的镜像吗
消息队列(MQ)是一种用于异步通信和解耦的应用程序间消息传递的服务,广泛应用于分布式系统中。针对不同的MQ产品,如阿里云的RocketMQ、RabbitMQ等,它们在实现上述场景时可能会有不同的特性和优势,比如RocketMQ强调高吞吐量、低延迟和高可用性,适合大规模分布式系统;而RabbitMQ则以其灵活的路由规则和丰富的协议支持受到青睐。下面是一些常见的消息队列MQ产品的使用场景合集,这些场景涵盖了多种行业和业务需求。
254 1
|
JavaScript Linux 程序员
自己动手制作elasticsearch-head的Docker镜像
官方的elasticsearch-head的Docker镜像目前只支持到elasticsearch5.x版本,本文帮助大家掌握head插件镜像的制作方法,做出各种适合自己的版本
550 2
自己动手制作elasticsearch-head的Docker镜像
|
Oracle Java 关系型数据库
ARM架构下的Docker环境,OpenJDK官方没有8版本镜像,如何完美解决?
ARM处理器环境下,想把Java应用运行在Docker环境,首先要找好基础镜像,如果您的Java应用是基于JDK8版本,就会面临找不到8版本JDK镜像的问题,本文就来解决此问题
915 0
ARM架构下的Docker环境,OpenJDK官方没有8版本镜像,如何完美解决?
|
Oracle Java 关系型数据库
ARM64架构下,OpenJDK的官方Docker镜像为何没有8版本?
在树莓派或者其他ARM架构的环境中(例如华为的泰山ARM服务器),能否在Docker环境下成功运行Java应用,Jdk镜像是首要面临的挑战
589 0
ARM64架构下,OpenJDK的官方Docker镜像为何没有8版本?
|
NoSQL JavaScript Shell
arm64 环境利用 docker 编译 redis filebeat airflow hue 以及 alertmanager 镜像
arm64 环境利用 docker 编译 redis filebeat airflow hue 以及 alertmanager 镜像
464 0
|
Java 程序员 Linux
自己动手制作elasticsearch的ik分词器的Docker镜像
本文制作出集成了ik分词器的elasticsearch镜像,这样每个容器运行的时都自带了ik分词器
528 0
自己动手制作elasticsearch的ik分词器的Docker镜像
|
1天前
|
数据可视化 Docker 容器
一文教会你如何通过Docker安装elasticsearch和kibana 【详细过程+图解】
这篇文章提供了通过Docker安装Elasticsearch和Kibana的详细过程和图解,包括下载镜像、创建和启动容器、处理可能遇到的启动失败情况(如权限不足和配置文件错误)、测试Elasticsearch和Kibana的连接,以及解决空间不足的问题。文章还特别指出了配置文件中空格的重要性以及环境变量中字母大小写的问题。
一文教会你如何通过Docker安装elasticsearch和kibana 【详细过程+图解】
|
1天前
|
JSON 自然语言处理 数据库
Elasticsearch从入门到项目部署 安装 分词器 索引库操作
这篇文章详细介绍了Elasticsearch的基本概念、倒排索引原理、安装部署、IK分词器的使用,以及如何在Elasticsearch中进行索引库的CRUD操作,旨在帮助读者从入门到项目部署全面掌握Elasticsearch的使用。
10 0