Elasticsearch 容器化

基于 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

  1. 編輯文件 /etc/sysctl.conf
$ grep vm.max_map_count /etc/sysctl.conf
vm.max_map_count=262144
  1. 并執(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:gid1000: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:gid1000:1000

如果要綁定安裝本地目錄或文件,請(qǐng)確保此用戶可以讀取它,而數(shù)據(jù)和日志目錄還需要寫訪問權(quán)限。
一個(gè)好的策略是授予gid1000 的組訪問本地目錄的權(quán)限。

例如,要準(zhǔn)備一個(gè)本地目錄來通過bind-mount存儲(chǔ)數(shù)據(jù)。

mkdir esdatadir
chmod g+rwx esdatadir
chgrp 1000 esdatadir

2. 設(shè)置 ulimitsnofilenproc

ulimitsnofilenproc 對(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)使用。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 為什么要容器化,部署快速是關(guān)鍵,基于云的AMI,直接 AMI 「packer可以直接構(gòu)建ami 要學(xué)習(xí)下,還不會(huì)」...
    Secret_Sun閱讀 1,903評(píng)論 6 3
  • 一 、什么是 Docker Docker 最初是 dotCloud 公司創(chuàng)始人 Solomon Hykes 在法國(guó)...
    Blazzer閱讀 3,240評(píng)論 0 13
  • Docker 日志分為兩類: Docker 引擎日志(也就是 dockerd 運(yùn)行時(shí)的日志), 容器的日志,容器...
    ___n閱讀 1,026評(píng)論 0 2
  • 得之我幸 某班上自習(xí)課,學(xué)生紀(jì)律不好。有不少學(xué)生總在竊竊私語,于是我在黑板上寫下:本節(jié)課認(rèn)真學(xué)習(xí)的同學(xué)有: ...
    淡看云舒閱讀 172評(píng)論 0 0
  • 寫作是一種以書面語言表達(dá)思想感情的并與人進(jìn)行交流的行為,寫作也是一種技能,具有很強(qiáng)的實(shí)踐性,也是當(dāng)今社會(huì)發(fā)展所...
    讀書寫作與傳統(tǒng)文化閱讀 3,223評(píng)論 1 8

友情鏈接更多精彩內(nèi)容