---
title: "Instalar Dockhand Docker: Gestor de Contenedores Enfocado en Seguridad"
description: "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."
date: 2026-02-09
categories: ["vps"]
tags: ["docker","self-hosted"]
---

import { Picture } from "astro:assets";
import dockhandUi from "@assets/images/26/02/dockerhand-ui.webp";

[Dockhand](https://dockhand.pro/) 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](/es/instalar-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](/es/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.

<Picture
  src={dockhandUi}
  alt="UI de Dockhand Docker Manager mostrando dashboard de contenedores"
/>

Esto es lo que me llamo la atencion:

<ListCheck>
<ul>
<li>Escaneo de vulnerabilidades con Grype y Trivy integrado en la UI</li>
<li>Proteccion safe-pull: escanea nuevas imagenes antes de reemplazar contenedores en ejecucion</li>
<li>OIDC/SSO incluido en el nivel gratuito (Portainer cobra por esto)</li>
<li>Soporte MFA/TOTP para cuentas locales</li>
<li>Navegador de archivos de contenedor y terminal web</li>
<li>Auto-actualizaciones programadas con rollback automatico si algo se rompe</li>
<li>Logging de actividad para cada accion</li>
<li>Notificaciones via SMTP y Apprise</li>
<li>Zero telemetria. Nada llama a casa</li>
</ul>
</ListCheck>

<YouTubeEmbed
  url="https://www.youtube.com/embed/Ew0pn9Djf-0"
  label="Arcane vs Dockhand"
/>

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](https://go.bitdoze.com/hetzner), [Hostinger](https://go.bitdoze.com/hostinger-vps) para hosting VPS
- Docker y Docker Compose instalados
- Funciona en amd64 y arm64 (Raspberry Pi 4 incluido)

<Button link="https://go.bitdoze.com/hetzner" text="Hetzner VPS" />
<Button link="https://go.bitdoze.com/hostinger-vps" text="Hostinger VPS" />
<Button link="https://go.bitdoze.com/do" text="DigitalOcean $100 Gratis" />
<Button link="https://go.bitdoze.com/vultr" text="Vultr $100 Gratis" />

O usa un [Mini PC como servidor casero](https://www.bitdoze.com/best-mini-pc-home-server/).

### Instalar Docker

Si Docker no esta configurado aun:

```sh
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](https://www.bitdoze.com/install-docker-ubuntu-arm/).

## 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:

```bash
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:

```bash
mkdir -p /opt/dockhand
cd /opt/dockhand
```

Crea `compose.yaml`:

```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:

```bash
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:

```yaml
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:
```

<Notice type="warning" title="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.
</Notice>

## 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:

<Tabs>
  <Tab name="Grype">
    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.
  </Tab>

  <Tab name="Trivy">
    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.
  </Tab>
</Tabs>

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.

<Notice type="info" title="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.
</Notice>

## 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.

<Tabs>
  <Tab name="Nginx">

```nginx
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;
    }
}
```

  </Tab>

  <Tab name="Traefik">
    Agrega labels al servicio Dockhand en tu archivo compose:

    ```yaml
    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](https://www.bitdoze.com/traefik-proxy-docker/).
  </Tab>

  <Tab name="Cloudflare Tunnels">
    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.
  </Tab>
</Tabs>

## 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](https://github.com/Finsys/hawser) es open source (Go), separado de Dockhand mismo.

Para configurarlo:

1. En Dockhand, ve a Environments y crea un nuevo host remoto. Esto genera un token
2. En la maquina remota, despliega Hawser:

```bash
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

<Accordion label="Logs de contenedor muestran permission denied" group="troubleshoot" expanded="true">

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:

```bash
getent group docker
```

Usa ese GID como tu valor `PGID`.

</Accordion>

<Accordion label="Escaneos de vulnerabilidades fallan o timeout" group="troubleshoot">

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).

</Accordion>

<Accordion label="Dockhand usa mucha CPU en mi NAS" group="troubleshoot">

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.

</Accordion>

<Accordion label="El agente Hawser no se conecta" group="troubleshoot">

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.

</Accordion>

## 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](/es/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](/es/instalar-usulnet/).

## Articulos relacionados

- [Mejores alternativas a Portainer en 2026](/es/alternativas-portainer/) - cinco UIs de gestion Docker comparadas
- [Arcane vs Dockhand](/es/arcane-vs-dockhand/) - comparacion lado a lado de ambas herramientas
- [Instalar Arcane](/es/instalar-arcane/) - el otro gestor Docker cubierto en esta serie
- [Instalar UsulNet](/es/instalar-usulnet/) - plataforma de gestion Docker todo en uno con escaneo, backups y multi-nodo
- [Instalar Dockge](/es/instalar-dockge/) - otra UI de gestion Docker
- [Mejores contenedores Docker para servidor casero](/docker-containers-home-server/) - que ejecutar una vez configurado tu gestor
- [Mejores paneles self-hosted](/best-self-hosted-panels/) - paneles de gestion de servidor comparados
- [Proxy inverso Traefik para Docker](/traefik-proxy-docker/) - configuracion proper de proxy inverso
- [Auto-actualizacion Docker con Tugtainer](/tugtainer-docker-autoupdate/) - mantener contenedores actualizados
- [Herramientas de monitoreo de servidor](/sever-monitoring/) - monitoreando tu host Docker