Dockhand

Einleitung

Dockhand ist eine Webanwendung, mit der sich Docker-Container komfortabel monitoren und verwalten lassen. Es stellt insofern eine Alternative zu ähnlichen Lösungen, wie z.B. Portainer, dar. Ich vergleiche hier nicht die verschiedenen Lösungen und will auch gar nicht die Vorteile von Dockhand gegenüber von z.B. Portainer herausstellen. Mich hat Dockhand aber wegen seiner Funktionsvielfalt und der intuitiven Oberfläche überzeugt, um nicht zu sagen begeistert.

Lizenz

Die Software ist unter der Apache 2.0 Open Source License lizenziert und kann für private Zwecke unbegrenzt genutzt werden. Für kommerzielle Zwecke darf sie unter Einschränkungen auch kostenfrei genutzt werden. Ansonsten gibt es verschiedene Lizenzierungsmodelle.

Screenshot: Gegenüberstellung der Lizenzen
Abb. 1: Gegenüberstellung der Lizenzen



Features (Auszug)

Ich möchte keine Bedienungsanleitung für Dockhand bereitstellen. Für eine vollständige Anleitung kann ich die Homepage des Herstellers empfehlen: Manual. Auch eine vollständige Feature List stelle ich hier nicht online. Aber ein paar Highlights möchte ich kurz festhalten.



Dahsboard

Da ist zunächst einmal das übersichtliche und informative Dashboard.

Screenshot: Das Dashboard
Abb. 2: Das Dashboard
Es lässt sich intuitiv einstellen, indem man die einzelnen Kacheln einfach mit der Maus verschiebt, vergrößert oder verkleinert. Außerdem gibt es vier vordefinierte Sichten: Das Dashboard kann man auch mit Labels strukturieren. Man gibt den einzelnen Environments Etiketten, die man frei vergeben kann. Pro Umgebung sind wohl bis zu 10 Labels möglich. Das sollte reichen. Irgendwann wird es ja auch unübersichtlich. Mit Labels kann man sich gefilterte Ansichten auf dem Dashboard generieren.



Containers

In der Ansicht Containers sieht man die Container eines Hosts (wer hätte das gedacht?). Das interessanteste Feature in dieser Ansicht ist das Updaten der Container. Man klickt auf den Button "Check for updates" und es werden alle laufenden Container des ausgewählten Hosts auf verfügbare Update geprüft. Wenn es welche gibt, dann kann man sie über diese Oberfläche auch direkt aktualisieren. Das geht natürlich nur, wenn die Container nicht mit einer bestimmten Version definiert wurden.

Noch interessanter wird es, wenn man in dieser Ansicht auf einen der angezeigten Container klickt. In der Ansicht Container Details kann man sich die Logs ansehen, die Layers, die laufenden Prozesse, Details des genutzten Dockernetzwerks oder auch gemountete Volumes. Man kann das (virtuelle) Filesystems des Containers durchbrowsen. Hier kann man sogar Dateien oder Verzeichnisse bearbeiten, umbenennen, löschen, ihre Berechtigungen ändern und auch ansonsten jede Menge Unheil anrichten. Darüber hinaus kann man sich die Umgebungsvariablen, die Lables, Sicherheitsparameter, Ressourcenlimitierungen und den Gesundheitsstatus des ausgewählten Containers ansehen.

Screenshot: Die Dateien eines Containers
Abb. 3: Die Dateien eines Containers



Shell

Manchmal muss man zu Analysezwecken in einem Container auf eine Kommandoshell zugreifen. Das geht auf der Konsole mit dem Befehl "docker exec...". Komfortabler geht das mit Dockhand. HIer gibt es das Menü "Shell". Hier kann ich einen Container auswählen und wenn er eine Shell unterstützt, dann kann ich auswählen, welche Shell ich verwenden möchte und mit welchen User ich zugreifen möchte. Das ist schon recht nice.

Screenshot: Die Shell eines Containers
Abb. 4: Die Shell eines Containers



Stacks

Genau wie unter Portainer kann man Docker-Stacks mittels Compose-Files auch unter Dockhand definieren. Dazu wird ein Editor mit Syntax Highlighting angeboten. Ich kann hier compose-files schreiben, für Container, die auf anderen Hosts laufen. Das Compose-File liegt dann in dem Volume, das als /app/data gemountet wird auf dem Dockhand-Host. Persistente Volumes, die für den anderen Host definiert werden sollen, müssen mit ihrem kompletten Pfad angegeben werden. Wenn der Pfad in dem Compose-File mit einem Punkt beginnt, dann werden die Verzeichnisse für diese Volumes auf dem anderen Host im Verzeichnis /app angelegt.

Screenshot: Einen Stack definieren
Abb. 5: Einen Stack definieren


Installation via docker compose

Dockhand selbst wird ebenfalls per Docker deployed. Ich lege dazu auf dem Server, der als Host für Dockhand vorgesehen ist, ein Verzeichnis namens dockhand und darin eine Datei namens docker-compose.yml an. Das Compose-File bekommt folgenden Inhalt:


services:
  dockhand:
    image: fnsys/dockhand:latest
    container_name: dockhand
    restart: unless-stopped
    ports:
      - 3003:3000
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
      - /home/andreas/dockhand_data:/app/data

volumes:
  dockhand_data:
Dabei habe ich das Verzeichnis /app/data, in dem sich nachher u.a. die mit Dockhand eingerichteten Stacks befinden werden, als persistentes Volume in mein Homeshare auf dem Server gemountet. Dann wird Dockhand einfach per

docker compose up -d
gestartet. Mehr gibt es zum Installationsprozess auch schon nicht zu sagen.



Umgebungen hinzufügen

Auf dem Dashboard rechts oben gibt es ein "+"-Symbol. Damit kann eine neue Umgebung (also ein von Dockhand zu verwaltender Docker Host) hinzugefügt werden. Hier kann man die Verbindungsart auswählen zwischen:
Screenshot: Eine Umgebung hinzufügen
Abb. 6: Eine Umgebung hinzufügen
Die Verbindung per Unix Socket funktioniert nur unmittelbar auf dem Dockhand Host und benötigt keinerlei weitere Konfiguration. Darum verwende ich sie auf dem Server, auf dem ich Dockhand hoste. Direct Connection erfordert, dass Docker über eine API extern erreichbar ist. So etwas mache ich nicht. Hawser standard ist die normale Verwendung des Agents mit IP-Adresse. Wenn man einen Dockhand Server mit fester IP und/oder Domain hostet, dann kann die Verbindung per Hawser Agent (edge) sinnvoll sein, um Umgebungen mit wechselnden IP-Adressen aufzunehmen. Da meine Server immer feste IP-Adressen haben, brauche ich das nicht.

Um den Hawser Agenten zu nutzen, muss er natürlich auf den einzubindenden Hosts laufen. Das geht am Einfachsten per docker-compose.yml. Ich erstelle also auf dem betreffenden Host ein Unterverzeichnis hawser und darin eine docker-compose.yml mit folgendem Inhalt:

services:
  hawser:
    image: ghcr.io/finsys/hawser:latest
    container_name: hawser
    restart: unless-stopped
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
      - hawser_stacks:/data/stacks
    ports:
      - "2376:2376"
volumes:
  hawser_stacks:
Diesen Container starte ich natürlich mit

docker compose up -d
Dann füge ich diese Umgebung auf dem Dashboard hinzu, indem ich auf das zuvor erwähnte "+"-Zeichen klicke. Ich gebe der Umgebung einen frei wählbaren Namen. Dabei macht es natürlich Sinn, den Namen des Hosts zu verwenden. Außerdem kann ich die oben bereits erwähnten Labels dranhängen. Dann wähle ich den Verbindungstypen Hawser standard aus, gebe die IP-Adresse oder Domain des hinzuzufügenden Hosts ein und klicke auf "Test connection". Wenn es dabei keine Probleme gibt, dann erscheint rechts unten am Bildschirm eine grüne Bestätigung, dass der Host erreicht wurde. Nun klicke ich auf "Add" und der Host wird hinzugefügt.

Nachdem ich für's erste alle Umgebungen hinzugefügt habe, kann ich mir das Dashboard einfach per Drag&Drop zurecht drappieren.