Verwaltung mehrerer Docker Hosts mit Portainer

In diesem kurzen Tutorial möchte ich euch zeigen wie ihr mit einer Portainer Instanz neben dem lokalen Docker Host auch weitere Docker Hosts verwalten könnt. Alles über eine Weboberfläche und mit minimalem Aufwand.

Vorausetzungen

Für den Erfolg des Tutorials benötigt ihr lediglich zwei Docker Hosts. Dies können virtuelle Maschinen, NAS oder auch Einplatinen Computer sein. Außerdem sollte ihr auf eurem Master Docker Host bereits eine laufende Portainer Instanz haben.

Bei mir läuft die Portainer Instanz auf einer Synology Disk Station und ist nach diesem Tutotial eingerichtet. Als zusätzlichen Docker Host möchte ich einen alten Cubietruck (Cubieboard 3) anbinden. Dort habe ich vorab bereits Armbian als Betriebssystem installiert und den Docker Dienst eingerichtet. Wie bereits erwähnt spielt die Hardware auf dem der Docker Dienst ausgeführt wird keine große Rolle. Es täte also auch z. B. ein Raspberry Pi mit Docker.

Portainer Agent auf dem zu verwaltenden Host starten

Um einen Docker Dienst remote zu verwalten gibt es mehrere Möglichkeiten. Für dieses Tutorial verwende ich die mit Abstand einfachste: Den Portainer Agent. 

Beim Portainer Agent handelt es sich um einen Docker Container den wir lediglich auf dem zu verwaltenden Host starten müssen und der später die Schnittstelle vom Portainer zum Docker Dienst des zu verwaltenden Hosts bildet.   

Hinweis

Eigentlich ist der Portainer Agent für den Einsatz in Docker Clustern, den so genannten Swarms, vorgesehen. (Deshalb findet ihr den Weg den ich hier beschreibe auch nicht in der offiziellen Doku)

Da der Agent aber auch in den einfachsten aller Docker Umgebungen, nämlich meinem Smarthome, funktioniert habe ich mich dazu entschlossen euch diese Möglichkeit nicht vorzuenthalten. 

Ähnlich wie wir auch die Haupt Instanz unseres Portainers gestartet haben, benötigen wir auch für den Start des Portainer Agent einen Befehl den wir über die Kommandozeile ausführen. Dieser Befehlt lautet:  

docker run \
	-d \
	-p 9001:9001 \
	--name portainer_agent \
	--restart=always \
	-v /var/run/docker.sock:/var/run/docker.sock \
	-v /var/lib/docker/volumes:/var/lib/docker/volumes \
	portainer/agent

Sollte euer User, mit dem ihr an der Kommandozeile angemeldet seid nicht berechtigt sein Docker ohne Superuser Rechte aus zu führen, müsst ihr ggf. noch ein sudo vor den Befehl packen und euer Kennwort eingeben.

Zur Erläuterung hier einmal die einzelnen Teile des Befehls kurz erklärt:

  • docker run
    …zum Starten des Containers
  • -d
    …Container läuft im „detached mode“
  • -p 9001:9001
    …öffnet den Port 9001 für den Zugriff auf den Portainer Agent über das Netzwerk
  • --name portainer_agent
    …setzt den Namen des Containers
  • -restart always
    …aktiviert den automatischen Neustart des Containers bei Fehler
  • -v /var/run/docker.sock:/var/run/docker.sock
    …bindet die angesprochene docker.sock-Datei ein
  • -v /var/lib/docker/volumes:/var/lib/docker/volumes
    …bindet das Verzeichnis ein in dem standardmäßig die Docker Volumes gespeichert werden
  • portainer/agent
    …verwendetes Image für den Container

Hinweis

Wie auch schon beim Portainer selbst kann es auch beim Agent zu einem Port Konflikt kommen wenn man den Standard Port 9001 für den Portainer Agent verwendet. So kommuniziert z. B. ein ioBroker Slave darüber in der Regel mit seiner Objects DB.

Zur Vermeidung des Konflikt könntet ihr also z. B. -p 8889:9001 statt -p 9001:9001 verwenden um den Portainer Agent über den Port 8889 erreichbar zu machen.

Solltet ihr den Port hier ändern müsst ihr dies natürlich im nächsten Schritt beim Aufbau der Verbindung berücksichtigen.

Habt ihr den Befehl auf eurem Docker Host ausgeführt, können wir per docker ps prüfen ob euer Portainer Agent Container läuft.

Verbindung zwischen Portainer und Portainer Agent herstellen

Um nun den neuen Host mit der bestehenden Portainer Instanz zu verbinden wechseln wir auf die Weboberfläche unseres Portainers. Unter „Settings“ navigieren wir zum Menüpunkt „Endpoints“.

Mit einem Klick auf „+ Add endpoint“ öffnet sich eine Eingabemaske. Unter „Environment type“ sehen wir die verschiedenen Möglichkeiten die wir haben um einen zusätzlichen Host bzw. „Endpoint“ an unseren Portainer anzubinden.  Der „Portainer agent“ sollte bereits vorausgewählt sein. 

Unter „Environment details“ geben wir im Feld „Name“ einen aussagekräftigen Namen für unseren Host ein. In das Feld „Endpoint URL“ tragen wir nun die IP-Adresse bzw. den Netzwerknamen sowie den Port unter dem wir den Portainer Agent erreichen ein. Das Feld Public IP können wir erst einmal vernachlässigen. In unserem Anwendungsfall, der sich auf unser lokales (Smarthome-)Netzwerk beschränkt, ist hier kein Eintrag notwendig.

Die Felder im Bereich „Metadata“ können nach belieben befüllt werden. In den allermeisten Fällen werden unsere Umgebungen aber vermutlich nicht so groß, als dass wir mit Gruppen und Tags arbeiten müssten.  

Mit einem Klick auf den Button „+ Add endpoint“ schicken wir das Formular ab. Wenn alles passt wird uns die Einrichtung mit einem grünen Hinweis bestätigt.

Wechseln wir nun im Menü auf den Punkt „Home“ sollten wir nun nicht mehr nur unseren lokalen Endpunkt „local“ in der Liste finden, sondern auch den nun hinzugefügten Host.

Mit einem Klick auf den Host wird der Host gewählt und wir können ihn verwalten. 

Hinweis

Wer bei den verschiedenen Möglichkeiten für das Hinzufügen eines Endpoints genauer hin geschaut hat, wird gesehen haben, dass es auch die Möglichkeit gibt eine Verbindung direkt zur Docker API herzustellen.

Im Internet finden sich zu diesem Thema Anleitungen wie man die Docker API eines Hosts in Richtung des Netzwerks frei geben kann. In der Standardkonfiguration ergibt sich daraus leider eine Sicherheitslücke, da über eine offene Docker API praktisch jeder den Docker Host bedienen und „kapern“ kann. Absichern lässt sich dieser Zugriff in diesem Fall durch die Verwendung von Zertifikaten. Der Aufwand der dazu betrieben werden muss ist allerdings recht hoch. 

Bei Verwendung des Portainer Agent ist hingegen kein unerlaubter Zugriff möglich. Beim Hinzufügen des Endpoints tauschen Portainer und Portainer Agent ein Secret aus. Anschließend sind Verbindungen nur noch mit Hilfe dieses Secrets möglich. Mehr Informationen dazu, und wie man mehrere Portainer Instanzen ein und den selben Agent verwalten lässt, findet ihr in der Portainer Doku.  

Das sollte es zu diesem Thema erst einmal gewesen sein. Bei Fragen und Anregungen nutzt gerne die Kommentare oder kontaktiert mich über einen der öffentlichen Kanäle wie z.B. über das ioBroker Forum oder den ioBroker Discord Channel.

Grundsätzlich biete ich keinen persönlichen Support per Messenger bzw. E-Mail an. Fragen sollten meiner Meinung nach immer öffentlich gestellt und beantwortet werden, damit auch andere User mit der selben Frage Zugriff auf die Antworten bekommen. 🙂 Falls ihr mal irgendwo keine Antwort bekommt, nutzt gerne das Kontaktformular und macht mich auf euren Kommentar, Post, Beitrag oder Thread aufmerksam! Danke.

MfG,
André

Änderungshistorie

2021-03-25 Erste Veröffentlichung