Da der Docker-Server nun läuft, bietet es sich an, ihn zu nutzen. Da ich nicht wirklich faul bin, aber doch versuche, energieeffizient zu arbeiten, wird der erste Container einer sein, der eine Klick-Bunti-Oberfläche bereitstellt. Gemeint ist Portainer, das seinerseits als Docker-Container daherkommt und die Docker-Verwaltung in den Webbrowser hievt. Da der letzte Artikel etwas länger war, will ich versuchen, mich kurz zu fassen…

Nichtsdestotrotz sollten wir eine Kleinigkeit klären, bevor es losgeht: Docker-Container sind flüchtig!

Das klingt erstmal nicht weiter dramatisch – bis es mal rumst… Es bedeutet, dass Container zwar Daten speichern, diese aber verlieren sobald sie ausgeschaltet bzw. neu gestartet werden. Und das kann schneller passieren, als man sich wünscht: Ein Stromausfall, ein Hardware-Defekt oder auch nur ein Update, das einen Reboot fordert (Windows-Nutzer wissen, was ich meine)… Bestimmte Daten sind sicherlich entbehrlich, aber manchmal könnte es doch hilfreich sein, Daten über einen Neustart hinaus zu behalten – beispielsweise die Passworte, die der Passwort-Manager speichert (wäre echt blöd, wenn man die alle neu eingeben müsste, nur weil ein Admin mal eben den Container neu gestartet hat)…

Damit in Docker erzeugte Daten auch über einen Container-Neustart hinaus gespeichert werden können, bietet Docker die Möglichkeit, mit der Außenwelt zu kommunizieren. Dafür gibt es sogenannte Volumes. Für Linux-Nutzer: das ist vergleichbar mit Mountpoints; unter Windows ist das vergleichbar mit Freigaben (im Container richte ich ein Laufwerk X:\ ein, das auf dem Server auf die Freigabe \\irgendwas\keine_ahnung zeigt). Mir ist klar, dass das technisch extrem oberflächlich (und wahrscheinlich auch nicht zu 100% korrekt ist), der Einfachheit halber – ich versuche mit diesem Blog, Anfänger zu bedienen – soll diese Erläuterung aber mal genügen.

Damit die von Portainer erzeugten Daten persistiert werden können (so nennt man das neuerdings, wenn man Daten so speichert, dass sie auch später noch da sind), braucht es ein Volume. Das anzulegen, ist nicht weiter schwer:

docker volume create portainer_data

Damit wird das Volume angelegt. Für Interessierte: In /var/lib/docker/volumes wird ein Verzeichnis portainer_data angelegt. Dann wird der Container gestartet:

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

Das war’s. Trotzdem will ich es mir nicht nehmen lassen, diesen Befehl zu erläutern – nur damit keiner sagen kann, ich mache irgendwas, ohne zu wissen, was und wieso…

  • docker run
    startet den Container (welchen, sehen wir gleich)
  • -d
    lässt den Container im Hintergrund (daemon-Modus) laufen
  • -p
    mappt Ports. So kann man beispielsweise über einen Webbrowser auf den Container zugreifen. In diesem Fall werden die Ports 8000 (für HTTP-Zugriff) und 9443 (für HTTPS-Zugriff mit einem selbst erstellten Zertifikat) in den Container weitergereicht
  • –name portainer
    gibt dem Ganzen einen Namen
  • –restart=always
    sorgt dafür, dass der Container automatisch neu gestartet wird. Weitere Möglichkeiten wären hier „never“ (also nie neu starten) oder „unless-stopped“ (also immer neu starten, bis er vom Admin herunter gefahren wird)
  • -v /var/run/docker.sock:/var/run/docker.sock
    mappt ein Volume. In diesem Fall ist es so, dass Portainer Zugriff auf die Datei /var/run/docker.sock benötigt. Darüber läuft die Kommunikation zwischen Docker und den Containern – da Portainer das alles verwalten soll, muss es Zugriff auf diese Schnittstelle haben
  • -v portainer_data:/data
    mappt das eben von uns erstellte Volume „portainer_data“ im Container auf das Verzeichnis /data. Heißt: Das, was Portainer an Daten erzeugt, landet im Container im Verzeichnis /data. Um einen Neustart zu überleben, wird dieses Verzeichnis auf dem Host abgelegt.
  • portainer:portainer-ce:latest
    spezifizert das Container-Template: Der Docker-Hub ist ein riesiges Repository, das tausende von Images („Blaupausen“ für Container) bereithält. Hier kann sich jeder registrieren und eigene Images hochladen und so der Community bereitstellen. Vor dem ersten Doppelpunkt steht der Benutzername, danach kommt der Imagename. Nach dem zweiten Doppelpunkt folgt ein Tag (engl. Aussprache „Täg“), das die Version angibt – entweder eine bestimmte Versionsnummer (z.B. 1.1.2) oder wie hier „latest“, also immer die neueste Version.

Wenn wir diesen Befehl jetzt ausführen, erhalten wir folgende Ausgabe:

Damit läuft der Container. Weiter geht’s im Browser: wir rufen die IP des Docker-Hosts auf und hängen den HTTPS-Port an: https://docker-host:9443

Dann gibt’s eine Zertifikatswarnung (Portainer hat das Zertifikat selbst erstellt, dass der Browser dem erstmal nicht vertraut, ist daher nicht verwunderlich). Jetzt folgt die Eingabe eines Passwortes:

Der Benutzername „admin“ ist vorgegeben. Ich darf jetzt ein Passwort vergeben. Jetzt folgt ein „Quick Setup“. Hier lege ich fest, ob ich in der lokalen Umgebung arbeiten will oder vielleicht doch auf einer Serverfarm oder irgendwas anderem:

Da ich nur lokal arbeiten will, klicke ich auf „Get Started“. Danach wird – neben den Neuigkeiten aus dem Hause Portainer – der Link auf die lokale Umgebung angezeigt:

Hier klicke ich auf „local“ und lande im Dashboard:

Damit ist Portainer fertig eingerichtet. Jetzt können wir loslegen und weitere Container anlegen. Da dieser Artikel aber doch wieder länger geworden ist als geplant, verschiebe ich das auf einen weiteren Artikel (außerdem stehe ich auf Serien mit mehr als zwei oder drei Folgen)…