Portainer.. oder wie man Docker schön macht

Fr, 4. März 2022, Norbert Rüthers

Angeregt durch den GLN Podcast 020 in dem Tim über Docker berichtet, schreibe ich einen lang geplanten Artikel über Portainer. Lange Zeit war Docker für mich ein Buch mit sieben Siegeln, obwohl mir der Nutzen von Docker durchaus bewusst war und ist.

Die Gründe für meine  Abneigung:

  • Die Konfiguration von Dockercontainern war und ist mir zu umständlich
  • Mit den Bordmitteln hat man zu wenig Überblick über den aktuellen Status des/der Systeme
  • Änderungen am System sind umständlich und unkomfortabel.

So war es bis ich vor einigen Monaten von Portainer erfahren habe.

Portainer ist vom Prinzip her eine grafische Oberfläche für alles, was mit Dockercontainern zu tun hat. Man kann seine benötigten Container bequem in der GUI installieren oder auch, wenn man will traditionell auf der Kommandozeile. Im letzteren Fall wird ein auf diese Weise manuell installierte r Container trotzdem später in Portainer sichtbar und administrierbar sein.

Alle Parameter eines Dockercontainers lassen sich (auch im nachhinein) komfortabel konfigurieren.

  • Netzwerkadressen und Ports
  • Images (Installationsdateien)
  • Volumes (Persistenter Speicher auf dem Host)
  • Umgebungsvariablen
  • Startverhalten
  • Logs
  • Fähigkeiten
  • usw......

Um in den Genuss von Portainer zu kommen, muss man eigentlich nur das Grundgerüst installieren. Das wäre Docker, Portainer selbst, und vielleicht noch Docker Compose.

Docker installieren

curl -fsSL https://get.docker.com -o get-docker.sh

sh ./get-docker.sh

Portainer installieren

docker volume create portainer_data   # Persistenten Speicher für Portainer anlegen

docker run -d -p 8000:8000 -p 9000:9000 --name portainer \
    --restart=always \
    -v /var/run/docker.sock:/var/run/docker.sock \
    -v portainer_data:/data \
   portainer/portainer-ce:latest

Als nächstes muss man seinen Usernamen noch der Gruppe Docker hinzufügen

sudo groupadd docker

sudo usermod -aG docker $USER

Danach ist Docker incl. Portainer bereit. Wer möchte kann noch Docker Compose installieren. Beschrieben hier

Neben einzelnen Containern bietet Portainer auch die Möglichkeit ganze Stacks von Containern zu definieren. Dabei wird für die Definition des Stacks das Docker-Compose-Format in Form einer yml Datei genutzt. Wurde ein Stack außerhalb von Portainer erstellt, wird dieser zwar angezeigt und man erhält einen guten Überblick über die zusammenhängenden Container aber die Verwaltung eines Stacks ist nur möglich, wenn dieser auch in Portainer erstellt wurde. Mit Docker Compose lassen sich also komplette Stacks mithilfe von yml Dateien installieren. Also z.B. ein kompletter LAMP Stack

Beispiel einer yml Datei:

version: "3"

services:
  web:
    image: "apache:${PHP_VERSION}"
    restart: 'always'
    depends_on:
      - mariadb
    restart: 'always'
    ports:
      - '8080:80'
    links:
      - mariadb
  mariadb:
    image: "mariadb:${MARIADB_VERSION}"
    restart: 'always'
    volumes: 
      - "/var/lib/mysql/data:${MARIADB_DATA_DIR}"
      - "/var/lib/mysql/logs:${MARIADB_LOG_DIR}"
      - /var/docker/mariadb/conf:/etc/mysql
    environment:
      MYSQL_ROOT_PASSWORD: "${MYSQL_ROOT_PASSWORD}"
      MYSQL_DATABASE: "${MYSQL_DATABASE}"
      MYSQL_USER: "${MYSQL_USER}"
      MYSQL_PASSWORD: "${MYSQL_PASSWORD}"

Eine solche yml Datei kann man via Browser ins System hochladen.

Der Aufruf von Portainer erfolgt im Webbrowser unter <IP-Adresse>:9000  wobei der Port natürlich anpassbar ist

Nach der Anmeldung wird das Dashboard  angezeigt, das bereits einen guten Überblick über den Docker-Host liefert. Auf einen Blick sind Hardwareinformationen wie die Anzahl der Prozessoren und die Größe des Arbeitsspeichers, sowie Docker spezifische Informationen (Anzahl der Container, Images, Volumes und Networks) ersichtlich.

Verwalten von Containern und Images

Die Container-Ansicht bietet verschiedene Möglichkeiten die Container in einer Umgebung zu verwalten. Im ersten Schritt werden Basisinformationen zu den vorhandenen Containern angezeigt. Welche Container angezeigt werden, lässt sich über Filter einschränken. Mit einem Klick auf einen der Container können detaillierte Informationen zu dem jeweiligen Container abgerufen werden. Zudem können z. B. eine Konsolen-Session zu dem Container geöffnet oder ein Image von dem Container erstellt werden.

Die Basisansicht ermöglicht des Weiteren den Status der einzelnen Container zu verändern, also die Container u. a. zu stoppen, starten oder löschen, sowie neue Container zu erstellen. Der Dialog zum Erstellen eines Containers ist letztlich eine Abbildung der Optionen des docker run Kommandos. Diese sind thematisch sortiert in einzelnen Reitern gruppiert und werden stellenweise durch Tooltips erläutert. Dabei kann ausgewählt werden von welcher der konfigurierten Registry das Image bezogen werden soll.


Ein Container in der Detailansicht mit allen zur Verfügung stehenden Aktionen

Portainer stellt alle grundlegenden Funktionen zur Verwaltung von Images bereit. Es können Images aus einer Registry heruntergeladen, gelöscht und erstellt werden. Das für das Erstellen eines Images benötigte Dockerfile kann über drei Wege zur Verfügung gestellt werden. Mit einen Webeditor kann das File direkt im Browser geschrieben werden. Über ein Upload-Formular kann entweder direkt ein Dockerfile oder ein tar-Archiv, das den Build-Kontext inkl. Dockerfile beinhaltet, hochgeladen werden.

Es steht eine grosse Anzahl von Templates zur Verfügung. Diese kann man installieren ohne vorher auf Docker Hub suchen zu müssen.

Benutzermanagement
Die Benutzerverwaltung bietet die Möglichkeit Benutzer und Teams anzulegen. Dabei kann einem Benutzer zusätzlich die Admin Rolle und die Teamleiter Rolle zugewiesen werden. Ein Administrator hat den vollen Zugriff auf die Portainer Umgebung und alle Docker Engines. Ein Teamleiter kann die Benutzer seines Teams verwalten (neue Benutzer hinzufügen und bestehende Benutzer entfernen). Ein Team wird einem oder mehreren Docker-Instanzen zugewiesen, um den Mitgliedern des Teams dessen Verwaltung zu ermöglichen. Dabei lassen sich die Funktionen allerdings nicht einschränken, sodass jeder Benutzer des Teams den vollen Funktionsumfang der jeweiligen Instanz nutzen kann. Ein umfassendes Rechtemanagement, das die dedizierte Zuweisung von einzelnen Rechten (z. B. Erstellen von Containern) an Benutzer oder Teams ermöglicht, fehlt allerdings noch.
Fazit
Portainer bildet die Standard-Docker-Funktionen, wie die Verwaltung von Containern, Images und Stacks sehr gut ab. Zudem bietet es mit den Application Templates und dem User Management weitere Möglichkeiten, die mit Docker alleine nicht zur Verfügung stehen und einen großen Mehrwert bieten. Insbesondere das User Management birgt großes Potenzial, wenn es in Zukunft um ein umfassendes Rechtemanagement erweitert werden würde. Gerade die Übersichtlichkeit der Weboberfläche erleichtert die Arbeit mit einer Docker Engine ungemein und durch die einfache Bereitstellung und Konfiguration von Portainer ist es auch für kleinere Docker-Projekte hervorragend geeignet.

Als sinnvolle Ergänzung zu Docker und Portainer würde ich auf jeden Fall einen NGINX-Proxymanager (Reverse Proxy) empfehlen. Jeder weiss, und verzweifelt auch (wie ich früher) daran ist das jeder Port von aussen nur einmal vergeben werden kann. Wer eine Nextcloud und noch einen anderen Dienst der Port 443 verwendet nutzen will, hat ohne Proxymanager ein Problem. Ausserdem kann damit problemlos für jeden Dienst ein Lets-encrypt Zertifikat angefordert und automatisch eingebunden werden. Das ist aber Stoff eines nächsten Artikels.

Bildquelle: https://ciberseguridadtotal.com/portainer-gestion-sencilla-de-docker-a-traves-de-la-web

Projektseite: https://www.portainer.io