基于 Docker18.09.0
介紹
Elasticsearch也可用作Docker鏡像。圖像使用centos:7作為基本圖像。
有關(guān)所有已發(fā)布的Docker鏡像和標(biāo)記的列表,請(qǐng)?jiān)L問 www.docker.elastic.co。源代碼在 GitHub中。
獲取鏡像
docker pull docker.elastic.co/elasticsearch/elasticsearch:6.5.2
啟動(dòng)
開發(fā)模式
可以使用以下命令快速啟動(dòng)Elasticsearch以進(jìn)行開發(fā)或測(cè)試:
docker run -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" docker.elastic.co/elasticsearch/elasticsearch:6.5.1
生產(chǎn)模式
生產(chǎn)環(huán)境下, 內(nèi)核參數(shù) vm.max_map_count 最少設(shè)置為 262144
設(shè)置方法根據(jù)自己的平臺(tái)設(shè)置:
-
Linux
- 編輯文件
/etc/sysctl.conf
$ grep vm.max_map_count /etc/sysctl.conf
vm.max_map_count=262144
- 并執(zhí)行如下 命令使之生效
sysctl -w
-
Mac
$ screen ~/Library/Containers/com.docker.docker/Data/vms/0/tty
sysctl -w vm.max_map_count=262144
Elasticsearch集群
下面的實(shí)例,將啟動(dòng)兩個(gè)節(jié)點(diǎn)的集群
1. docker-compose.yml:
version: '2.2'
services:
elasticsearch:
image: docker.elastic.co/elasticsearch/elasticsearch:6.5.1
container_name: elasticsearch
environment:
- cluster.name=docker-cluster
- bootstrap.memory_lock=true
- "ES_JAVA_OPTS=-Xms512m -Xmx512m"
ulimits:
memlock:
soft: -1
hard: -1
volumes:
- esdata1:/usr/share/elasticsearch/data
ports:
- 9200:9200
networks:
- esnet
elasticsearch2:
image: docker.elastic.co/elasticsearch/elasticsearch:6.5.1
container_name: elasticsearch2
environment:
- cluster.name=docker-cluster
- bootstrap.memory_lock=true
- "ES_JAVA_OPTS=-Xms512m -Xmx512m"
- "discovery.zen.ping.unicast.hosts=elasticsearch"
ulimits:
memlock:
soft: -1
hard: -1
volumes:
- esdata2:/usr/share/elasticsearch/data
networks:
- esnet
volumes:
esdata1:
driver: local
esdata2:
driver: local
networks:
esnet:
2. 執(zhí)行如下命令啟動(dòng)集群
- 前臺(tái)啟動(dòng)
docker-compose up
- 后臺(tái)啟動(dòng)
docker-compose up -d
3. 停止集群
要停止群集,請(qǐng)鍵入:
docker-compose down
這樣的話,數(shù)據(jù)量將持續(xù)存在,因此可以使用
docker-compose up使用相同的數(shù)據(jù)再次啟動(dòng)集群。
要銷毀群集和數(shù)據(jù)卷,只需鍵入:
docker-compose down -v
4. 檢查機(jī)器狀態(tài)
在宿主機(jī)上執(zhí)行如下命令,進(jìn)行健康檢查。
curl http://127.0.0.1:9200/_cat/health
輸出:
1544110980 15:43:00 docker-cluster green 2 2 0 0 0 0 0 0 - 100.0%
配置 Elasticsearch
使用容器實(shí)現(xiàn)的 Elasticsearch 可以用一下三種方式的任意一種來對(duì)其進(jìn)行配置。
1. 在啟動(dòng)容器的時(shí)候,使用 -e 指定 docker 容器的環(huán)境變量的方式
例如,要定義群集名稱:
-e "cluster.name=my_ela_clustername"
雙引號(hào)是必需的。
2. docker run 的時(shí)候,使用掛載本地文件到容器中的方式。
Elasticsearch 從下面的目錄中加載其配置
/usr/share/elasticsearch/config/
一般,我們會(huì)在宿主機(jī)中編輯一個(gè)自定義的配置文件 elasticsearch.yml, 之后綁定到容器中
--mount type=bind,src=/full_path_to/custom_elasticsearch.yml,dst=/usr/share/elasticsearch/config/elasticsearch.yml
3. Dockerfile 實(shí)現(xiàn)
在某些環(huán)境中,準(zhǔn)備包含配置的自定義映像可能更有意義。利用 Dockerfile 很容易就能實(shí)現(xiàn)。
Dockerfile
FROM docker.elastic.co/elasticsearch/elasticsearch:6.5.2
COPY --chown=elasticsearch:elasticsearch elasticsearch.yml /usr/share/elasticsearch/config/
默認(rèn)情況下,
Elasticsearch在容器中,將使用名為elasticsearch的用戶,且uid:gid為1000:1000去運(yùn)行。
所以注意目錄和文件的權(quán)限問題。同時(shí)還有關(guān)注日志目錄和數(shù)據(jù)目錄的權(quán)限。
這樣構(gòu)建鏡像
docker build -t elasticsearch-custom .
docker run -ti --monut type=bind,src=/ela/data,dst=/usr/share/elasticsearch/data elasticsearch-custom
默認(rèn)值和生產(chǎn)環(huán)境下的建議
1. 程序啟動(dòng)的默認(rèn)用戶
在一個(gè)Elasticsearch 的容器中,運(yùn)行程序的默認(rèn)用戶是 elasticsearch,并且其 uid:gid為 1000:1000
如果要綁定安裝本地目錄或文件,請(qǐng)確保此用戶可以讀取它,而數(shù)據(jù)和日志目錄還需要寫訪問權(quán)限。
一個(gè)好的策略是授予gid 為 1000 的組訪問本地目錄的權(quán)限。
例如,要準(zhǔn)備一個(gè)本地目錄來通過bind-mount存儲(chǔ)數(shù)據(jù)。
mkdir esdatadir
chmod g+rwx esdatadir
chgrp 1000 esdatadir
2. 設(shè)置 ulimits 的 nofile 和 nproc
ulimits 的 nofile 和 nproc 對(duì)于Elasticsearch容器是至關(guān)重要的參數(shù)。
可以在 docker run 的時(shí)候假如如下代碼:
--ulimit nofile=65536:65536
檢查以上參數(shù)的的默認(rèn)值
docker run --rm centos:7 /bin/bash -c 'ulimit -Hn && ulimit -Sn && ulimit -Hu && ulimit -Su'
3. 設(shè)置 JAVA 虛擬機(jī)的堆大小
使用ES_JAVA_OPTS環(huán)境變量設(shè)置堆大小。
例如,使用16GB,在 docker run 時(shí)使用-e ES_JAVA_OPTS="-Xms16g -Xmx16g"
4. 建議始終使用綁定的卷 /usr/share/elasticsearch/data
好處:
a. 如果容器被殺死,彈性搜索節(jié)點(diǎn)的數(shù)據(jù)不會(huì)丟失
b. Elasticsearch對(duì)I/O敏感,Docker存儲(chǔ)驅(qū)動(dòng)程序不適合快速I/O.
c. 它允許使用高級(jí) Docker卷插件
5. 關(guān)于存儲(chǔ)驅(qū)動(dòng)程序
如果您使用的是devicemapper存儲(chǔ)驅(qū)動(dòng)程序,請(qǐng)確保未使用默認(rèn)loop-lvm模式。配置docker-engine 代替使用 direct-lvm。
6. 關(guān)于日志記錄驅(qū)動(dòng)程序
請(qǐng)考慮使用其他日志記錄驅(qū)動(dòng)程序集中日志。
另請(qǐng)注意,默認(rèn)的 json-file日志記錄驅(qū)動(dòng)程序不適合生產(chǎn)使用。