Dockpeek is a lightweight, self-hosted Docker dashboard for quick access to your containers.
Open web interfaces, view logs, monitor ports, and update images — all from one clean, intuitive interface.
It automatically detects Traefik labels and works out of the box with zero configuration.
Add labels to your containers to tag them, customize their appearance, or control how dockpeek interacts with them.
dockpeek.https — Force HTTPS protocol for specific portsdockpeek.link — Turn container names into clickable linksdockpeek.ports — Add custom ports to display alongside detected onesdockpeek.port-range-grouping — Control port range grouping (true/false)dockpeek.tags — Organize and categorize containers with custom tags
Container logs view

Checking for updates

Updates available

Light mode

The easiest way to get started with dockpeek:
services:
dockpeek:
image: dockpeek/dockpeek:latest
container_name: dockpeek
environment:
- SECRET_KEY=your_secure_secret_key # Required: Set a secure secret key
- USERNAME=admin # username
- PASSWORD=admin # password
# Server name for UI (optional, auto-detected from Docker API if not set)
# - DOCKER_HOST_NAME=
ports:
- "3420:8000"
volumes:
- /var/run/docker.sock:/var/run/docker.sock
restart: unless-stopped
[!TIP] You can add labels to your other containers to tag them or control how dockpeek interacts with them.
Learn more about available dockpeek labels.
For enhanced security, use a socket proxy to limit Docker API access:
services:
dockpeek:
image: dockpeek/dockpeek:latest
container_name: dockpeek
environment:
- SECRET_KEY=your_secure_secret_key
- USERNAME=admin
- PASSWORD=admin
- DOCKER_HOST=tcp://socket-proxy:2375 # Connect via socket proxy
ports:
- "3420:8000"
depends_on:
- socket-proxy
restart: unless-stopped
socket-proxy:
# alternative: tecnativa/docker-socket-proxy
image: lscr.io/linuxserver/socket-proxy:latest
container_name: dockpeek-socket-proxy
environment:
- CONTAINERS=1
- IMAGES=1
- PING=1
- VERSION=1
- INFO=1
- POST=1
# Required for container updates
- ALLOW_START=1
- ALLOW_STOP=1
- ALLOW_RESTARTS=1
- NETWORKS=1
volumes:
- /var/run/docker.sock:/var/run/docker.sock
read_only: true
tmpfs:
- /run
restart: unless-stopped
Manage multiple Docker hosts from a single dashboard:
services:
dockpeek:
image: dockpeek/dockpeek:latest
container_name: dockpeek
restart: unless-stopped
ports:
- "3420:8000"
environment:
- SECRET_KEY=your_secure_secret_key
- USERNAME=admin
- PASSWORD=admin
# --- Docker Host 1 (Local) ---
- DOCKER_HOST_1_URL=unix:///var/run/docker.sock # Local Docker socket
# DOCKER_HOST_1_NAME= is Optional: Auto-detected from Docker API if not set
# DOCKER_HOST_1_PUBLIC_HOSTNAME= is optional; uses host IP by default
# --- Docker Host 2 (Remote Server) ---
- DOCKER_HOST_2_URL=tcp://192.168.1.100:2375 # Remote socket proxy
- DOCKER_HOST_2_NAME=Production Server # Optional: Auto-detected from Docker API if not set
- DOCKER_HOST_2_PUBLIC_HOSTNAME=server.local # Optional: Custom hostname for links
# --- Docker Host 3 (Tailscale) ---
- DOCKER_HOST_3_URL=tcp://100.64.1.5:2375 # Tailscale IP
- DOCKER_HOST_3_NAME=Remote VPS # Optional: Auto-detected from Docker API if not set
- DOCKER_HOST_3_PUBLIC_HOSTNAME=vps.tailnet.ts.net # Optional: Tailscale FQDN
# --- Continue pattern for additional hosts (4, 5, etc.) ---
volumes:
# Required only if you are connecting to a local socket
- /var/run/docker.sock:/var/run/docker.sock:ro
[!TIP] Dockpeek does not need to be installed on remote devices. Each remote host only needs the Docker API exposed over TCP (e.g. via a Docker Socket Proxy).
| Variable | Description |
|---|---|
SECRET_KEY |
Required. Essential for application functionality and session security |
USERNAME |
Required. Username for dashboard login |
PASSWORD |
Required. Password for dashboard login |
| Variable | Default | Description |
|---|---|---|
PORT |
8000 |
Port on which the application listens |
DISABLE_AUTH |
false |
Set to true to disable authentication |
DOCKER_HOST |
Local socket | Primary Docker connection URL |
DOCKER_HOST_NAME |
Auto-detected | Display name for the primary server (auto-detected from Docker API if not set) |
DOCKER_HOST_PUBLIC_HOSTNAME |
Auto-detected | Optional hostname or IP for generating clickable links |
DOCKER_CONNECTION_TIMEOUT |
2 |
Connection timeout in seconds (eg. 0.5, 5) for Docker host discovery |
UPDATE_FLOATING_TAGS |
disabled |
Update check mode: latest, major (e.g., 8.3.3 → 8), or minor (e.g., 8.3.3 → 8.3) (default: exact tags) |
TRUST_PROXY_HEADERS |
false |
Set to true to enable proxy header support (X-Forwarded-*) |
TRUSTED_PROXY_COUNT |
1 |
Number of trusted proxies when TRUST_PROXY_HEADERS=true |
TRAEFIK_LABELS |
true |
Set to false to hide Traefik column |
TAGS |
true |
Set to false to hide tags column |
PORT_RANGE_GROUPING |
true |
Set to false to disable port range grouping globally |
PORT_RANGE_THRESHOLD |
5 |
Minimum number of consecutive ports to group as a range (see Port Range Grouping) |
CUSTOM_REGISTRY_TEMPLATES |
{} |
URL templates for custom/private registries using {0}, {1}, {2} placeholders (see Custom Registry Templates) |
For additional Docker hosts, use the pattern DOCKER_HOST_N_*:
| Variable | Description |
|---|---|
DOCKER_HOST_N_URL |
Docker API URL (e.g., tcp://host:2375) |
DOCKER_HOST_N_NAME |
Display name in the dashboard (auto-detected from Docker API if not set) |
DOCKER_HOST_N_PUBLIC_HOSTNAME |
Optional public hostname for links |
[!IMPORTANT] Important Configuration Requirements:
SECRET_KEYmust always be set - dockpeek will not function without itUSERNAMEandPASSWORDare required unlessDISABLE_AUTH=true- Multi-host variables require matching
Nidentifiers (URL, name, hostname)
Dockpeek supports custom URL templates for private or self-hosted Docker registries like Gitea, Harbor, or GitLab. This makes registry icons clickable and links directly to your registry's web interface.
Configuration:
environment:
- |
CUSTOM_REGISTRY_TEMPLATES={
"git.example.com": {"urlTemplate": "https://git.example.com/{1}/-/packages/container/{2}"},
"harbor.company.com": {"urlTemplate": "https://harbor.company.com/harbor/projects/{1}/repositories/{2}"}
}
How it works:
The placeholders {0}, {1}, {2}, etc. are replaced with parts of your image name:
For an image like git.example.com/myuser/myapp:latest:
* {0} = git.example.com (registry host)
* {1} = myuser (first path component)
* {2} = myapp (second path component)
* {3}, {4}, etc. for deeper paths if needed
Dockpeek automatically groups consecutive ports into ranges for cleaner display. For example, ports 601, 602, 603, 604, 605, 606 will be displayed as a single range "601-606" instead of individual port badges.
Per-Container Configuration:
labels:
- "dockpeek.port-range-grouping=false" # Disable for this container
- "dockpeek.port-range-grouping=true" # Enable for this container (overrides global)
Customize how containers appear and behave in dockpeek:
services:
webapp:
image: nginx:latest
ports:
- "3001:80"
labels:
- "dockpeek.ports=8080,9090" # Show additional ports
- "dockpeek.https=3001,8080" # Force HTTPS for these ports
- "dockpeek.link=https://myapp.local" # Make container name clickable
- "dockpeek.tags=frontend,production" # Add organization tags
| Label | Purpose | Example |
|---|---|---|
dockpeek.ports |
Show additional ports | dockpeek.ports=8080,9090 |
dockpeek.https |
Force HTTPS for ports | dockpeek.https=9002,3000 |
dockpeek.link |
Custom container link | dockpeek.link=https://app.com |
dockpeek.port-range-grouping |
Control port range grouping | dockpeek.port-range-grouping=false |
dockpeek.tags |
tags | dockpeek.tags=web,prod |
Dockpeek natively supports Docker Swarm, You can deploy dockpeek as a stack, with a single socket-proxy instance, and view/manage all Swarm services and tasks in the dashboard. This configuration is ideal for production clusters using Traefik as an ingress proxy.

Click to see Example stack file (docker-compose-swarm-socket.yml)
``yaml
services:
dockpeek:
image: dockpeek/dockpeek:latest
environment:
- SECRET_KEY=your_secure_secret_key
- USERNAME=admin
- PASSWORD=admin
- TRAEFIK_LABELS=true
- DOCKER_HOST=tcp://tasks.socket-proxy:2375 # Connect to Swarm manager via socket-proxy
ports:
- "3420:8000"
networks:
- traefik
- dockpeek-internal
deploy:
replicas: 1
labels:
- "traefik.enable=true"
- "traefik.http.routers.dockpeek.rule=Host(dockpeek.example.com`)"
- "traefik.http.routers.dockpeek.entrypoints=websecure"
- "traefik.http.routers.dockpeek.tls=true"
- "traefik.http.services.dockpeek.loadbalancer.server.port=8000"
socket-proxy: image: lscr.io/linuxserver/socket-proxy:latest environment: - CONTAINERS=1 - IMAGES=1 - PING=1 - VERSION=1 - INFO=1 - POST=1 - SERVICES=1 # Enable Swarm services API - TASKS=1 # Enable Swarm tasks API - NODES=1 # Enable Swarm nodes API volumes: - /var/run/docker.sock:/var/run/docker.sock:ro - type: tmpfs target: /run tmpfs:
$ claude mcp add dockpeek \
-- python -m otcore.mcp_server <graph>