Declarative Local Stack: INFINI Console and Easysearch with Docker Compose

After manually spinning up INFINI Console (1.29.6) and Easysearch (1.13.0) containers in the previous walkthrough, the next logical step is to replace the long docker run incantations with a single, version-controlled YAML file. Docker Compose turns the whole setup into a reproducible, one-command operation while keeping every byte of state on the host.

Why Compose?

  • All configuration lives in docker-compose.yml—no forgotten flags.
  • docker compose up and docker compose down start or tear down the entire stack.
  • Services share an isolated bridge network, so Console can reach Easysearch by hostname alone.
  • The file can be checked into Git and shared across the team.

Prerequisites

  • macOS (commands are identical on Linux; Windows WSL works too)
  • Docker Engine ≥ 20.10 with Compose v2 (docker compose version)
  • About 2 GB free RAM for the two containers

Directory layout

~/infini_lab/
├── docker-compose.yml
├── es/
│   ├── config/
│   ├── data/
│   └── logs/
└── ui/
    ├── config/
    ├── data/
    └── logs/

Create the folders:

mkdir -p ~/infini_lab/{es,ui}/{config,data,logs}

Seed the default configuration

Run disposable containers once to copy the pristine configs into the host folders.

# Easysearch
docker run --rm \
  -e EASYSEARCH_INITIAL_ADMIN_PASSWORD=ChangeMe123 \
  -v ~/infini_lab/es/config:/tmp/cfg \
  infinilabs/easysearch:1.13.0 \
  sh -c "cp -a /app/easysearch/config/. /tmp/cfg/ && chmod -R a+rw /tmp/cfg"

# Console
docker run --rm \
  -v ~/infini_lab/ui/config:/tmp/cfg \
  infinilabs/console:1.29.6 \
  sh -c "cp -a /config/. /tmp/cfg/ && chmod -R a+rw /tmp/cfg"

The compose file

Save as ~/infini_lab/docker-compose.yml:

version: "3.9"
services:
  search:
    image: infinilabs/easysearch:1.13.0
    container_name: infini-search
    environment:
      cluster.name: infini_demo
      node.name: single-node
      cluster.initial_master_nodes: single-node
      ES_JAVA_OPTS: "-Xms1g -Xmx1g"
      EASYSEARCH_INITIAL_ADMIN_PASSWORD: ChangeMe123
    ports:
      - "9200:9200"
      - "9300:9300"
    volumes:
      - ./es/config:/app/easysearch/config
      - ./es/data:/app/easysearch/data
      - ./es/logs:/app/easysearch/logs
    ulimits:
      memlock: -1
      nofile: 65536
    networks: [infini_net]

  console:
    image: infinilabs/console:1.29.6
    container_name: infini-console
    ports:
      - "9000:9000"
    volumes:
      - ./ui/config:/config
      - ./ui/data:/data
      - ./ui/logs:/log
    networks: [infini_net]
    depends_on: [search]

networks:
  infini_net:
    driver: bridge

Start the stack

cd ~/infini_lab
docker compose up -d

First run pulls images; subsequent starts are instant.

Verify

  1. Open http://localhost:9000 in your browser.
  2. In Console, add a cluster with endpoint https://search:9200 (Compose DNS resolves the service name automatically).
  3. Create indices, ingest some docs, and watch the dashboards populate.

Lfiecycle commands

# Stop containers but keep volumes
docker compose stop

# Stop and remove containers, networks
docker compose down

# View logs
docker compose logs -f search
docker compose logs -f console

# Full reset (⚠️ deletes host folders too)
docker compose down -v
rm -rf ~/infini_lab/es ~/infini_lab/ui

Because the bind mounts point directly to ~/infini_lab, your data survives container recreation, and the entire environment can be reproduced on any machine with a single git clone followed by docker compose up.

Tags: Docker Compose INFINI Console INFINI Easysearch elasticsearch devops

Posted on Tue, 28 Jul 2026 16:20:25 +0000 by andybrooke