Run Elasticsearch in Docker inside Vagrant VM

Goal

Run Elasticsearch in a Docker container inside an Ubuntu VM managed by Vagrant, with data persistence and port forwarding to your host machine.

Setup Files

Vagrantfile

Vagrant.configure("2") do |config|
    config.vm.box = "ubuntu/focal64" # v 20.04 LTS
    config.vm.synced_folder "./", "/vagrant"
    config.vm.network "forwarded_port", guest: 9200, host: 9200
    config.vm.network "forwarded_port", guest: 9300, host: 9300
    config.vm.provision :shell, path: "vagrant_provision.sh"  
    config.vm.provider "virtualbox" do |vb|
      vb.name = "Elasticsearch"     
      vb.memory = 1024
    end
  end

vagrant_provision.sh

echo "provisioning VM..."
sudo apt update
sudo apt-get update

## install docker and run
sudo apt -y install docker.io
sudo systemctl start docker
sudo systemctl enable docker
docker --version
echo "docker installed and running..."

## create group 'docker' and add user 'vagrant' (the one I connect with) to it
sudo groupadd docker
sudo usermod -aG docker vagrant
echo "docker group created and 'vagrant' user added to it..."

## install docker compose
sudo curl -L https://github.com/docker/compose/releases/download/1.26.2/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
docker-compose --version
echo "docker compose installed..."

echo "done provisioning VM."

docker-compose.yaml

version: '3.7'
services:
  elasticsearch:
    image: elasticsearch:1.7.6-alpine
    container_name: elasticsearch
    volumes:
     - elasticsearchdata:/usr/share/elasticsearch/data
    ports:
     - "9200:9200"
     - "9300:9300"
    restart: always
volumes:
  elasticsearchdata:

Running Elasticsearch

Start the VM and launch the container:

vagrant up
vagrant ssh
cd /vagrant
docker-compose up -d

Stopping and Cleanup

Stop with data persistence:

vagrant halt

Complete teardown:

vagrant destroy

Verify

Query from host or VM. Returns {} if no indexes exist:

curl http://localhost:9200/*