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 upanddocker compose downstart 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
- Open http://localhost:9000 in your browser.
- In Console, add a cluster with endpoint
https://search:9200(Compose DNS resolves the service name automatically). - 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.