Skip to content

Multi-arch (amd64/arm64), distroless, non-root, read-only root filesystem.

Docker — shell
docker run -d --name dockercmd \
  -p 127.0.0.1:8470:8470 \
  --group-add "$(stat -c '%g' /var/run/docker.sock)" \
  --read-only --tmpfs /tmp \
  --security-opt no-new-privileges \
  --cap-drop ALL \
  -v /var/run/docker.sock:/var/run/docker.sock \
  -v dockercmd-data:/data \
  ghcr.io/koduj-dev/docker-commander:latest

On rootless Docker or Docker Desktop the socket is owned by your user — drop the --group-add line. In production, pin an immutable @sha256 digest instead of :latest.

macOS and Linux. Installs the signed release binary for your OS and architecture.

Homebrew — shell
brew install koduj-dev/tap/dockercmd
dockercmd --version

Grab your OS and architecture from the Releases page. Debian/Ubuntu and Fedora users can take a .deb or .rpm, which sets up the systemd service.

Binary — shell
chmod +x dockercmd-linux-amd64
./dockercmd-linux-amd64          # http://127.0.0.1:8470

sudo ./dockercmd-linux-amd64 --install-service   # optional: run it 24/7

On Windows, run dockercmd-windows-amd64.exe from a terminal.

Needs Go ≥ 1.25 and Node.js ≥ 18 to build the UI, plus a running Docker daemon.

From source — shell
git clone https://github.com/koduj-dev/docker-commander.git
cd docker-commander
make build      # builds the UI, then embeds it in the binary
./dockercmd     # http://127.0.0.1:8470

Or, without the UI build step: go install github.com/koduj-dev/docker-commander/cmd/dockercmd@latest

Compatibility

Tested against real Docker, not assumed

Most tools just claim a version floor. A nightly job instead points the whole Docker integration suite at a pinned build of each Engine major below and reports what actually happens — so this list is a live result, not a guess.

  • Engine 24.x
  • Engine 25.x
  • Engine 26.x
  • Engine 27.x
  • Engine 28.x
  • Engine 29.x

Minimum Engine API 1.43 (Engine 24) · docker compose plugin v2 or newer — legacy docker-compose v1 is not supported · the client SDK negotiates down to whatever your daemon speaks, so a newer build talks to an older one without any configuration.

See tonight's run