KubeBolt docs
GitHub

Docker Desktop Guide

Run the containerised KubeBolt against Docker Desktop's built-in Kubernetes.

This page is about running KubeBolt in containers against Docker Desktop’s built-in Kubernetes. If you install with Homebrew or krew, KubeBolt runs on the host, reaches 127.0.0.1:6443 like any other tool, and none of this applies.

The Problem

Docker Desktop’s Kubernetes publishes its API server at 127.0.0.1:6443. That address works from your machine, but inside a container localhost is the container itself, so KubeBolt cannot reach the cluster.

The Solution

The helper script copies your kubeconfig to /tmp/docker-kubeconfig and rewrites 127.0.0.1 and localhost to kubernetes.docker.internal, which Docker Desktop resolves to the host:

Both the helper and the compose file are files in the git repository, so the Compose path starts with a clone:

# 1. Enable Kubernetes in Docker Desktop → Settings → Kubernetes → Enable
# 2. Get the repo — deploy/docker-compose.yml and the helper live in it
git clone https://github.com/clm-cloud-solutions/kubebolt.git
cd kubebolt

# 3. Switch context
kubectl config use-context docker-desktop

# 4. Generate the container-compatible kubeconfig
./deploy/docker-kubeconfig.sh

# 5. Start
cd deploy && docker compose up -d

The helper is not optional, and not only for Docker Desktop. The compose file mounts /tmp/docker-kubeconfig, not ~/.kube, so every Compose install runs the script first. On a remote cluster it rewrites nothing and simply copies the file.

The same applies to the single-container image, which also needs the rewritten file — and therefore the checkout for the helper too. The image runs as a non-root user, so mount the file somewhere readable and point KUBECONFIG at it rather than mounting under /root:

./deploy/docker-kubeconfig.sh
docker run -p 3000:3000 \
  -v /tmp/docker-kubeconfig:/kubeconfig:ro -e KUBECONFIG=/kubeconfig \
  ghcr.io/clm-cloud-solutions/kubebolt:latest

Log in

Authentication is on by default. On first boot KubeBolt seeds an admin user and prints the generated password once:

docker compose logs api | grep "Generated admin password"

Set your own with KUBEBOLT_ADMIN_PASSWORD before the first start — simpler than reading the log. Outside Kubernetes there is no Secret to fall back on, so if you lose the password, reset it against the same data volume (the API has to be stopped first — BoltDB is single-writer):

docker compose stop api
docker compose run --rm api --reset-admin-password=NEWPASS
docker compose start api

See Authentication for the Kubernetes equivalents.

The first admin login opens the Setup Wizard — four optional steps you can skip.

Ports

PortService
3000Web UI, the one you open
8080Go API, HTTP and WebSocket
9090gRPC channel for the agent
8428VictoriaMetrics

Compose is the local option that bundles VictoriaMetrics, so it is the one that keeps 30 days of history. The Homebrew and docker run paths carry no time series database: live usage from Metrics Server still shows, but history charts stay empty unless you point KUBEBOLT_METRICS_STORAGE_URL at a VictoriaMetrics.

Metrics Server

Docker Desktop does not ship Metrics Server. It is recommended, not required: without it the live commitment bars on Overview read “no data”, and historical CPU and memory still work through the agent. Install it with:

kubectl apply -f https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml

The --kubelet-insecure-tls patch you may have seen elsewhere is a kind and k3d workaround, not a Docker Desktop one.

Do I need the agent?

No. With a kubeconfig KubeBolt talks to the cluster directly. The agent exists for clusters whose API server you cannot reach, which is not the case on your own machine.

What to expect

Docker Desktop is a documented target, but treat it as a development environment rather than a production one. KubeBolt needs Kubernetes v1.24 or newer for full features, and works with degraded features on v1.20–v1.23 (see Compatibility).