数据库

Elasticsearch 和 kibana 安装

安装elasticsearch


  • 拉取 Elasticsearch镜像(注意需要翻墙)
docker pull elasticsearch:7.14.1
  • 创建 network
docker network create elastic

Docker 支持多种网络模式,默认使用 bridge 网络(通过 docker0 虚拟网卡实现容器间通信)。但在复杂场景下,默认网络存在以下问题:

  1. 容器名不可直接访问:默认网络中,容器只能通过 IP 地址互相访问,难以记忆和维护。
  2. 隔离性不足:所有容器共享同一个 bridge 网络,存在命名冲突和安全风险。

--net elastic 表示将容器加入名为 elastic 的自定义网络,主要目的是:

容器间通过名称互访:在 elastic 网络中,容器可以直接通过容器名(如 elasticsearch)访问其他容器,无需手动解析 IP 地址。

  • Kibana 容器可以直接通过 http://elasticsearch:9200 连接 Elasticsearch
  • 服务发现更加简单(通过 DNS 自动解析容器名到 IP)
# 可以看到 elastic 网络正常创建了
docker network ls 
           
NETWORK ID     NAME      DRIVER    SCOPE
00e36aa513ea   bridge    bridge    local
f9a92ae19143   elastic   bridge    local
fda20d52a9ae   host      host      local
36a3c054b09c   none      null      local
  • 运行容器
docker run -d \
--name es \
--net elastic \
-e "ES_JAVA_0PTS=-Xms512m -Xmx512m" \
-e "discovery.type=single-node" \
-v /Users/xxx/Documents/elasticsearch/data:/usr/share/elasticsearch/data \
-v /Users/xxx/Documents/elasticsearch/plugins:/usr/share/elasticsearch/plugins \
-v /Users/xxx/Documents/elasticsearch/logs:/usr/share/elasticsearch/logs \
--privileged \
-p 9200:9200 \
-p 9300:9300 \
elasticsearch:7.14.1
  • Elasticsearch 设置密码
# 容器启动以后,我们用下面命令进入容器
Mac-mini ~ % docker exec -it f02c5b21b360 /bin/bash   

# 进入容器以后 修改config下面的 elasticsearch.yml文件。
[root@f02c5b21b360 elasticsearch]# ls
bin  config  data  jdk	lib  LICENSE.txt  logs	modules  NOTICE.txt  plugins  README.asciidoc

[root@f02c5b21b360 elasticsearch]# cd config

[root@f02c5b21b360 config]# ls
elasticsearch.keystore	elasticsearch.yml  jvm.options	jvm.options.d  log4j2.file.properties  log4j2.properties  role_mapping.yml  roles.yml  users  users_roles

[root@f02c5b21b360 config]# vi elasticsearch.yml

在文件中添加如下内容

## 配置xpack,开启加密
xpack.security.enabled: true
xpack.license.self_generated.type: basic
xpack.security.transport.ssl.enabled: true

## elasticsearch-head配置需要添加此配置
http.cors.allow-headers: Authorization,X-Requested-With,Content-Length,Content-Type

保存退出,执行bin目录下面的elasticsearch-setup-password文件,设定密码

[root@f02c5b21b360 elasticsearch]# ls
bin  config  data  jdk	lib  LICENSE.txt  logs	modules  NOTICE.txt  plugins  README.asciidoc

[root@f02c5b21b360 elasticsearch]# cd bin

[root@f02c5b21b360 bin]# ls
elasticsearch		elasticsearch-cli	elasticsearch-env-from-file  elasticsearch-migrate  elasticsearch-saml-metadata    elasticsearch-shard		     elasticsearch-syskeygen  x-pack-security-env
elasticsearch-certgen	elasticsearch-croneval	elasticsearch-geoip	     elasticsearch-node     elasticsearch-service-tokens   elasticsearch-sql-cli	     elasticsearch-users      x-pack-watcher-env
elasticsearch-certutil	elasticsearch-env	elasticsearch-keystore	     elasticsearch-plugin   elasticsearch-setup-passwords  elasticsearch-sql-cli-7.14.1.jar  x-pack-env

[root@f02c5b21b360 bin]# ./elasticsearch-setup-passwords interactive

这里会设置六个账号的密码:elastic,apm_system,kibana,logstash_system,beats_system,remote_monitoring_user

可以看到需要用户名和密码才能访问了

 

输入用户名和密码 成功登录进去就说明es已配置完成 

 

安装 kibana


  • 拉取 kibana镜像(注意需要翻墙)

‼️ kibana版本号要和elasticsearch一致(非常重要,否则 kibana启动时会报错,提示和elasticsearch版本号不一致)这里都是用的 7.14.1

docker pull kibana:7.14.1
  • 运行容器

ELASTICSEARCH_HOSTS指向elasticsearch url ,注意–net elastic

docker run -d \
--name kibana \
--net elastic \
-e ELASTICSEARCH_HOSTS=http://es:9200 \
-p 5601:5601 \
kibana:7.14.1
  • 设定用户名和密码,以连接Elasticsearch

修改 config\kibana.yml文件

# 通过容器id 进入kibana容器
Mac-mini ~ % docker exec -it db21974d8467 /bin/bash

# 进入容器以后,修改config下面的kibana.yml文件
bash-4.4$ ls
LICENSE.txt  NOTICE.txt  README.txt  bin  config  data	node  node_modules  package.json  plugins  src	x-pack

bash-4.4$ cd config

bash-4.4$ ls
kibana.yml  node.options

bash-4.4$ vi kibana.yml

在文件中添加

xpack.security.enabled: true
elasticsearch.username: "elastic"
elasticsearch.password: "xxxx"   # elasticsearch中设定的密码

保存退出,重启 kibana 容器。

可以看到需要用户名和密码才能访问

输入elasticsearch中设定用户名和密码,Login in

启动以后,做完frp内网穿透,就可以在公网用public ip访问 kibana dashboard了。

发现提示了下面的问题

server.publicBaseUrl is missing and should be configured when running in a production environment. Some features may not behave correctly.

你看到的这个警告是 Kibana 在生产环境下的安全提示,提示你缺少 server.publicBaseUrl 配置。这个配置项对 Kibana 的正确运行非常重要,特别是在涉及 URL 生成、重定向和安全功能时。

为什么需要 server.publicBaseUrl

  • URL 生成:Kibana 在生成链接(如邮件通知、深层链接)时,需要知道外部访问的基础 URL。
  • 代理环境适配:如果 Kibana 运行在反向代理(如 Nginx)后面,Kibana 需要知道代理后的公开 URL。
  • 安全功能:某些安全功能(如 OAuth 回调、CSRF 保护)依赖于正确的基础 URL。

缺少配置的影响

  • 部分功能可能无法正常工作(如告警通知中的链接错误)。
  • 安全漏洞风险(如开放重定向攻击)。
  • 用户体验问题(如点击链接跳转到错误地址)。

解决 kibana.yml 中添加配置(推荐)

server.publicBaseUrl: "https://kibana.example.com"  # 替换为你的实际域名或 IP
# 进入kibana docker容器
Mac-mini ~ % docker exec -it db21974d8467 /bin/bash

# 编辑
bash-4.4$ ls
LICENSE.txt  NOTICE.txt  README.txt  bin  config  data	node  node_modules  package.json  plugins  src	x-pack

bash-4.4$ cd config

bash-4.4$ ls
kibana.yml  node.options

bash-4.4$ vi kibana.yml
# kibana.yml 文件

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

# Default Kibana configuration for docker target
server.host: "0"
server.shutdownTimeout: "5s"
elasticsearch.hosts: [ "http://elasticsearch:9200" ]
monitoring.ui.container.elasticsearch.enabled: true

xpack.security.enabled: true
elasticsearch.username: "elastic" #这里替换成实际的用户名
elasticsearch.password: "xxxxxx"  #这里替换成实际的密码
server.publicBaseUrl: "http://xxx.xxx.xx.xx:5601" #这里替换kibana dashboard的ip域名和端口
~                                                 

修改完保存以后,重启容器。

 

kibana 汉化


按照上面操作以后, 发现kibana dashboard是英文画面,我们可以通过修改设置,改成中文。

kibana 6.7 版本之后,官方已经支持语言选择,只需修改kibana.yml文件即可。

只要在 config/ kibana.yml 添加 i18n.locale: “zh-CN” 即可

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

# Default Kibana configuration for docker target
server.host: "0"
server.shutdownTimeout: "5s"
elasticsearch.hosts: [ "http://elasticsearch:9200" ]
monitoring.ui.container.elasticsearch.enabled: true

xpack.security.enabled: true
elasticsearch.username: "elastic"
elasticsearch.password: "xxxx"
server.publicBaseUrl: "http://xxx.xxx.xxx.xxx:5601"
i18n.locale: "zh-CN" 
~                                                                                                                                                                                                                                                                         
~                                                                                                                                                                                                                                                                         
~                                                                                                                                                                                                                                                                         
~                             

保存退出,重启容器,重新访问dashboard页面,可以发现页面变成中文了。