Help us understand the problem. What is going on with this article?

Elastic SearchをDocker Composeで展開したらError code 78でコンテナが停止される問題

はじめに

Elastic Searchは公式にDockerイメージを提供していてドキュメントも公開されているため、Dockerでシングル構成のElastic Searchを動かしたり、Docker Composeで複数ノードからなるElastic Search環境を導入できます。

そしてdocker-composeで構築するわけですが、起動後数分するとExit 78で停止されてしまうわけです。

$ sudo docker-compose up -d
$ sudo docker-compose ps
Name              Command                State    Ports
-------------------------------------------------------
es01   /usr/local/bin/docker-entr ...   Exit 78        
es02   /usr/local/bin/docker-entr ...   Exit 78        
es03   /usr/local/bin/docker-entr ...   Exit 78        

調査

「Elastic Search Exit 78」などで検索するとvm.max_map_countの設定を増やせばThat's All!...みたいな情報ばかり出てきます(→例えばこれ)。

念のため試してみるのですが、相変わらずExit 78を回避できませんでした。

問題の原因

問題の原因はDockerとDocker Composeのバージョンの組み合わせの問題だったようです。今回Ubuntu Server 18.04でElastic Searchを動かそうとしたわけですが、DockerはUbuntu 18.04提供のバージョン、Docker Composeはサイトの手順を見ながらDocker公式のStableバージョンを入れたのがよくなかったようです。

バイナリインストールしたDocker Composeを削除して次のように導入した環境では正常にデプロイできました。

$ sudo apt update
$ sudo apt install docker.io docker-compose -y

$ docker -v
Docker version 19.03.6, build 369ce74a3c
$ docker-compose -v
docker-compose version 1.17.1, build unknown

$ sudo docker-compose up -d
$ sudo docker-compose ps
$ sudo docker-compose ps
Name              Command               State                Ports              
--------------------------------------------------------------------------------
es01   /usr/local/bin/docker-entr ...   Up      0.0.0.0:9200->9200/tcp, 9300/tcp
es02   /usr/local/bin/docker-entr ...   Up      9200/tcp, 9300/tcp              
es03   /usr/local/bin/docker-entr ...   Up      9200/tcp, 9300/tcp  

Ubuntu 18.04のUbuntu Archive Packageのdokcer-composeはPython2が必要みたいですね。新しいバージョンはPython 3を要求するようです。単に必要なPythonモジュールが足りなかったのが原因だったのかもしれませんが、Elastic Searchの1ノードは問題なくて3ノード構成は失敗するのは本当に謎。Ubuntu Archive版のdocker-composeでは問題ありません。

おまけ

公式の手順では3つのノードのElastic SearchをデプロイするDocker Composeの例ですが、このようなYAMLを作れば1台のコンテナーにElastic SearchをDocker Composeで展開できます。

version: '3'

volumes:
  es-data:
    driver: local

services:
  elasticsearch:
    image: docker.elastic.co/elasticsearch/elasticsearch:7.6.2
    volumes:
      - es-data:/usr/share/elasticsearch/data
    environment:
      - discovery.type=single-node
      - cluster.name=docker-cluster
      - bootstrap.memory_lock=true
      - "ES_JAVA_OPTS=-Xms512m -Xmx512m"
    ulimits:
      memlock:
        soft: -1
        hard: -1
    ports:
      - "9200:9200"

えっ一台ならdocker runでええやろですって?
そうかもしれません。

おまけ2

データの永続化をもう少し安全にするには、次のように設定すると良いです。

$ sudo mkdir -p /home/data
$ sudo chmod 777 /home/data

$ vi docker-compose.yml

version: '3'


services:
  elasticsearch:
    image: docker.elastic.co/elasticsearch/elasticsearch:7.6.2
    volumes:
      - /home/data:/usr/share/elasticsearch/data
    environment:
      - discovery.type=single-node
      - cluster.name=docker-cluster
      - bootstrap.memory_lock=true
      - "ES_JAVA_OPTS=-Xms512m -Xmx512m"
    ulimits:
      memlock:
        soft: -1
        hard: -1
    ports:
      - "9200:9200"

Dockerのボリュームについては以下を参考にしました。

ytooyama
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away