Virtualmin Docker — module update: full Docker management with Virtualmin proxy integration (v1.5.2)

Hi all,

I’ve pushed a substantial update to my Virtualmin Docker module. The headline
addition since the last announcement is two-way Virtualmin integration: the
module now not only shows which of your virtual servers proxy to which container,
it can reconnect them when a container’s port changes — on both Apache and
Nginx.

It’s GPLv2, free, and installs like any other Webmin module.

Download: https://github.com/MrZaKaRiA/Virtualmin-Docker/releases/latest/download/docker.wbm.gz
Source: GitHub - MrZaKaRiA/Virtualmin-Docker: Webmin Virtualmin Docker · GitHub


Why this module

If you run apps in Docker behind Virtualmin virtual servers, you’re usually
juggling two panels: Virtualmin for the domain and reverse proxy, and a terminal
(or Portainer) for the containers. This module puts Docker under
Servers → Docker and teaches it about your Virtualmin domains, so the two
sides finally know about each other.

It’s also written to be safe to run as root — more on that at the bottom.


Virtualmin integration

See the link between domains and containers. The container list has a
“Proxied to” column showing the domain(s) whose Website Proxy points at each
container, matched by published port and linked through to the live site.

A new “Domains & Proxies” page shows the health of every domain proxy:

  • Green — served correctly by a running container.
  • Red — needs reconnecting. The domain’s own app is running, but on a
    different port (e.g. a Compose update moved it from 3000 to 3001). The module
    works out the correct port from the project’s compose file location and offers
    a one-click Fix now.
  • Orange — not deployed. The domain proxies to a port with no container at
    all. These are listed quietly as information, not flagged as errors, so a few
    planned-but-not-yet-deployed subdomains don’t drown the page in red.

Reconnecting uses Virtualmin’s own API and reloads the web server for you. It
works with Apache (proxy balancers) and Nginx (sets the domain’s
proxy_pass and regenerates the config through the plugin). A per-domain
diagnose view shows exactly what Virtualmin reports if you want the detail.

You can also connect a domain to a container’s port directly from that
container’s Manage tab.


Docker Compose

  • Project list showing each project’s status, config file and the Virtualmin
    domain it belongs to.
  • One-click Update — pulls the image versions set in your
    docker-compose.yml / .env and recreates the containers. (A plain restart
    never applies a new version; this is the button that does.) Named volumes —
    databases, uploads, settings — are kept.
  • Every action passes an explicit --project-name, taken from
    docker compose ls. This matters: without it, Docker can re-derive a different
    project name and silently build a second stack with empty volumes instead of
    upgrading the one you have. Pinning it guarantees the existing stack is
    upgraded in place.
  • Old-copy detection — warns if a standalone container is running the same
    app as a Compose project (the classic “why is my site still on the old
    version?” situation, where the old copy still holds the domain and the data).
  • Restart / stop / start / down / logs / status, plus an advanced form to run an
    action against any compose file by path.
  • Edit .env in the browser — change a version tag, save (file ownership and
    permissions are preserved), then click Update to apply it.

Containers

  • List with live CPU/memory, ports, proxied domains and health.
  • Start, stop, restart, pause, unpause, kill, remove, rename, update resources
    (memory / CPUs / PID limit / restart policy), clone.
  • Bulk select-and-act across many containers.
  • Per-container tabs:
    • Logs — timestamps, “since” filter, text search, auto-refresh, download.
    • Details — readable summary: image, state and health, created/started,
      restart policy, Compose project, entrypoint/command, ports, mounts, networks,
      environment.
    • Inspect — the raw JSON when you want it.
    • Network — connect/disconnect the container to networks.
    • Processesdocker top.
    • Stats — CPU, memory, network and block I/O, PIDs.
    • Exec — non-interactive command execution with quick-command buttons, plus
      host ↔ container file copy.

Images, storage, backup and maintenance

Images — list, inspect, history, remove, pull, push, tag, build from an
inline Dockerfile, run a new container, Docker Hub search, and prune.

Storage — volumes and networks: list, inspect, create, remove, prune.

Backup & restore

  • Images: save to / load from a host tar (docker save / docker load).
  • Containers: commit to a new image, or export the filesystem.
  • Volumes: back up and restore a local volume as a .tar.gz.

Maintenancesystem prune and build-cache prune, with a live preview of
exactly what would be deleted
before you confirm: stopped containers, unused
volumes and leftover images, each tagged in red where it looks like a
DATABASE or belongs to domain X. Every destructive action explains its
consequences in plain language first.

Security scanning — image vulnerability scans via Docker Scout or
Trivy (the removed docker scan is not used).

Registry & contexts — log in to a private registry, and switch the Docker
context the module talks to (so rootless Docker works).

Monitoring — “Docker Up” and “Docker Container Up” monitor types for the
System and Server Status module, plus a Docker panel on the Webmin dashboard.


Built for people who aren’t Docker experts

Every risky button explains what it actually does, in plain words — e.g. that
Restart does not load a new version, that Stop takes the site offline but
deletes nothing, that Down removes containers but keeps volume data. Destructive
actions show a red confirmation listing precisely what will be removed.

The interface is built entirely from Webmin’s own UI components, so it inherits
your theme (Authentic or otherwise) and looks like the rest of the panel rather
than a bolted-on app.


Security

The module runs as root, so it’s written defensively:

  • No shell injection. Webmin executes commands through /bin/sh, so every
    value that comes from a form, a config file or Docker output is single-quote
    escaped before it goes near a command; constant flags stay literal. Values can
    never be read as extra flags or shell metacharacters.
  • Allowlist validation of container/image/volume/network identifiers before
    use — control characters, leading dashes and path traversal are rejected.
  • All state changes are POST-only, covered by Webmin’s trusted-referer check,
    and recorded with webmin_log so they show up in the Actions Log.
  • Registry passwords go to docker login --password-stdin via the child
    process’s stdin — never on a command line, and not stored by the module.
  • Per-user ACLs: view, manage, create, delete, exec, prune, backup, proxy,
    registry and context can each be granted or denied under
    Webmin Users → user → Docker.
  • All Docker output is HTML-escaped before display.

Requirements

  • Webmin (or Virtualmin) and the Docker engine + CLI
  • Perl JSON::PP (ships with Perl 5.14+)
  • Optional: docker compose v2 for the Compose features, and docker scout or
    trivy for scanning
  • The Virtualmin features are optional — on a plain Webmin host they simply don’t
    appear.

Install

The quickest way: Webmin → Webmin Configuration → Webmin Modules →
From ftp or http URL
, paste this and click Install Module:


https://github.com/MrZaKaRiA/Virtualmin-Docker/releases/latest/download/docker.wbm.gz

Or from the shell:

wget https://github.com/MrZaKaRiA/Virtualmin-Docker/releases/latest/download/docker.wbm.gz
/usr/share/webmin/install-module.pl docker.wbm.gz

Then open Servers → Docker. Upgrading over an existing install keeps your settings and per-user ACLs. The dashboard panel appears once the System and Server Status module is enabled.


Feedback, bug reports and feature requests are very welcome — issues and PRs at Issues · MrZaKaRiA/Virtualmin-Docker · GitHub

Hope it’s useful to everyone running Docker apps behind Virtualmin.

1 Like

Thanks, but a new Virtualmin Podman plugin created by us will be released with Virtualmin 8.2.0 soon.

More details are here:

1 Like

Will Podman be for pros only?

As a Virtualmin integration, it will be part of the Pro subscription, while the Webmin Podman module will be a free addition (some time in the future).

just for curiosity, what are the benefits of Virtualmin Pro now?
I ask because for a non profit if most functions are available in GPL or will be after time I have to justify the expanse.

For those of us that don’t know. You are saying the Podman plugin handles Docker?

Personally, I’ve accumulated several domains over the years when the company I worked for paid for them. I have enough that the basic PRO won’t even cover them. I’m stubbornly holding onto them for whatever reason. :wink:

I don’t understand what “now” means or what, in particular, has changed. The Virtualmin Podman/Docker plugin is just about to be released. It hasn’t seen the light of day in production yet.

And the Webmin Podman module that I plan to add to Webmin core in the future won’t provide integration with virtual servers. Instead, it will be a more general tool for managing containers. There will still be enough incentive to get the Virtualmin Podman plugin for those who want to use containers for easy, one-click deployment of virtual servers.

The plugin uses Podman as the container runtime, but Podman can run standard Docker/OCI images and pull them from registries such as Docker Hub.

So most images published “for Docker” will work with Podman.

Podman is a better, actually Open Source, implementation of what Docker does. Both run the same containers from the same sources. And, podman uses the same CLI commands and options, you can generally replace docker some options with podman some options exactly without any changes.

When someone says “Docker” they usually mean “container that happened to be started by the docker command”. You don’t need the docker command, specifically, to start that container.

Podman is a safer tool for managing containers, better integrated into Linux systems. And, it can use dockerhub, if that’s where you want to get your containers, though there are many container registries.

And another major advantage is that Podman treats rootless ops as a first-class design. Docker also offers a rootless mode, but it requires additional configuration around the Docker Engine.

Podman is daemonless, and most commands can naturally run as an ordinary user, which makes it particularly well suited to Virtualmin, where each domain owner’s containers can run independently without relying on a privileged central daemon.

1 Like
  • account resource management
  • hopefully fully containerisation (like cageFS) in the near future :slight_smile: (this is an excellent pro feature)
  • email logs
  • additional install scripts
  • supporting the team
1 Like

Maybe Container Plugin would be a more apt name? At least for those searching for a new panel.

Yes, but not like CageFS, at least as I understand CageFS. We’re working on namespace-based containerization of users (using bubblewrap: GitHub - containers/bubblewrap: Low-level unprivileged sandboxing tool used by Flatpak and similar projects · GitHub). Transparent to users, battle-tested by major projects, very lightweight (basically instant and near-zero overhead, as it’s based around kernel features that are always active), and probably none of the risks of chroot-based options.