Más información: https://dockhand.pro
Dockhand es otro gestor de contenedores Docker que tiene una versión de pago tipo profesional o empresarial y luego una versión gratuita para entornos particulares. Actualmente, no hay grandes diferencias entre la versión profesional/empresarial y la gratuita, a excepción de alguna característica, por lo que dispone de todo lo necesario para los que, como nosotros, queremos a la hora de gestionar nuestros contenedores.

Los datos los almacena por defecto con SQLite (aunque también lo puede hacer con PostgreSQL) y puede gestionar tanto contenedores como pilas o staks (donde puedes hacer un docker-compose.yml), imágenes y actualización de las mismas, ver procesos, trazas, conectarte a los contenedores por ssh, se conecta a otros servidores para gestionar sus contenedores... y los cientos de capacidades que también disponen Arcane o Portainer.
Este contenedor, a día de hoy, es el último que estoy probando y es de los más intuitivos que he visto.
Este será el docker-compose.yml a desplegar:
---
services:
dockhand:
image: fnsys/dockhand:latest
container_name: dockhand
restart: unless-stopped
environment:
- PUID=1000 # Your user ID (run: id -u)
- PGID=1000 # Your group ID (run: id -g)
group_add:
- "999" # Docker group GID for socket access
ports:
- 3000:3000
volumes:
- /var/run/docker.sock:/var/run/docker.sock
- ./dockhand:/app/data
Se ejecutará de la siguiente manera:
docker compose up -d
Las variables PUID y PGID corresponden al usuario y grupo que quieras que sea propietario los ficheros que se almacenen, aunque no son necesarias, ya que si las omites, el propietario de los ficheros que se guarden en el directorio ./dockhand será root. Pero si indicas estas variables, has de añadir el GID de Docker que, como puedes observar, es 999 por defecto.
Yo prefiero que no sea Docker el propietario de los ficheros por motivos de seguridad.
Además de poder acceder a servidores remotos con Docker instalado mediante su API, si no quieres exponerla, Dockhand dispone de un agente propio llamado Hawser al cual puedes acceder de modo estándar (LAN/homelab con IP estática) o de modo Edge (VPS, NAT, IP dinámica, servidores con cortafuegos). Para mi caso, como va a ser una conexión interna, utilizaré la versión estándar.
El siguiente ejemplo lo utilizo para que me haga todo el trabajo a la hora de crear/actualizar el contenedor, ya que no lo hago mediante docker-compose.yml. Solo habría que crear un archivo (por ejemplo hawser.sh) y darle permisos de ejecución (por ejemplo chmod 700 hawser.sh) y así lo podrás ejecutar cuando quieras (por ejemplo ./hawser.sh).
#!/bin/bash
container="hawser"
echo "Actualizamos la imagen de $container"
docker pull ghcr.io/finsys/hawser:latest
echo "Paramos $container"
docker stop $container
echo "Borramos el dock de $container"
docker rm $container
echo "Creamos el dock de $container"
docker run -d \
--name="$container" \
--restart unless-stopped \
-v /var/run/docker.sock:/var/run/docker.sock \
-p 2376:2376 \
-e TOKEN=<chorrazo_de_caracteres_superseguros> \
ghcr.io/finsys/hawser:latest
En la variable TOKEN has de poner una cadena de caracteres larga. Por ejemplo, puedes generarla desde el terminal con el comando openssl rand -base64 32.
Una vez generado el contenedor en el equipo remoto, puedes añadirlo como Hawser agent (standard) desde el Dashboard de Dockhand en el símbolo + que tienes en la parte superior derecha.