Tech Digest

Head to head

Portainer vs Komodo

Portainer is a window into Docker. Komodo is a deployment system that happens to have a window. Choosing between them is choosing where the truth about your stack lives.

Last reviewed 2 tools compared

Should you manage Docker with Portainer or Komodo?

On one Docker host, run Portainer, and treat it as a read-and-restart console rather than the place your stacks are defined. On three or more hosts, run Komodo: its Periphery agent per machine and its git-backed resource sync mean your compose files stay the source of truth instead of drifting into a database. Portainer Community Edition is open source under zlib; Business Edition is proprietary but free forever for up to three nodes, one licence per company.

Both of these put a web page in front of Docker, and that is where the resemblance stops. Portainer is a console: one container, one BoltDB file, and a view of whatever is already running. Komodo is a build and deploy server: a Rust core, a MongoDB, and an agent on every machine it controls.

That difference decides everything else, including how badly it hurts when the tool itself breaks.

Two rows in the table below carry the argument. container_count is 1 for Portainer and 3 for Komodo, and that ratio understates it, because Komodo also wants a Periphery agent on every additional host. ops_load is 1 against 3 for the same reason. Portainer is something you install and forget; Komodo is something you operate.

SpecificationPortainerKomodo
Licencezlib (Community Edition); Business Edition is proprietary (Permissive)GPL-3.0 (Copyleft)
Written inGo / TypeScriptRust / TypeScript
First release20162023
MaturityMatureStable
DatastoreBoltDB key-value file at /data/portainer.dbMongoDB (FerretDB supported as a drop-in for hosts that cannot run current MongoDB)
Services to run13
Idle memory90 MB250 MB
Memory in use220 MB700 MB
Operational load1 / 5, Set and forget3 / 5, Moderate
IdentityNative OIDCNative OIDC
arm64 buildsYesYes
Default ports8000, 9000, 94439120, 8120
Backup shapeEmbedded key-value storeMongo dump

Portainer's editions, precisely#

This is the most misunderstood thing about Portainer, so here it is without hedging.

Community Edition is real open source under the zlib licence. Current LTS is 2.45.0, released August 2026. No key, no telemetry, no outbound validation, auditable build. It gives you container, image, volume and network management, stack deployment, LDAP and generic OAuth login, and multi-environment support through agents.

Business Edition is proprietary software that is free forever for up to three nodes. One licence per company, identified by web domain. The key is issued for a one-year term and you renew it, free, each year while you stay inside three nodes. Instances that lapse fall back to reduced functionality, so put the renewal in a calendar rather than discovering it during an incident.

What BE adds and CE does not have: role-based access control, GitOps with scheduled repository polling, registry management, activity and audit logs, Active Directory with group-to-team mapping.

For a homelab with one or two hosts, Business Edition is strictly more software for the same zero dollars. Choose Community Edition when you want no licence key, no annual renewal, no outbound check, or a build you can audit. Both are defensible. Pretending CE is the "free tier" and BE is the "paid tier" is not, and it is what most comparison articles do.

The three-node figure is also worth pinning down because it has moved: the free Business tier used to be five nodes and is now three.

Installation is unchanged since 2019, which tells you something good:

bash
docker run -d \
  -p 8000:8000 -p 9443:9443 \
  --name portainer --restart=always \
  -v /var/run/docker.sock:/var/run/docker.sock \
  -v portainer_data:/data \
  portainer/portainer-ce:lts

Use :lts, not :latest, unless you want the short-support train. Then watch the clock: Portainer prints a setup_token= line in its container logs and you have five minutes from container start to claim the admin account. Walk away to make coffee and you come back to a timeout and a container restart. For scripted installs use --admin-password-file.

Komodo: younger, Rust, and driven from git#

Komodo's shape is a central Core with a web UI and API, plus a lightweight Periphery agent on every machine you want it to manage. Adding a second or third box is installing an agent and registering it with an address and a passkey, not joining a cluster.

The feature that justifies the extra infrastructure is resource sync. You define stacks, builds, servers and procedures as TOML in a git repository, and Komodo reconciles the running state against it. Your source of truth is a repo with a commit history and pull requests, and the UI becomes a view onto that rather than a place where configuration quietly accumulates. That is the answer to the single worst property of clickable container managers, and Portainer only has it in Business Edition.

The costs are concrete:

  • MongoDB. Komodo needs it. On hosts that cannot run current MongoDB builds, older CPUs without AVX for instance, the documented alternative is FerretDB. Either way you have added a stateful database with its own memory appetite in order to manage compose files. Do not put this on a 2 GB VM.
  • Version lockstep. Periphery is not a stable protocol boundary. Upgrade Core without upgrading agents and you get hosts that show as connected while actions fail in confusing ways. Treat upgrades as a batch: pull Core, then reinstall Periphery everywhere, then confirm each server goes green before deploying anything. An update strategy that does not lose data applies to the manager itself here.
  • A breaking major inside the last year. v2 deprecated the :latest tag in favour of :2 and migrated the Mongo schema, with an explicit revert procedure back to v1.19.5 because the migration is not a no-op. Later 2.3.x patches were still fixing edge cases in that path.

Pin the tag deliberately in compose.env:

bash
COMPOSE_KOMODO_IMAGE_TAG=2
COMPOSE_KOMODO_BACKUPS_PATH=/etc/komodo/backups

Note where those backups land: a host path, not a Docker volume. People who back up their volumes and nothing else have been backing up nothing.

Which one goes in front of a stack you care about#

Komodo, if you have more than one machine. Portainer, if you have one, and only as a console.

The reasoning is drift. A stack created through Portainer's editor is stored inside /data/compose and edited in a browser. If that compose file also lives in git and you redeploy from the CLI, the two diverge silently and whichever ran last wins. There is no warning and no diff. For a stack that matters, that is an unacceptable property, and the honest fix in the Portainer world is Business Edition's GitOps mode.

Komodo starts from the other end. Its git-backed sync means the repository is authoritative by design, which is the same property that makes Docker Compose conventions worth following in the first place. When something breaks at 2am you read a diff instead of guessing what somebody clicked.

Now the counterweight, and it is real. Komodo is a 2023 project with one primary maintainer and a breaking major within the last twelve months. Portainer has been shipping since 2016 with a company behind it. If "a stack you care about" means a business dependency rather than a homelab, that maturity gap is a legitimate reason to run Business Edition instead and accept the proprietary licence. There is no answer here that is right for everyone, and anyone who gives you one has not weighed both risks.

What I would not do in either case: let the manager become the only place your configuration exists. Keep compose files in a git repository regardless. Then if Komodo's Mongo is unrecoverable or Portainer's portainer.db corrupts, you have lost a UI, not a service.

The thing both of them are: root on your host#

Portainer mounts /var/run/docker.sock. Komodo's Periphery agent mounts /var/run/docker.sock and /proc. That socket is root-equivalent: anyone who can create a container through it can mount the host filesystem into a privileged container and read every secret on the box.

Practical consequences:

  • Neither UI belongs on a port forward. Put them behind a VPN or a mesh network as Remote access without port forwarding describes, not just behind Caddy with basic auth.
  • Portainer CE's permission model cannot prevent an authenticated user from doing this. Do not share the admin account. If other people need access, that is what BE's RBAC is for.
  • Prefer the Portainer agent over publishing the Docker API on TCP 2375, which is unauthenticated by default and is how homelabs end up in cryptomining botnets.
  • Komodo's keys volume holds the Core material used to talk to agents. Lose it and every Periphery has to be re-registered by hand.

A security baseline for a home server covers the rest of the perimeter. This particular exposure is not something either tool can fix, because socket access is the whole reason they work.

Backups, in one paragraph each#

Portainer: everything is /data/portainer.db, a BoltDB file holding users, environment definitions, agent keys, stack definitions and registry credentials. It is not safe to copy while Portainer is writing. Stop the container, copy /data, start it again. Treat the file as a secret.

Komodo: the Mongo volumes hold all configuration and history and need a mongodump rather than a live file copy; the keys volume is required to reach existing agents; /etc/komodo on each Periphery host holds agent config and stack working directories. And export your resource definitions to git, which turns a restore into re-applying TOML instead of rebuilding by hand. Backups that actually restore and Backing up a running database both apply.

Verdict by situation#

Your situationPickWhy
One Docker host, you want a restart buttonPortainer CEOne container, 90 MB, nothing to operate
One or two hosts, nobody else touches themPortainer BE free tierStrictly more software than CE for the same zero cost
Three or more hosts, compose files in gitKomodoGit-backed sync and one agent per machine, without a cluster
You want builds separated from deploy targetsKomodoAssign a builder host so image builds do not hammer your media server
Anyone else has a login to the UIPortainer BE, or neitherCE has no RBAC that stops container-create from becoming host root
2 GB VPSPortainer CEMongoDB alone will not leave room for the things you are managing
A business dependency, not a homelabPortainer BE2016 codebase and a vendor beats a 2023 project with one maintainer
You already treat git as the source of truthKomodoIt agrees with you; Portainer CE will fight you
You just want logs and metricsNeitherDozzle plus Beszel is smaller than both, see The minimum viable monitoring stack

What to do next#

Whichever you install, do the same first thing: put your compose files in a git repository today, before the manager gets a chance to become the place they live. That single habit makes both of these tools replaceable, which is the property you want in something holding root on your host.

Then size it honestly. Stack planner will tell you whether the machine has room for MongoDB on top of what you are already running, and Docker vs Podman is worth reading first if you have been considering Podman, because neither of these manages it properly.

Questions#

Is Portainer free?

Both editions are, differently. Community Edition is genuinely open source under the zlib licence, currently 2.45.0 LTS, with no key and no outbound validation. Business Edition is proprietary but free forever for up to three nodes, one licence per company as identified by web domain, renewed at no cost each year. For a homelab, BE is strictly more software for the same zero dollars, which is a confusing thing to have to explain.

What does Portainer Business Edition add over CE?

Role-based access control, GitOps with scheduled repository polling, registry management, activity and audit logs, Active Directory integration with group-to-team mapping, and provider templates for OAuth. CE gives you LDAP and generic OAuth login but no RBAC fine-grained enough to stop a user who can create containers from mounting the host filesystem. If you are sharing the UI with anyone, that distinction matters.

Is Komodo production-ready?

For a homelab, yes, with eyes open. The project dates to 2023 under the name Monitor, was renamed Komodo in 2024, and shipped a breaking v2 within the last twelve months that deprecated the :latest tag and migrated the MongoDB schema, with a documented revert path back to v1.19.5. Current is 2.3.3. Assume another major is possible and take a Mongo dump before any upgrade.

Do you need Komodo if you have one Docker host?

No. Komodo's Core plus MongoDB plus a Periphery agent is roughly 250 MB idle and three containers of infrastructure to manage what may be five containers of actual work. On a single box, a directory of compose files plus Dozzle for logs and Beszel for metrics does the job with a fraction of the surface. Komodo starts paying for itself at the second and third machine.

Is it safe to expose Portainer to the internet?

No. Portainer mounts /var/run/docker.sock, which is root-equivalent on that host: anyone who reaches the UI and can create a container can mount the host filesystem into a privileged one. Community Edition has no permission model that prevents this. Put it behind a VPN or a mesh network rather than a port forward, and never behind a reverse proxy alone.

Can Komodo replace Portainer entirely?

For deployment, yes and then some. For casual inspection it is different rather than better: Komodo shows container state, logs and updates, but Portainer's volume browser, image management and exec-into-a-shell flow are more immediate. Plenty of people run both, with Komodo owning deploys and Portainer as a viewer, which is fine as long as you never edit a stack in Portainer that Komodo also manages.

Sources#

Published . Last reviewed . Found something out of date? Tell us and we will fix it and log the change.