在學習elasticsearch
和 kibana
時,使用Docker
進行快速部署,但是,在虛擬機進行部署的時候,遇到了一些問題,在這就重頭記錄一下整個部署的過程。
鏡像的下載
使用 Docker
來部署,其實是非常的簡單的,這里我們選取的 elasticsearch
和 kibana
的版本均為 7.4.2
# 下載 elasticsearch
docker pull elasticsearch:7.4.2
# 下載 kibana
docker pull kibana:7.4.2
# 查看下載的鏡像
docker images
創建 Elasticsearch 實例
在創建 Elasticsearch
實例之前,先在本機中創建一個自己的目錄 , 如:/mydata/elasticsearch
, 然后再目錄底下創建三個文件夾 data
、 config
和plugins
,為后面創建elasticsearch實例時,可以做一個文件映射,便於我們對 es 實例進行修改。
同時,在 config
文件夾里,新建 elasticsearch.yml
配置文件,並配置 es 可以被遠程的任何機器進行訪問
mkdir -p /mydata/elasticsearch/data
mkdir -p /mydata/elasticsearch/config
mkdir -p /mydata/elasticsearch/plugins
# 寫入配置
echo "http.host: 0.0.0.0" >> /mydata/elasticsearch/config/elasticsearch.yml
# 這里需要設置一下文件夾的權限。原因: 做文件夾映射后,需要對 本機文件夾 進行讀寫操作,如果不給權限的話,docker 將沒有權限來完成讀寫,后期啟動會報錯
chmod -R 777 /mydata/elasticsearch
啟動 elasticsearch
實例
docker run --name elasticsearch -p 9200:9200 -p 9300:9300 \
-e "discovery.type=single-node" \
-e ES_JAVA_OPTS="-Xms64m -Xmx256m" \
-v /mydata/elasticsearch/config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml \
-v /mydata/elasticsearch/data:/usr/share/elasticsearch/data \
-v /mydata/elasticsearch/plugins:/usr/share/elasticsearch/plugins \
-d elasticsearch:7.4.2
# 查看運行的實例
docker ps
-e "discovery.type=single-node"
: 設置 es 為單節點運行
-e ES_JAVA_OPTS="-Xms64m -Xmx256m"
: 設置 es 的最小內存使用 64M ,最大內存使用為 256 M
-v
: 設置 本機文件夾與實例內部的映射
訪問 http://主機IP:9200
,能看到如下信息,即為創建成功
創建 kibana 實例
kibana只需要創建實例,關聯我們剛剛的 es 即可
# 這里需要將主機 IP 修改為 對應的主機IP
docker run --name kibana -e ELASTICSEARCH_HOSTS=http://本機ip:9200 \
-p 5601:5601 -d kibana:7.4.2
如果使用虛擬機搭建環境,建議將虛擬機設置為固定 IP,也方便后期的訪問
訪問 http://主機ip:5601
,看到如下頁面即為創建成功
啟動時的各種報錯
Elasticsearch
[1]expecting token of type [START_OBJECT] but found [VALUE_STRING]
錯誤原因: elasticsearch.yml 文件內部錯誤
解決方案: 仔細檢查yml文件中的配置項書寫格式:
name:(空格)value
注意 冒號后面后個空格
[2] java.nio.file.AccessDeniedException: /usr/shar/elasticsearch/data/nodes
錯誤原因: 沒有權限,做文件夾關聯之后,docker 內部的 es 需要將 data 數據同時保存到 本機的 文件夾上,權限不足,無法寫入
解決方案: 對共享的文件夾開放權限,重啟es實例即可
# 開放所有權限 這里修改為對應的本機文件夾路徑即可 chmod -R 777 /mydata/elasticsearch # 重啟 es docker restart elasticsearch
Kibana
[1] {.. "message" : "Unable to revive connection: http://ip:9200/"}
錯誤原因:Docker容器中啟動服務和直接在Linux環境下安裝服務,會有ip上的區別,不在是服務器的物理ip, 而是容器對外暴露對的ip,。
解決方案: 通過
docker inspect elasticsearch
查看ES實例暴露出來的ip 。停止並刪除現有的Kibana容器,然后重新啟動kibana並添加環境變量參數:-e ELASTICSEARCH_HOSTS="http://es暴露的IP:9200"
# 停止實例 docker stop kibana # 刪除實例 docker rm kibana # 查看 es 實例暴露的IP docker inspect elasticsearch # 重新創建實例 docker run --name kibana -e ELASTICSEARCH_HOSTS=http://172.17.0.3:9200 \ -p 5601:5601 -d kibana:7.4.2
查看 es 實例暴露的IP:
但是如上解決方案存在一個問題:這個 IPAddress
是 docker 容器 自動分配的,也就是說,每當主機重啟,或者實例重啟之后,這個 ip 是會變化的,也就使得 需要再次配置 kibana,故 在這提供一個新的解決方案
解決方案二:
1、創建一個 docker 的 bridge 網絡
# 查看docker網絡信息 docker network ls # 新建一個bridge網絡 docker network create --driver bridge --subnet=172.18.0.0/16 --gateway=172.18.0.1 mynet # 查看新建網絡信息 docker network inspect mynet
2、停止和刪除原來的 elasticsearch 和 kibana
docker stop elasticsearch docker rm elasticsearch docker stop kibana docker rm kibana
3、使用新的 bridge 創建 elasticsearch 和 kibana 實例 並直接指定 IP
# 創建 elasticsearch 實例 docker run --name elasticsearch --network mynet --ip 172.18.0.5 -p 9200:9200 -p 9300:9300 \ -e "discovery.type=single-node" \ -e ES_JAVA_OPTS="-Xms64m -Xmx256m" \ -v /mydata/elasticsearch/config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml \ -v /mydata/elasticsearch/data:/usr/share/elasticsearch/data \-v /mydata/elasticsearch/plugins:/usr/share/elasticsearch/plugins \ -d elasticsearch:7.4.2 # 創建 kibana 實例 docker run --name kibana --network mynet --ip 172.18.0.103 \ -e ELASTICSEARCH_HOSTS=http://172.18.0.5:9200 \ -p 5601:5601 -d kibana:7.4.2
解釋一下為什么要新建一個新的 bridge 網絡環境:
Docker
創建容器時默認采用bridge
網絡,自行分配ip
,不允許自己指定。在實際部署中,我們需要指定容器ip
,不允許其自行分配ip
,尤其是搭建集群時,固定ip是必須的。故,如果需要分配固定的ip,我們可以創建自己的bridge
網絡 ,如: mynet
,創建容器的時候指定網絡為mynet
並指定ip
即可。