Instalar Dockhand Docker: Gestor de Contenedores Enfocado en Seguridad
Guia paso a paso para instalar Dockhand con Docker Compose. Cubre configuraciones SQLite y PostgreSQL, OIDC/SSO, escaneo de vulnerabilidades, auto-actualizaciones y gestion de hosts remotos con Hawser.
Dockhand lanzo su primer release en Diciembre 2025 y ha estado sacando actualizaciones a un ritmo que raramente veo de proyectos nuevos. Dieciseis releases en aproximadamente dos meses. Lo instale junto con Arcane en el mismo servidor para ver como se comparan, y mientras Arcane tiene la ventaja de madurez, las features de seguridad de Dockhand captaron mi atencion.
Si estas tratando de decidir entre los dos, lee primero mi comparacion Arcane vs Dockhand. Esta guia es para personas que ya decidieron por Dockhand y quieren que funcione properly.
Lo que Dockhand trae a la mesa
Dockhand es una UI de gestion Docker construida sobre Bun y SvelteKit. El angulo de seguridad es lo que lo hace diferente de otras opciones en este espacio.
Esto es lo que me llamo la atencion:
- Escaneo de vulnerabilidades con Grype y Trivy integrado en la UI
- Proteccion safe-pull: escanea nuevas imagenes antes de reemplazar contenedores en ejecucion
- OIDC/SSO incluido en el nivel gratuito (Portainer cobra por esto)
- Soporte MFA/TOTP para cuentas locales
- Navegador de archivos de contenedor y terminal web
- Auto-actualizaciones programadas con rollback automatico si algo se rompe
- Logging de actividad para cada accion
- Notificaciones via SMTP y Apprise
- Zero telemetria. Nada llama a casa
La imagen de contenedor esta construida desde cero usando paquetes Wolfi via apko. Sin capa base Alpine o Debian con paquetes que no necesitas. Menor superficie de ataque por diseno.
Una cosa a saber: Dockhand usa licencia BSL 1.1. Gratis para uso personal y de negocios internos. No puedes revenderlo como servicio hosteado. La licencia se convierte a Apache 2.0 en 2029. Para self-hosting, esto no importa.
Requisitos previos
Necesitas:
- Un servidor Linux (VPS o local). Uso Hetzner para hosting VPS
- Docker y Docker Compose instalados
- Funciona en amd64 y arm64 (Raspberry Pi 4 incluido)
O usa un Mini PC como servidor casero.
Instalar Docker
Si Docker no esta configurado aun:
sudo apt-get update
sudo apt-get install ca-certificates curl gnupg lsb-release
sudo mkdir -p /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/debian/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
jammy stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-compose-plugin docker-compose
Recorrido completo: Instalar Docker y Docker-compose para Ubuntu.
Instalar Dockhand con Docker Compose
Tienes tres opciones dependiendo de tus necesidades: un comando unico rapido, compose basado en SQLite, o compose con PostgreSQL. Cubrire las tres.
Instalacion rapida (comando unico)
Si solo quieres probar:
docker run -d \
--name dockhand \
--restart unless-stopped \
-p 3000:3000 \
-v /var/run/docker.sock:/var/run/docker.sock \
-v dockhand_data:/app/data \
fnsys/dockhand:latest
Eso es todo. Abre http://ip-de-tu-servidor:3000 y crea tu cuenta de administrador. Para una configuracion permanente, usaria uno de los metodos compose de abajo.
Docker Compose con SQLite (recomendado para la mayoria)
Crea un directorio y archivo compose:
mkdir -p /opt/dockhand
cd /opt/dockhand
Crea compose.yaml:
services:
dockhand:
image: fnsys/dockhand:latest
container_name: dockhand
restart: unless-stopped
ports:
- "3000:3000"
volumes:
- /var/run/docker.sock:/var/run/docker.sock
- dockhand_data:/app/data
volumes:
dockhand_data:
Inicia:
docker compose up -d
Abre http://ip-de-tu-servidor:3000. El asistente de primera ejecucion te guia para crear una cuenta de administrador. SQLite es la base de datos por defecto y funciona bien para configuraciones de servidor unico. Los datos viven en el volumen dockhand_data.
Docker Compose con PostgreSQL
Si gestionas muchos contenedores o quieres la base de datos ejecutandose separadamente para propositos de backup, usa PostgreSQL:
services:
postgres:
image: postgres:16-alpine
container_name: dockhand-db
restart: unless-stopped
environment:
POSTGRES_USER: dockhand
POSTGRES_PASSWORD: cambia-esta-contrasena
POSTGRES_DB: dockhand
volumes:
- postgres_data:/var/lib/postgresql/data
dockhand:
image: fnsys/dockhand:latest
container_name: dockhand
restart: unless-stopped
ports:
- "3000:3000"
environment:
DATABASE_URL: postgres://dockhand:cambia-esta-contrasena@postgres:5432/dockhand
volumes:
- /var/run/docker.sock:/var/run/docker.sock
- dockhand_data:/app/data
depends_on:
- postgres
volumes:
postgres_data:
dockhand_data:
Cambia la contrasena de la base de datos
Reemplaza cambia-esta-contrasena en ambos campos POSTGRES_PASSWORD y DATABASE_URL con una contrasena fuerte real. Usa la misma contrasena en ambos lugares.
Configurar escaneo de vulnerabilidades
Esta es una de las mejores features de Dockhand y esta incluida en el nivel gratuito. Puedes escanear tus imagenes de contenedor por vulnerabilidades conocidas usando Grype o Trivy.
Despues de iniciar sesion, ve a la pagina de configuracion y habilita el escaneo de vulnerabilidades. Elige tu escaner:
Grype es la opcion por defecto. Es rapido, desarrollado por Anchore, y obtiene datos de vulnerabilidades de multiples fuentes. Los escaneos corren contra tus imagenes locales sin enviar nada a servidores externos.
Trivy de Aqua Security es la otra opcion. Soporta mas objetivos de escaneo (paquetes OS, dependencias especificas de lenguaje, archivos IaC) pero es ligeramente mas lento. Si necesitas escaneo mas profundo mas alla de imagenes de contenedor, Trivy es la mejor opcion.
La feature safe-pull se vincula al escaneo. Cuando Dockhand auto-actualiza un contenedor, descarga la nueva imagen, la escanea por vulnerabilidades, y solo cambia si el escaneo pasa. Si la nueva imagen tiene problemas, tu contenedor en ejecucion permanece intacto. Esto me atrapo dos actualizaciones de imagen malas en tres semanas.
Auto-actualizaciones programadas
Dockhand puede verificar por nuevas imagenes de contenedor en un horario y actualizarlas automaticamente. Combinado con la proteccion safe-pull mencionada arriba, esto es realmente utilizable en la practica. Digo “realmente utilizable” porque la mayoria de las herramientas de auto-actualizacion no verifican que la nueva imagen funcione antes de cambiarla.
Configura esto por contenedor o por stack en la UI. Eliges un horario (ej., diario a las 3am), y Dockhand maneja el resto. Si una actualizacion falla o el nuevo contenedor no inicia properly, hace rollback.
Configurar OIDC/SSO
El soporte OIDC es gratis en Dockhand. Sin nivel pago necesario. Si ejecutas Authentik, Keycloak, o cualquier otro proveedor OIDC, puedes configurar single sign-on.
En la UI de Dockhand, ve a Settings y configura tu proveedor OIDC con:
- Client ID
- Client secret
- Issuer URL / Discovery URL
Los usuarios son aprovisionados automaticamente en el primer login. Una vez que OIDC funciona, puedes ocultar el login con contrasena local configurando la variable de entorno DISABLE_LOCAL_LOGIN. Asi los usuarios solo pueden autenticarse a traves de tu proveedor de identidad.
MFA es separado de OIDC
Si estas usando cuentas locales en lugar de OIDC, Dockhand soporta MFA basado en TOTP. Cada usuario puede habilitarlo desde la configuracion de su perfil. Si estas usando OIDC, MFA es manejado por tu proveedor de identidad.
Configuracion de proxy inverso
Dockhand corre en el puerto 3000 por defecto. Para SSL y un dominio proper, pon un proxy inverso frente a el. El soporte WebSocket es necesario para logs de contenedor en vivo y metricas.
server {
listen 443 ssl http2;
server_name dockhand.tudominio.com;
ssl_certificate /ruta/a/cert.pem;
ssl_certificate_key /ruta/a/key.pem;
location / {
proxy_pass http://127.0.0.1:3000;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
} Agrega labels al servicio Dockhand en tu archivo compose:
labels:
- "traefik.enable=true"
- "traefik.http.routers.dockhand.rule=Host(`dockhand.tudominio.com`)"
- "traefik.http.routers.dockhand.entrypoints=websecure"
- "traefik.http.routers.dockhand.tls.certresolver=letsencrypt"
- "traefik.http.services.dockhand.loadbalancer.server.port=3000"Configuracion completa de Traefik: Como usar Traefik como proxy inverso en Docker.
Apunta un tunnel a http://localhost:3000. El manejo de SSL y WebSocket es automatico. Esta es la opcion mas facil si no quieres gestionar certificados o abrir puertos.
Gestionar hosts remotos con Hawser
Dockhand puede gestionar Docker en maquinas remotas a traves del agente Hawser. Lo que hace interesante a Hawser es la traversia NAT. El agente hace conexiones solo salientes, asi que no necesitas abrir ningun puerto en la maquina remota. Funciona detras de firewalls y NAT sin configuracion especial de red.
Hawser es open source (Go), separado de Dockhand mismo.
Para configurarlo:
- En Dockhand, ve a Environments y crea un nuevo host remoto. Esto genera un token
- En la maquina remota, despliega Hawser:
docker run -d \
--name hawser \
--restart unless-stopped \
-v /var/run/docker.sock:/var/run/docker.sock \
fnsys/hawser:latest \
--token TU_TOKEN \
--server https://dockhand.tudominio.com
El agente se conecta a tu instancia de Dockhand y el host remoto aparece en tu dashboard. Auth basado en token, auto-reconexion en problemas de red. Hay modos Standard y Edge dependiendo de si la maquina remota tiene conectividad consistente.
Referencia de variables de entorno
| Variable | Default | Que hace |
|---|---|---|
DATABASE_URL | SQLite | String de conexion PostgreSQL |
PUID / PGID | 1000 | Usuario/grupo para propiedad de archivos |
DISABLE_LOCAL_LOGIN | false | Ocultar login con contrasena cuando SSO esta activo |
SKIP_DF_COLLECTION | false | Saltar recoleccion de uso de disco (util en dispositivos NAS) |
DATA_DIR | /app/data | Ruta de directorio de datos personalizado |
Solucion de problemas
Logs de contenedor muestran permission denied
Verifica que los valores PUID y PGID coinciden con un usuario con acceso al socket Docker. En la mayoria de sistemas, el socket Docker pertenece al grupo docker. Encuentra el ID del grupo con:
getent group dockerUsa ese GID como tu valor PGID.
Escaneos de vulnerabilidades fallan o timeout
El primer escaneo toma mas tiempo porque Grype o Trivy necesita descargar la base de datos de vulnerabilidades. Escaneos subsecuentes son mas rapidos. Si sigue timeout, verifica que el contenedor tiene acceso a internet (resolucion DNS, HTTPS saliente).
Dockhand usa mucha CPU en mi NAS
Configura SKIP_DF_COLLECTION=true en tus variables de entorno. La recoleccion de uso de disco puede ser pesada en ciertos dispositivos NAS con muchos puntos de montaje.
El agente Hawser no se conecta
Verifica que el token es correcto y la URL de Dockhand es alcanzable desde la maquina remota. Hawser hace conexiones HTTPS salientes, asi que la maquina remota necesita poder alcanzar tu instancia de Dockhand en el puerto 443. Revisa las reglas de firewall en el trafico saliente de la maquina remota.
Precios
Vale la pena ser claro sobre esto. Dockhand tiene un modelo de precios escalonado:
| Nivel | Costo | Que obtienes |
|---|---|---|
| Gratis | $0 | Features completas para uso homelab, OIDC/SSO incluido |
| SMB | $499/host/ano | Soporte comercial, actualizaciones prioritarias |
| Enterprise | $1,499/host/ano | RBAC, LDAP/AD, audit logging, soporte dedicado |
El nivel gratuito es legitimo full-featured. OIDC, escaneo de vulnerabilidades, auto-actualizaciones, multi-host, todo incluido. Solo necesitas pagar si necesitas RBAC, LDAP o soporte comercial. Eso es mejor que lo que Portainer ofrece en el nivel gratuito.
Mi opinion despues de tres semanas
Dockhand es un producto v1 que no lo parece. La UI esta pulida, las features de seguridad funcionan bien, y el ritmo de actualizaciones muestra que el equipo esta enviando activamente.
La feature safe-pull es mi cosa favorita de el. Configure auto-actualizaciones en todos mis contenedores no criticos y deje que corra. Atrapo dos actualizaciones de imagen malas escaneandolas antes de desplegar. Ambas veces, mis contenedores en ejecucion quedaron intactos mientras las nuevas imagenes fueron marcadas.
Lo que me da pausa es la edad del proyecto. Setenta y cuatro commits, siete contribuidores, primer release hace dos meses. Arcane ha estado desde 2022 con mas de 1,800 commits y 35 contribuidores. Ese tipo de madurez toma tiempo de construir, y habra casos extremos que Dockhand aun no ha encontrado.
Si las features de seguridad son tu prioridad y puedes tolerar un proyecto mas nuevo, Dockhand vale la pena instalar. Si quieres algo mas probado en batalla, revisa como instalar Arcane. Y si quieres una plataforma todo en uno que agrupa gestion de contenedores con backups, configuracion de proxy inverso y monitoreo, revisa UsulNet.
Articulos relacionados
- Mejores alternativas a Portainer en 2026 - cinco UIs de gestion Docker comparadas
- Arcane vs Dockhand - comparacion lado a lado de ambas herramientas
- Instalar Arcane - el otro gestor Docker cubierto en esta serie
- Instalar UsulNet - plataforma de gestion Docker todo en uno con escaneo, backups y multi-nodo
- Instalar Dockge - otra UI de gestion Docker
- Mejores contenedores Docker para servidor casero - que ejecutar una vez configurado tu gestor
- Mejores paneles self-hosted - paneles de gestion de servidor comparados
- Proxy inverso Traefik para Docker - configuracion proper de proxy inverso
- Auto-actualizacion Docker con Tugtainer - mantener contenedores actualizados
- Herramientas de monitoreo de servidor - monitoreando tu host Docker