# Docker Multi-Host Management Tools — Comparison **Researched:** 2026-07-09 **Context:** IT Pro Partner multi-server Docker Compose environment (Core, ai.itpropartner.com, docker, unms, etc.). Need single-pane visibility across hosts, REST API for Hermes scripting, and self-hosted. ## Top 3 Recommendation ### 🏆 1st: **Komodo** — API-first multi-host Docker management - **Architecture:** Core (web UI + API) + Periphery (agent on each host) - **Why:** Best API story — REST + WebSocket + CLI + Rust/npm client libraries. Perfect for Hermes scripting. GPL-3.0, truly free, unlimited servers. Built-in backup/restore, webhooks, GitOps. - **Trade-off:** Needs MongoDB (or FerretDB/Postgres). Heavier setup than alternatives. - **Setup:** Docker Compose (Core + Mongo) + Python install script for Periphery agents - **Docs:** https://komo.do/docs/intro - **GitHub:** https://github.com/moghtech/komodo ### 🥈 2nd: **Arcane** — Modern, BSD-3-Clause, no-MongoDB option - **Architecture:** Manager (Go backend + SvelteKit UI) + Agent (Direct or Edge mode) - **Why:** 100% free BSD-3-Clause. Beautiful UI. OpenAPI 3.1 REST API. Edge mode handles NAT/firewall'd hosts (agents dial out). Built-in vulnerability scanning. iOS mobile app. - **Trade-off:** Newer project (6.3k stars), smaller community than Portainer. - **Setup:** Single Docker container for Manager, one per Agent - **Docs:** https://getarcane.app/docs/setup/installation - **GitHub:** https://github.com/getarcaneapp/arcane ### 🥉 3rd: **Portainer** — Most mature, best documented - **Architecture:** Portainer Server + lightweight Go Agent on each host - **Why:** Industry standard. Extensive docs. Free BE tier covers 3 nodes with full features. Comprehensive REST API. Agent auto-updates, mTLS. - **Trade-off:** Beyond 3 nodes costs money. Heavier/fuller-featured than needed for Compose-only. - **Setup:** `docker run` agent command on each host, add via UI - **Docs:** https://docs.portainer.io/ - **GitHub:** https://github.com/portainer/portainer ## All Evaluated Tools | Tool | Multi-Host | REST API | Free | Web GUI | License | Stars | Setup | |---|---|---|---|---|---|---|---| | **Portainer** | ✅ Agent | ✅ Full API | 3 nodes free | ⭐⭐⭐⭐⭐ | Proprietary/MIT | ~30k | Easy | | **Arcane** | ✅ Agent (Direct+Edge) | ✅ OpenAPI 3.1 | ✅ 100% FOSS | ⭐⭐⭐⭐ | BSD-3-Clause | 6.3k | Easy | | **Komodo** 🏆 | ✅ Periphery Agent | ✅ REST + WS + 3 libs | ✅ 100% FOSS | ⭐⭐⭐⭐ | GPL-3.0 | ~3k | Medium | | **Dockge** | ✅ Agents (v1.4+) | ❌ No API | ✅ 100% FOSS | ⭐⭐⭐⭐ | MIT | 23.7k | Easy | | **Dockhand** | ✅ Agent/TLS/Hawser | ⏳ Roadmap (distant) | ✅ Homelab free | ⭐⭐⭐⭐⭐ | BSL 1.1 | 5.1k | Easy | | **Lazydocker** | ❌ Single host | ❌ No API | ✅ 100% FOSS | ❌ TUI only | MIT | 38.7k | Very Easy | ## Why the Others Don't Fit - **Dockge:** No API, no webhooks, compose-only. Great for single-user compose management but can't be scripted by Hermes. - **Dockhand:** No API (roadmap item, "distant future"). BSL license (not truly open source). Paid for commercial use. Beautiful UI but unusable for automation. - **Lazydocker:** Single host only. Terminal-only. Good for quick SSH checks, not a management platform. ## Quick Deploy Commands ### Komodo (Correct v2 Env Vars — See references/komodo-deployment.md) **CRITICAL:** Komodo v2 uses `KOMODO_DATABASE_ADDRESS` (not `MONGO_CONNECTION_STRING`), `KOMODO_PORT` (not `KOMODO_SERVER_PORT`). Using wrong env vars causes startup failure with _"Failed to initialize database"_ errors. ```yaml # Core (management server) — full reference in references/komodo-deployment.md services: mongo: image: mongo restart: unless-stopped command: --quiet --wiredTigerCacheSizeGB 0.25 volumes: - ./data/mongo-data:/data/db core: image: ghcr.io/moghtech/komodo-core:2 init: true restart: unless-stopped ports: - 9120:9120 depends_on: - mongo volumes: - ./backups:/backups - ./keys:/config/keys environment: - KOMODO_DATABASE_ADDRESS=mongo:27017 - KOMODO_PORT=9120 - KOMODO_HOST=https://komodo.itpropartner.com - KOMODO_TITLE=Komodo - KOMODO_LOCAL_AUTH=true - KOMODO_INIT_ADMIN_USERNAME=admin - KOMODO_INIT_ADMIN_PASSWORD=changeme - KOMODO_FIRST_SERVER_NAME=core - KOMODO_PERIPHERY_PUBLIC_KEY=file:/config/keys/periphery.pub - KOMODO_DISABLE_CONFIRM_DIALOG=false - KOMODO_DISABLE_INIT_RESOURCES=false - KOMODO_JWT_SECRET=change-me - KOMODO_JWT_TTL=1-day - KOMODO_MONITORING_INTERVAL=15-sec - KOMODO_RESOURCE_POLL_INTERVAL=1-hr ``` ```bash # Periphery (each managed host) curl -sSL https://raw.githubusercontent.com/moghtech/komodo/main/scripts/setup-periphery.py \ | python3 - \ --core-address="https://komodo.itpropartner.com" \ --connect-as="$(hostname)" \ --onboarding-key="O-..." ``` ### Arcane ```bash # Manager docker run -d --name arcane -p 3552:3552 \ -v arcane_data:/data \ ghcr.io/getarcaneapp/manager:latest # Agent (each remote host) docker run -d --name arcane-agent -p 3553:3553 \ -v /var/run/docker.sock:/var/run/docker.sock \ -e AGENT_MODE=true \ -e AGENT_TOKEN= \ -e MANAGER_API_URL=http://manager:3552 \ ghcr.io/getarcaneapp/agent:latest ``` ### Portainer ```bash # Agent on each remote host docker run -d -p 9001:9001 --name portainer_agent --restart=always \ -v /var/run/docker.sock:/var/run/docker.sock \ -v /var/lib/docker/volumes:/var/lib/docker/volumes \ portainer/agent:latest ``` ## Key Links | Tool | Website | Docs | GitHub | |---|---|---|---| | Portainer | https://www.portainer.io/ | https://docs.portainer.io/ | https://github.com/portainer/portainer | | Arcane | https://getarcane.app/ | https://getarcane.app/docs/setup/installation | https://github.com/getarcaneapp/arcane | | Komodo | https://komo.do/ | https://komo.do/docs/intro | https://github.com/moghtech/komodo | | Dockge | https://github.com/louislam/dockge | README only | https://github.com/louislam/dockge | | Dockhand | https://dockhand.pro/ | https://dockhand.pro/manual/ | https://github.com/Finsys/dockhand | | Lazydocker | https://lazydocker.com/ | README only | https://github.com/jesseduffield/lazydocker | ## Multi-Host Agent Architecture Patterns All multi-host tools use the same pattern: a central management server + lightweight agents on each Docker host. | Pattern | Used By | How It Works | |---|---|---| | **Agent polls out** | Arcane Edge, Dockhand Hawser | Agent behind NAT dials out to manager. No inbound port needed. | | **Agent listens** | Portainer Agent, Arcane Direct | Manager connects to agent on a TCP port. Requires inbound access. | | **Systemd agent** | Komodo Periphery | Agent runs as systemd service (or Docker). Bi-directional WebSocket to Core. |