Docker Management war noch nie so einfach! | Dockhand
Übersicht
Heute geht es um Dockhand, eine zentrale Management-Oberfläche für Docker- und Docker-Compose-Umgebungen.
Dockhand ermöglicht es, Container, Stacks, Images, Volumes und Netzwerke bequem über eine Weboberfläche zu verwalten. Besonders praktisch sind Funktionen wie Git-Integration, Vulnerability-Scans, zentrale Serververwaltung und die Remote-Anbindung über den Hawser-Agent.
Damit eignet sich Dockhand perfekt für Homelab-Setups und alle, die mehrere Docker-Hosts übersichtlich verwalten möchten.
Das passende Video zum Beitrag findest du hier: https://youtu.be/mMsLTlcMBPo
Installation
Docker
Da wir Dockhand mit Docker betreiben möchten, installieren wir als Erstes natürlich erstmal Docker selbst, falls noch nicht geschehen. Das können wir ganz einfach mit dem offiziellen Convenience Script von Docker machen.
curl -fsSL https://get.docker.com -o get-docker.sh
sudo sh get-docker.sh
Verzeichnis
Bevor wir fortfahren, müssen wir uns ein geeignetes Verzeichnis erstellen, wo wir Dockhand später laufen lassen wollen. Ich habe meine Docker-Compose-Stacks immer gerne unter /opt, darunter erstelle ich einen neuen Ordner für Dockhand mit:
sudo mkdir /opt/dockhand
cd /opt/dockhand
Docker Compose
Als Nächstes benötigen wir natürlich das docker-compose.yml File. Hier habe ich einige kleine Anpassungen vorgenommen. Das DATA_DIR habe ich zu einem Bind-Mount angepasst, direkt im Dockhand-Ordner, um später die Möglichkeit zu haben, komfortabel auf die Compose-Files und Co. zugreifen zu können.
Dann habe ich auch hier wieder ein reverse-proxy Netzwerk hinzugefügt, um später via dem Nginx Proxy Manager komfortabel mit einer gültigen Domain von Zuhause aus zugreifen zu können.
services:
dockhand:
container_name: dockhand
image: fnsys/dockhand:latest
restart: unless-stopped
ports: # Sektion kann mit Reverse Proxy weggelassen werden.
- 3000:3000 #
environment:
- DATA_DIR=/opt/dockhand
volumes:
- /var/run/docker.sock:/var/run/docker.sock
- /opt/dockhand:/opt/dockhand
networks:
- reverse-proxy
- default
networks:
default:
name: dockhand_net
reverse-proxy:
external: true
Start
Nachdem wir nun also die docker-compose.yaml in unserem Dockhand-Verzeichnis haben, können wir die Container starten.
sudo docker compose up -d
Reverse Proxy
Wie erwähnt, möchte ich Dockhand nun direkt über eine gewünschte Domain und per https erreichen. Dafür habe ich ein Reverse-Proxy-Setup auf meinem Docker-Host implementiert, der dies super einfach macht. In dem aktuellen Lab basiert das auf dem Nginx Proxy Manager. Eine weitere und noch schlankere Möglichkeit ist die Umsetzung mit Caddy.
Um jetzt Dockhand erreichen zu können, haben wir bereits das reverse-proxy Docker-Netzwerk zu dem Container hinzugefügt. Nun können wir im Nginx Proxy Manager einfach einen neuen Host mit dem entsprechenden Containernamen hinzufügen und geben den eigentlichen Port an.

Erste Schritte
Alles ist bereit, um Dockhand zu benutzen. Wenn wir jetzt zu unserer Domain navigieren, landen wir direkt bei Dockhand und können loslegen. Per Default gibt es keine Benutzer, die können wir aber anlegen, um unsere Instanz entsprechend abzusichern.

Environment hinzufügen
Als Erstes müssen wir unseren Dockhand-Server als Environment hinzufügen, um darauf Docker-Projekte via Dockhand deployen zu können.
Dafür klicken wir auf Go to Settings. Dort angekommen, gehen wir auf Add environment.
General
Hier können wir nun unseren ersten Server hinzufügen, den Dockhand-Server selber. Im ersten Tab geben wir Informationen zu dem Host an.

Updates
Im Reiter Updates können wir global für den Server Update-Checks & Auto-Updates für die darauf laufenden Container konfigurieren. Wir können auch angeben, ob ungenutzte Images automatisch zu einer bestimmten Zeit gelöscht werden sollen, um das System sauber zu halten.

Activity
Unter Activity können wir bestimmen, ob Dockhand Informationen über das System sammeln und anzeigen soll, wie bspw. CPU- und RAM-Auslastung. Es kann außerdem eingestellt werden, ob wir bei bestimmten Speicherverbrauch informiert werden sollen.

Security
In diesem Tab können wir ein cooles Feature von Dockhand aktivieren, und zwar das Scannen von Docker-Images auf Schwachstellen. Das ist wirklich cool und gibt uns eine Übersicht über die Sicherheit und mögliche Schwachstellen unserer Container.

Notifications
Im letzten Tab können wir noch Notifications bzw. die Wege, über die wir benachrichtigt werden sollen, hinterlegen. Dafür müssen aber erst welche konfiguriert werden.

Administration & Oberfläche
Dashboard
Nach Hinzufügen des Servers sehen wir unter dem Reiter Dashboard jetzt unseren ersten Server und auch, dass bereits 2 Container laufen. Außerdem erhalten wir Infos über das System, RAM, CPU etc.

Containers
Klicken wir auf unser gewünschtes Environment, wählen wir es quasi aus und werden zum Tab Containers geleitet. Hier sehen wir alle Container auf dem System inklusive Informationen dazu. Außerdem wird uns die Zugehörigkeit zu den Docker-Compose Stacks angezeigt.

Logs
Im Reiter Logs finden wir, wie der Name sagt, sämtliche Logs von allen Containern. Wir haben hier verschiedene Möglichkeiten, wie wir die Logs angezeigt bekommen möchten.
Beispielsweise kann man hier Logs von mehreren Containern gruppieren und gleichzeitig zeigen lassen oder auch die Logs einzelner Container prüfen.

Shell
Der Reiter Shell gibt uns die Möglichkeit, uns direkt mit einem Container zu verbinden und darin auf der Shell zu agieren.

Stacks
Einer der wichtigen Reiter ist Stacks. Hier finden wir alle auf dem Server laufenden Docker-Compose Stacks und sämtliche Infos darüber. Wir haben hier die Möglichkeit, unsere Stacks zu bearbeiten, zu starten/stoppen oder auch neue anzulegen.

From Git
Wenn wir oben rechts From Git wählen, haben wir die Möglichkeit, ein Compose-Stack aus einer Git-Repository zu ziehen und zu starten. Dies kann so konfiguriert werden, dass jede Änderung an Compose und Co. in Git auch in Dockhand übernommen wird.

Create
Über den Button Create können neue Projekte direkt in der GUI angelegt werden. Mit unserer Konfiguration landen diese dann unter /opt/dockhand/stacks/jusec-dockhand001/.

Variablen
Wenn wir Variablen verwenden, können wir diese auf der rechten Seite anlegen. Wenn wir in der Compose bereits auf Variablen verweisen, die noch nicht existieren und auch keinen Default-Wert haben, werden wir direkt darauf hingewiesen und können mit einem Klick bei Add missing die Variable direkt hinzufügen und einen Wert vergeben.

Secrets
Wenn wir sensible Variablen besonders absichern wollen, können wir sie mit dem Schlüssel-Symbol als Secret markieren. Hierbei wird der Wert gegen Punkte ausgetauscht und ist auch nie mehr einsehbar. Die Secrets sind auf dem System an sich verschlüsselt mit einem Encryption-Key.

Untracked/Adopt
In dem Bild oben wird angezeigt, dass die beiden Projekte Untracked sind. Das liegt daran, dass Dockhand aktuell noch nicht weiß, wo die Dateien dazu eigentlich aktuell liegen.
Wir haben zwei Möglichkeiten, das zu lösen.
Ordner hinzufügen
Entweder fügen wir der Dockhand Compose entsprechende Bind-Mounts hinzu, wo sich die aktuellen Projekt-Ordner befinden.

sudo docker compose down && sudo docker compose up -d
Nach Hinzufügen des Ordners können wir jetzt bspw. auf den nginx-proxy-manager Stack gehen und dort auf Browse for compose file.

In dem Auswahlmenü navigieren wir dann zu dem entsprechenden Ordner und wählen die Compose aus.

Nun wird der Stack als Internal angezeigt und wir können ihn ebenfalls via GUI direkt in Dockhand verwalten und anpassen.

Compose verschieben
Oder wir verschieben sie in das bereits eingebundene Verzeichnis. Da wir hierfür ein Bind-Mount statt Volume genommen haben, können wir unsere existierenden Docker-Projekte problemlos auf dem System umkopieren in das Dockhand Stacks Verzeichnis, um alles gesammelt an einem Ort zu haben.

In diesem Beispiel gibt es den Stack cryptgeon, welcher aktuell unter /opt/cryptgeon läuft.

Um das Ganze umzuziehen, stoppen wir einfach alle Container, kopieren oder verschieben den Ordner cryptgeon und starten alle im neuen Verzeichnis.
cd /opt/cryptgeon # navigieren zum stack
sudo docker compose down # stoppen der Container
sudo mkdir -p /opt/dockhand/stacks/jusec-dockhand001/cryptgeon
sudo cp -r /opt/cryptgeon /opt/dockhand/stacks/jusec-dockhand001/cryptgeon # kopieren des Ordners (mv zum verschieben)
cd /opt/cryptgeon /opt/dockhand/stacks/jusec-dockhand001/cryptgeon # in das neue Verzeichnis navigieren
sudo docker compose up -d # Container wieder starten
Jetzt wählen wir für den Stack ebenfalls wieder den Ort aus

Der Vorteil bei dieser Methode ist, dass der Stack nun in dem Verzeichnis liegt, wo Dockhand auch neue Projekte für diesen Server erstellt.
Images
Hier sehen wir alle Images, die auf dem System existieren, und können uns weitere Informationen darüber einholen. Außerdem kann hier bspw. auch ein Vulnerability-Scan für Images gestartet werden.

Volumes
Ein weiteres cooles Feature von Dockhand finden wir unter dem Reiter Volumes. Wir sehen alle Docker-Volumes, die verwendet werden, und können bequem über die GUI darauf zugreifen und uns den Inhalt ansehen & sogar bearbeiten. Das ist super komfortabel.

Networks
Zeigt uns alle Docker-Netzwerke auf dem System an.

Es gibt uns auch die Möglichkeit, bestehende Netze mit Containern zu verbinden, die das Netzwerk noch nicht haben. 
Natürlich können wir hier über ein Menü auch neue Netzwerke aller Art erstellen.

Registry
Hier gibt es die Möglichkeit, Registrys nach Images zu durchsuchen, diese dann herunterzuladen und bspw. auch direkt auf Vulnerabilities zu prüfen.

Activity
Wie der Name sagt, erhalten wir Informationen, welche Aktionen in Dockhand vorgenommen wurden.

Schedules
Im Reiter Schedules sehen wir alle automatischen Tasks und wann sie ausgeführt werden. Wir haben die Möglichkeit, die Tasks manuell zu starten oder auch zu pausieren.

Settings
Unter Settings können wir Dockhand auf unsere Bedürfnisse anpassen.
General
Im General-Tab legen wir allgemeine Einstellungen fest, wie das Datumsformat, wann Systemjobs laufen sollen, das Theme und Schriften.

Environments
Bei Environments waren wir ganz zu Beginn bereits und haben unser erstes System hinzugefügt. Wir können hier weitere Systeme hinzufügen.

Registries
Hier können weitere Registries abseits des Docker-Hubs hinzugefügt werden.

Git
Unter Git fügen wir unsere Git-Repositorys hinzu.

Config sets
Wir haben die Möglichkeit, Templates für unsere Projekte zu erstellen, falls bestimmte Konfigurationen wie gewisse Environment-Variablen immer wieder benötigt werden.

Notifications
Konfiguration von Notificationskanälen wie SMTP oder Webhooks nehmen wir hier vor.

Authentication
Wie eingangs erwähnt, können hier Benutzer angelegt werden. Entweder lokal oder über verschiedene Identity Provider. Das Hinterlegen von beispielsweise Authentik via OIDC für Single Sign-On ist hier ebenfalls möglich.

About
Alle Informationen zu Dockhand

Remote Server
Wir können jetzt Dockhand dafür benutzen, um unsere Docker-Compose-Projekte auf dem Server zu verwalten. Doch was, wenn wir mehrere Server haben?
Auch hier hat Dockhand mitgedacht und gibt uns verschiedene Möglichkeiten, Remote-Systeme mit anzubinden.
Der einfachste Weg ist dabei, den zugehörigen Agent Hawser zu verwenden. Dieser gibt uns die Möglichkeit, einen Host zu unserem lokalen Host mit anzubinden, den wir über unser Heimnetz erreichen.

Oder auch einen Edge-Mode, um Systeme über Netzwerke hinweg problemlos anzubinden, wie bspw. VPS und Cloud-Instanzen.

Dabei kann der Agent lokal auf dem System installiert werden oder via Docker-Container gestartet werden.
Wir machen das Ganze jetzt einmal in der Docker-Variante.
Hawser Docker
Als Erstes erstellen wir uns wie gewohnt auf dem Remote-Host einen Ordner für die compose.yml.
sudo mkdir /opt/hawser
cd /opt/hawser
Das compose.yml-File ist dabei super einfach gehalten.
sudo nano compose.yml
services:
hawser:
image: ghcr.io/finsys/hawser:latest
container_name: hawser
restart: unless-stopped
volumes:
- /var/run/docker.sock:/var/run/docker.sock
ports:
- 2376:2376
#environment: # Optional
# - TOKEN=your-secret-token
Nun starten wir den Container
sudo docker compose up -d
Ein Blick auf die Logs verrät uns, dass er läuft.

Server hinzufügen
Da Hawser jetzt auf dem Remote-System läuft, können wir das in Dockhand hinzufügen. Dafür navigieren wir unter Settings → Environments und wählen Add environment.
Dort tragen wir jetzt die gewünschten Sachen für unseren Server ein und wählen als Connection Type Hawser Agent (standard).

Wir können jetzt noch die weiteren Reiter konfigurieren und dann auf Add klicken.
Jetzt wird unser System unter Environments mit aufgelistet.

Auswahl von Server
Sobald wir mehrere Server in Dockhand haben, müssen wir darauf achten, welchen wir bearbeiten. Das können wir oben links in Dockhand prüfen und auswählen.

Alternativ können wir auch auf das Dashboard gehen und den gewünschten Server wählen.

Remote Stacks
Bei den Remote Stacks gibt es eine wichtige Besonderheit. Das Prinzip von Dockhand ist eine zentralisierte Control Plane, also der Dockhand-Server selber. Dockhand hält alle compose.yml und .env-Files, auch von Remote-Systemen. Die Daten der Container wiederum liegen dann auf den Remote-Systemen selber.
Das hat einige Vorteile aus der Sicht der Zentralisierung und des Cluster-Managements.
Um Remote-Stacks also nach Dockhand zu importieren, müssen wir nur die compose.yml und, falls vorhanden, die .env auf den Dockhand-Server transportieren.
Mit Hawser als Beispiel kopieren wir einfach die compose.yml und erstellen einen Ordner unter stacks/servername dafür auf dem Dockhand-Server.
sudo mkdir -p /opt/dockhand/stacks/jusec-docker002/hawser
cd /opt/dockhand/stacks/jusec-docker002/hawser
sudo nano compose.yml
Anschließend kann ich in Dockhand den Compose-Stack wählen und die erstellte compose.yml dafür hinterlegen.

So können wir dann mehrere Systeme komfortabel von einer GUI aus verwalten.
Fazit
Dockhand bringt Struktur und Übersicht in Docker-Compose-Umgebungen, ohne unnötig komplex zu werden.
Gerade bei mehreren Servern oder vielen Stacks spart die zentrale Verwaltung viel Zeit und macht das Management deutlich komfortabler. Eine starke Lösung für alle, die Docker professionell, aber unkompliziert betreiben möchten.