/ Programming

How to install Elasticsearch 7 with Kibana using Docker Compose

This tutorial will help you setup a single node Elasticsearch cluster with Kibana using Docker Compose.

Pre-requisites

This tutorial assumes you are comfortable with Docker and Docker Compose. If you are not, you can go through this article of mine which is kind of a crash course with Docker Compose (https://medium.com/swlh/simplifying-development-on-your-local-machine-using-docker-and-docker-compose-2b9ef31bdbe7?source=friends_link&sk=240efed3fd3a43a1779e7066edb37235)

Video Lesson

I have also created a video tutorial for this on my YouTube channel. If you prefer that, you may visit the link below and check it out

https://www.youtube.com/watch?v=EClKhOE0p-o

Step 1: Create docker-compose.yml file

Create a directory on your machine for this project

mkdir $HOME/elasticsearch7-docker
cd $HOME/elasticsearch7-docker

Inside that directory create a docker-compose.yml file with contents as shown below

version: '3'
services:
  elasticsearch:
    image: docker.elastic.co/elasticsearch/elasticsearch:7.9.2-amd64
    env_file:
      - elasticsearch.env
    volumes:
      - ./data/elasticsearch:/usr/share/elasticsearch/data

  kibana:
    image: docker.elastic.co/kibana/kibana:7.9.2
    env_file:
      - kibana.env
    ports:
      - 5601:5601

Step 2: Create the env files

Both Elasticsearch and Kibana docker images allow us to pass on environment variables which are passed on to the configuration as defined in elasticsearch.yml and kibana.yml files. For passing the environment variables to container, we can use the env_file setting of the docker compose file.

Create the elasticsearch.env file:

cluster.name=my-awesome-elasticsearch-cluster
network.host=0.0.0.0
bootstrap.memory_lock=true
discovery.type=single-node

Note: With latest version of Elasticsearch, it is necessary to set the option discovery.type=single-node for a single node cluster otherwise it won't start

Create kibana.env file

SERVER_HOST="0"
ELASTICSEARCH_URL=http://elasticsearch:9200
XPACK_SECURITY_ENABLED=false

Step 4: Create Elasticsearch data directory

Navigate to the directory where you have created your docker-compose.yml file and create a subdirectory data. Then inside the data directory create another directory elasticsearch.

mkdir data
cd data
mkdir elasticsearch

We will be mounting this directory to the data directory of elasticsearch container. In your docker-compose.yml file there are these lines:

    volumes:
      - ./data/elasticsearch:/usr/share/elasticsearch/data

This ensures that the data on your Elasticsearch container persists even when the container is stopped and restarted later. So, you won't lose your indices when you restart the containers.

Step 4: Run the setup

We're good to go now. Open your terminal and navigate to the folder containing your docker-compose.yml file and run the command:

docker-compose up -d

This will start pulling the images from docker.elastic.co and depending on your internet speed, this should take a while. Once the images are pulled, it will start the containers.

You can run the following command to see if both the containers are running:

docker-compose ps

The output should look something like this

                Name                              Command               State           Ports         
------------------------------------------------------------------------------------------------------
docker-elasticsearch-setup_elasticsearch_1   /tini -- /usr/local/bin/do ...   Up      9200/tcp, 9300/tcp    
docker-elasticsearch-setup_kibana_1          /usr/local/bin/dumb-init - ...   Up      0.0.0.0:5601->5601/tcp

Notice the State field. It should be Up for both the containers. If it is not, then check the logs using the command (replace {serviceName} with the name of the service, eg elasticsearch or kibana)

docker-compose logs -f {serviceName}

A common error that you might encounter is related to vm.max_map_count being too low. You can fix it by running the command

sysctl -w vm.max_map_count=262144

Check this link for more details https://www.elastic.co/guide/en/elasticsearch/reference/current/vm-max-map-count.html

If both the services are running fine, you should be able to see kibana console on http://localhost:5601 on your web browser. Give it a few minutes as it takes some time for Elasticsearch cluster to be ready and for Kibana to connect to it. You can get more info by inspecting the logs using docker-compose logs -f kibana command.


This completes our setup. Hope you found it helpful. Happy coding :-)

How to install Elasticsearch 7 with Kibana using Docker Compose
Share this