0. 前言
最近基本都是學一些環境配置,和一些中間件的安裝與配置。沒有實際編寫代碼。可能看起來有點水,我對本身的學習方式是,先要了解各個中間件的安裝配置以及簡單使用,理論應用場景,而後我在小項目中,逐步引入這些高大上的中間件,看實際效果怎樣,合不合適我本身用。一開始絕對不會花太多時間去了解技術系統,我以爲,個人工做是作應用開發,不是底層研發。開發就是以知足實際需求爲前提,怎麼作到適合本身使用,怎麼方便怎麼來。
也有和一些人聊過,通常開發人員太愛本身造輪子了,實際項目,仍是要用市場上廣泛使用的開源軟件。只有本身平時學習與提升時,造一些輪子。可是造輪子對於我來講,目前仍是太難了。能合理用好各個組件,快速實現業務需求,纔是我應該注重的點。每一個人對本身的要求是不同的。html
1. 下載Image
若是不清楚最新版本的,能夠到https://hub.docker.com/r/library/elasticsearch/ 這裏查詢node
docker pull elasticsearch:6.4.2
運行esgit
docker run -d --name es -p 9200:9200 -e http.port=9200 -e http.cors.allow-origin="*" -e http.cors.enabled=true -e http.cors.allow-headers=X-Requested-With,X-Auth-Token,Content-Type,Content-Length,Authorization -e http.cors.allow-credentials=true elasticsearch:6.4.2
運行elastichdgithub
docker run -p 9800:9800 -d --link es:demo containerize/elastichd
這裏的集羣監控狀態爲:Yellow,表示當前只有一個節點,沒有配置集羣docker
運行dejavujson
docker run -d -p 1358:1358 appbaseio/dejavu
這個要注意,若是要成功鏈接到ES的話,要先建立好索引(Index) 參考下面第3點,curl -X PUT -H "Content-Type: application/json" http://172.16.23.203:2101/wunaozai, 建立後,才能進行鏈接網絡
2. 配置集羣及測試app
建立一個虛擬網絡
cors
docker network create --driver bridge --subnet 172.22.17.0/24 --gateway 172.22.17.254 es_net
建立3個elasticsearch節點curl
1 # node1 2 docker run -d --name es_1 --net es_net --ip 172.22.17.1 \ 3 -p 2101:9200 -p 3101:9300 -v /etc/localtime:/etc/localtime \ 4 -e "cluster.name=wunaozai" \ 5 -e "node.name=node1" \ 6 -e "network.host=172.22.17.1" \ 7 -e "network.bind_host=0.0.0.0" \ 8 -e "discovery.zen.ping.unicast.hosts=172.22.17.1,172.22.17.2,172.22.17.3" \ 9 -e "discovery.zen.minimum_master_nodes=1" \ 10 -e "http.port=9200" \ 11 -e "http.cors.allow-origin=*" \ 12 -e "http.cors.enabled=true" \ 13 -e "http.cors.allow-headers=X-Requested-With,X-Auth-Token,Content-Type,Content-Length,Authorization" \ 14 -e "http.cors.allow-credentials=true" \ 15 elasticsearch:6.4.2 16 # node2 17 docker run -d --name es_2 --net es_net --ip 172.22.17.2 \ 18 -p 2102:9200 -p 3102:9300 -v /etc/localtime:/etc/localtime \ 19 -e "cluster.name=wunaozai" \ 20 -e "node.name=node2" \ 21 -e "network.host=172.22.17.2" \ 22 -e "network.bind_host=0.0.0.0" \ 23 -e "discovery.zen.ping.unicast.hosts=172.22.17.1,172.22.17.2,172.22.17.3" \ 24 -e "discovery.zen.minimum_master_nodes=1" \ 25 -e "http.port=9200" \ 26 -e "http.cors.allow-origin=*" \ 27 -e "http.cors.enabled=true" \ 28 -e "http.cors.allow-headers=X-Requested-With,X-Auth-Token,Content-Type,Content-Length,Authorization" \ 29 -e "http.cors.allow-credentials=true" \ 30 elasticsearch:6.4.2 31 # node3 32 docker run -d --name es_3 --net es_net --ip 172.22.17.3 \ 33 -p 2103:9200 -p 3103:9300 -v /etc/localtime:/etc/localtime \ 34 -e "cluster.name=wunaozai" \ 35 -e "node.name=node3" \ 36 -e "network.host=172.22.17.3" \ 37 -e "network.bind_host=0.0.0.0" \ 38 -e "discovery.zen.ping.unicast.hosts=172.22.17.1,172.22.17.2,172.22.17.3" \ 39 -e "discovery.zen.minimum_master_nodes=1" \ 40 -e "http.port=9200" \ 41 -e "http.cors.allow-origin=*" \ 42 -e "http.cors.enabled=true" \ 43 -e "http.cors.allow-headers=X-Requested-With,X-Auth-Token,Content-Type,Content-Length,Authorization" \ 44 -e "http.cors.allow-credentials=true" \ 45 elasticsearch:6.4.2
運行,上面es_1,es_2,es_3是集羣的3個幾點。下面那個es是上面運行的單節點。
訪問 ElisticHD http://172.16.23.203:9800/ 從下圖,能夠看到集羣的一些信息
集羣節點以下,訪問任意一個節點,效果都是同樣的,都是操做同一份數據。
1 http://172.16.23.203:2101/ 2 http://172.16.23.203:2102/ 3 http://172.16.23.203:2103/
3. 數據測試
建立index
1 curl -X PUT -H "Content-Type: application/json" http://172.16.23.203:2101/wunaozai -d ' 2 { 3 "mappings":{ 4 "it": { 5 "properties": { 6 "bookId": {"type": "long"}, 7 "bookName": {"type": "text"}, 8 "publishDate": {"type": "date"} 9 } 10 } 11 } 12 } 13 '
查看index
curl -X GET http://172.16.23.203:2101/wunaozai
刪除index
curl -X DELETE http://172.16.23.203:2101/wunaozai
查詢type
curl -X GET -H "Content-Type: application/json" http://172.16.23.203:2101/wunaozai/_mapping
插入數據
1 curl -H "Content-Type: application/json" -X POST http://172.16.23.203:2101/wunaozai/it/001 -d '{"bookId": 1, "bookName":"<aa>", "publishDate":"2018-01-01"}' 2 curl -H "Content-Type: application/json" -X POST http://172.16.23.203:2102/wunaozai/it/002 -d '{"bookId": 2, "bookName":"<bb>", "publishDate":"2018-01-02"}' 3 curl -H "Content-Type: application/json" -X POST http://172.16.23.203:2103/wunaozai/it/003 -d '{"bookId": 3, "bookName":"<cc>", "publishDate":"2018-01-03"}'
更多操做就要參考官方文檔
4. 數據持久化
一開始不管是經過 -v 仍是經過 --volumes-from 進行掛載,都會提示如下錯誤
後來查詢資料發現,es是不能在root權限下運行的,同理,在elasticsearch:6.4.2容器裏,是以elasticsearch用戶運行的,所以只要把須要進行掛載的Volumn用戶組改成elasticsearch便可,這裏須要用1000:1000 ,要用用戶ID和組ID,由於host裏的用戶ID與Container裏的用戶ID是不同的。
1 chown 1000:1000 -R data 2 3 docker run -it --name es -p 9200:9200 -v /etc/localtime:/etc/localtime -v /root/workspace/docker/es/data:/usr/share/elasticsearch/data -e http.port=9200 -e http.cors.allow-origin="*" -e http.cors.enabled=true -e http.cors.allow-headers=X-Requested-With,X-Auth-Token,Content-Type,Content-Length,Authorization -e http.cors.allow-credentials=true elasticsearch:6.4.2
經過上面命令運行後,插入數據,而後中止容器,刪除容器,再從新建立容器,上次建立的數據仍是存在的,自此就實現了ES數據的host持久化。
參考資料:
https://github.com/appbaseio/dejavu/
https://hub.docker.com/_/elasticsearch/
http://www.codesheep.cn/2018/10/30/es-visualization/
http://www.codesheep.cn/2018/11/06/es-2-node-cluster/
https://github.com/elastic/elasticsearch-docker/issues/111
https://www.elastic.co/guide/en/elasticsearch/reference/5.5/docker.html#_b_bind_mounted_configuration