五分鐘搞定Docker安裝ElasticSearch

發表於2021-08-30

前言

專案準備上ElasticSearch,為了後期開發不卡殼只能笨鳥先飛,在整個安裝過程中遇到以下三個問題。

  • Docker安裝非常慢
  • ElasticSearch-Head連線出現跨域
  • ElasticSearch-Head操作報出406錯誤碼

一、安裝Docker

目前咔咔對Docker的理解還只是個皮毛,對於不瞭解的東西就要多多使用,使用的多了自然而然也就會了。

安裝依賴包,執行命令yum install -y yum-utils device-mapper-persistent-data lvm2

此時若直接執行安裝docker命令就會發現是十分慢的,這個等待過程是漫長的。

配置國內的源就可以解決問題yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo這裡使用的是阿里雲的源。

接著再執行命令yum install docker-ce docker-ce-cli containerd.io安裝docker即可。

配置docker開機自啟systemctl enable docker

執行systemctl start docker命令啟動docke

檢視docker版本看是否安裝成功

docker版本
docker版本

如若之前安裝docker有問題,那麼執行yum remove docker-ce來刪除並且將/var/lib/docker下的所有東西全部刪除乾淨。

docker安裝完成後咔咔就進行了建立容器,但遇到了一個問題WARNING: IPv4 forwarding is disabled. Networking will not work.

拿著這個錯誤直接找度娘才知道,沒有開啟轉發,網路橋接配置後,是需要開啟轉發的。

若不開啟轉發就會出現上邊的錯誤,顯示沒有網路。

解決方案

修改配置檔案/etc/sysctl.conf,在裡邊加上net.ipv4.ip_forward=1,然後重啟服務systemctl restart network,讓配置生效。

二、安裝ElasticSearch

使用docker直接獲取es映象,執行命令docker pull elasticsearch:7.7.0

執行完成後,執行docker images即可看到上一步拉取的映象。

es映象文章
es映象文章

有了映象,就可以開始建立容器了,接下來建立一個es的容器。

執行docker run --name elasticsearch -d -e ES_JAVA_OPTS="-Xms512m -Xmx512m" -e "discovery.type=single-node" -p 9200:9200 -p 9300:9300 elasticsearch:7.7.0

--name 表示容器名稱  

-d: 後臺執行容器,並返回容器ID;

-e: 指定容器內的環境變數

-p: 指定埠對映,格式為:主機(宿主)埠:容器埠

命令執行完成會返回容器id,此時再執行docker ps -a列出所有的容器。

es容器
es容器

es預設埠為9200,只用ip地址+埠號直接訪問,就會返回如下圖。出現這個介面就表示你安裝成功了。

返回結果
返回結果

到這裡我們就非常快速的使用Docker安裝完成了ElasticSearch,接下來再一起安裝針對於ElasticSearch的客戶端工具。

三、安裝ElasticSearch-Head

同樣也採用Docker進行快速安裝,跟上邊一樣同樣先拉取映象,執行命令docker pull mobz/elasticsearch-head:5

接著建立容器,執行docker create --name elasticsearch-head -p 9100:9100 mobz/elasticsearch-head:5

安裝ElasticSearch-Head外掛
安裝ElasticSearch-Head外掛

為了保證圖片的清晰度,圖片就沒有擷取完全,同時也是咔咔接下來將要跟你講的,注意倆次建立容器時的不同。

安裝ElasticSearch時是容器建立成功後直接在後臺就執行了,但在安裝ElasticSearch-Head時並沒有保持一致。

而是指定容器名,埠號就直接執行了,這樣執行完成後是建立了一個容器,並沒有執行。

也就是咔咔在上圖右下角的地方有一個框,這裡就可以看到狀態,會發現是create。

所以還需要一個操作,那就是啟動容器docker start 容器id

安裝完成直接使用域名加埠9100即可訪問。

跨域問題
跨域問題

處理跨域

在連線ElasticSearch會發現無法連線,由於時前後端分離開發,所以會存在跨域問題,需要在服務端做跨域處理。

執行命令docker exec -it elasticsearch /bin/bash 進入到第一步建立的ElasticSearch容器中,修改配置檔案vi config/elasticsearch.yml即可。

http.cors.enabled: true 
http.cors.allow-origin: "*"

將上邊倆行寫進配置檔案中,注意這裡是用yml的配置檔案,簡單普及一下此類配置檔案的幾點語法。

  • 冒號後邊必須有一個空格
  • 使用空格的縮排標識層級關係,空格資料不重要,只要是左邊對其的一列鍵即可。
  • 對大小寫十分敏感
  • 縮排時不允許使用tab,只允許使用空格。

配置修改完後需執行命令exit退出容器,接著執行docker restart 容器ID重啟容器即可。

處理報406錯誤

此時通過ElasticSearch-Head可以成功連線ElasticSearch了,但進行資料操作時會報406錯誤。

只需要修改ElasticSearch-Head容器中的配置即可,將配置檔案複製到宿主機進行修改。

執行docker cp 容器ID:/usr/src/app/_site/vendor.js /usr/local/ ,此命令會把docker容器中的檔案複製到你的宿主機目錄。

進入到/usr/local即可看到從容器中複製出來的檔案vendor.js。

修改檔案第6886、7574行,將"application/x-www-from-urlencodes"修改為"application/json;charset=UTF-8"即可

修改後再將檔案複製到容器中,從容器複製檔案到宿主機命令已經使用過了,那麼現在只不過是把倆個目錄反過來即可執行docker cp /usr/local/vendor.js 容器ID:/usr/src/app/_site

最後一步重啟ElasticSearch-Head容器就結束了。

四、安裝IK分詞器

首先問一個問題,ElasticSearch中自帶的有分詞器為什麼還要使用IK分詞器?

在ElasticSearch中的分詞器會把中文分為一個一個的字,例如"今天是週五",會被分成“今”、“天”、“是”,“周”、“五”,這裡很明顯是不合適的,在大多數場景下需要的是詞而不是字。

所以就需要安裝中文分詞器IK來解決這個問題。

IK提供了兩個分詞演算法:ik_smart和ik_max_word,其中ik_smart為最少切分,ik_max_word為最細力度。分別都有什麼區別會在下期文章中給大家提出來。

這裡需要注意安裝的版本需要跟ElasticSearch版本一致。

進入到ElasticSearch容器中docker exec -it 容器ID /bin/bash

使用wget來進行安裝,執行wget https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v7.7.0/elasticsearch-analysis-ik-7.7.0.zip即可。

當你使用wget安裝出現Unable to establish SSL connection時執行以下倆個命令即可。

yum install opensslls

yum install openssl-devel

執行cd /usr/share/elasticsearch/plugins來到外掛目錄建立一個IK目錄。

將壓縮包移動到IK目錄中,執行解壓指令elasticsearch-analysis-ik-7.7.0.zip

接著刪除壓縮包即可,此時你可以看到一個config包和幾個jar包

解壓後的包
解壓後的包

最後退出容器,重啟重啟容器即可。

六、總結

本期文章將需要使用ElasticSearch所有的東西都已經準備齊全了,接下來的文章會帶著你使用PHP的Laravel開始封裝ElasticSearch的所有查詢方法。

後期也會在Go中封裝一份,給自己的工具類新增一點內容。

堅持學習、堅持寫作、堅持分享是咔咔從業以來所秉持的信念。但願文章在偌大的網際網路上能給你帶來一點幫助,我是咔咔,下期見。

相關文章