安装

说明

Elasticsearch 是用 Java 编写的,但是呢,我们可以不用安装 JDK,因为 ES 里面自带了 JDK,当然我们也能把 ES 自带的 JDK 替换成我们自己的 JDK。参考 Set up Elasticsearchopen in new window

Docker 安装 ES

拉取镜像:

docker pull elasticsearch:7.17.9

创建挂载目录:

cd /mnt
mkdir -p elasticsearch/data && mkdir -p elasticsearch/config && mkdir -p elasticsearch/plugins && mkdir -p elasticsearch/logs
chmod -R 777 elasticsearch/

修改配置:

# 允许任何机器访问 ES
echo "http.host: 0.0.0.0" >> elasticsearch/config/elasticsearch.yml

启动 ES:

docker run --name es01 -p 9200:9200 -p 9300:9300 \
  -e "discovery.type=single-node" \
  -e ES_JAVA_OPTS="-Xms128m -Xmx256m" \
  -v /mnt/elasticsearch/config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml \
  -v /mnt/elasticsearch/data:/usr/share/elasticsearch/data \
  -v /mnt/elasticsearch/plugins:/usr/share/elasticsearch/plugins \
  -v /mnt/elasticsearch/logs:/usr/share/elasticsearch/logs \
  -d elasticsearch:7.17.9

开放 9200、9300 端口:

firewall-cmd --zone=public --add-port=9200/tcp --add-port=9300/tcp --permanent
firewall-cmd --reload

然后访问 http://localhost:9200 即可。

权限问题

启动 ES 可能会报如下错误:

Caused by: java.nio.file.AccessDeniedException: /usr/share/elasticsearch/data/nodes

解决办法如下:

# 把宿主机的挂载目录授权为 rwx
chmod -R 777 /mnt/elasticsearch

# 重启 ES 容器
docker restart es01
无法访问 9200 端口

按理来说,经过上面的配置之后,应该是可以访问 9200 端口了。按照我以往的做法,在腾讯云的安全组添加了规则,并且服务器放开了 9200 端口,然后重新加载防火墙就行了,但是呢,这一次,我失败了。最终,参考了以下两篇博客来解决我的问题:
centos7 增加防火墙规则后,端口仍无法访问问open in new window
CentOS7, CentOS8 firewalld docker 端口映射问题,firewall开放端口后,还是不能访问,解决方案open in new window

上面的第二种方式解决了我的问题,但是,我还是重启了防火墙才解决的:

systemctl restart firewalld

为什么我判断是端口不通呢?因为 docker 启动 ES 后,我查看了 ES 的日志,没有报错,并且直接在服务器上使用 curl http://localhost:9200 是能够访问的,使用 telnet 后,发现 9200 端口确实不通。

Docker 安装 Kibana

经过上面的步骤,完成了 ES 的安装,其实就已经能够操作 ES 了。ES 支持使用 http 的方式进行操作,所以用 Postman 也是一样的,只不过 Kibana 会有一些命令提示而已。Kibana 安装如下:

docker pull kibana:7.17.9
docker run --name kibana1 -e ELASTICSEARCH_HOSTS=http://xxx:9200 -p 5601:5601 -d kibana:7.17.9

开放 5601 端口:

firewall-cmd --zone=public --add-port=5601/tcp --permanent
firewall-cmd --reload

启动后,访问 http://localhost:5601 即可。

Kibana 无法访问 ES

在上面的示例中,我添加了环境变量 ELASTICSEARCH_HOSTS 去运行 Kibana,当 Kibana 启动后,我尝试访问 localhost:5601,发现一直都提示 Kibana server is not ready yet。于是,我使用 docker ps 查看容器是否启动了,发现 Kibana 是启动的,然后使用 docker logs kibana1 查看日志,发现了如下信息:

{"type":"log","@timestamp":"2023-04-05T08:43:15+00:00","tags":["error","elasticsearch-service"],"pid":7,"message":"Unable to retrieve version information from Elasticsearch nodes. Request timed out"}

从报错来看,好像是连不上 ES。咋回事儿呢,我是按照官方文档open in new window中的例子来启动的呀。并且,文档中已经说的很明白了 These settings are defined in the default kibana.yml. They can be overridden with a custom kibana.yml or via environment variables.

进入 kibana1 这个容器看下:

docker exec -it kibana1 /bin/bash
pwd
cd config
cat kibana.yml

kibana.yml 中发现了如下内容:

#
# ** THIS IS AN AUTO-GENERATED FILE **
#

# Default Kibana configuration for docker target
server.host: "0.0.0.0"
server.shutdownTimeout: "5s"
elasticsearch.hosts: [ "http://elasticsearch:9200" ]

好家伙,看来 ELASTICSEARCH_HOSTS 这个环境变量没生效。那就只能自己挂载 kibana 的配置文件了,操作如下。

mkdir -p /mnt/kibana
docker cp kibana1:/usr/share/kibana/config/ /mnt/kibana
docker stop kibana1
docker rm kibana1

修改配置文件:

vim /mnt/kibana/config/kibana.yml
server.host: "0.0.0.0"
server.shutdownTimeout: "5s"
elasticsearch.hosts: [ "http://我的公网IP:9200" ]
monitoring.ui.container.elasticsearch.enabled: true

启动 Kibana:

docker run -d --name kibana1 -p 5601:5601 -v /usr/local/myapp/data/kibana/config:/usr/share/kibana/config kibana:7.17.9

但是呢,启动之后还是无法访问。最终,我把 elasticsearch.hosts 修改成了 Docker 分配的 IP 地址,然后就可以了。如下:

# 查看 es 的 IP 地址
docker inspect es01 | grep -i ipaddr
vim /mnt/kibana/config/kibana.yml
# 修改 kibana.yml
elasticsearch.hosts: http://172.17.0.2:9200
# 重启 Kibana
docker restart kibana1

当然,还有一种方式,可以使 ES 和 Kibana 处于同一个网卡,这样也能解决 Kibana 无法访问 ES 的问题。按照下面的方式来操作:

  • 创建网络 mynet1

    docker network create \
      --driver=bridge \
      --subnet=172.28.0.0/16 \
      --gateway=172.28.5.254 \
      mynet1
    
  • 创建 kibana.yml

    vim /usr/local/djfapp/data/kibana/kibana.yml
    
    # 添加以下内容(请换成自己服务器的 IP)
    server.name: kibana
    server.host: "0"
    elasticsearch.hosts: [ "http://1.15.181.57:9200" ]
    xpack.monitoring.ui.container.elasticsearch.enabled: true
    
  • 使用自定义网络启动 ES

    docker run --name es01 -p 9200:9200 -p 9300:9300 \
      --net mynet1 \
      -e "discovery.type=single-node" \
      -e ES_JAVA_OPTS="-Xms64m -Xmx128m" \
      -v /usr/local/djfapp/data/elasticsearch/conf/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml \
      -v /usr/local/djfapp/data/elasticsearch/data:/usr/share/elasticsearch/data \
      -v /usr/local/djfapp/data/elasticsearch/plugins:/usr/share/elasticsearch/plugins \
      -d elasticsearch:7.17.9
    
  • 使用自定义网络启动 Kibana

    docker run --name kib01 --net mynet1 \
      -p 5601:5601 \
      -v /usr/local/djfapp/data/kibana/kibana.yml:/usr/share/kibana/config/kibana.yml \
      -e "ELASTICSEARCH_HOSTS=http://1.15.181.57:9200" \
      -d kibana:7.17.9