Heute will ich Euch zeigen, wie Ihr Eure Docker Container mit Portainer verwalten könnt. Dazu nutzen wir den Portainer-Container, Apache2 als Reverse Proxy und sichern das ganze mit einem LetEncrypt-ssl-Zertifikat ab.
Vorraussetzungen:
– einen Ubuntu VPS
– LAMP-Stack installiert
– Reverse Proxy Module in Apache2 aktiviert
– Docker installiert
– certbot installiert
– DNS-A-Record für FQDN mit dem wir das Management aufrufen möchten
Sollten Vorraussetzungen fehlen, müssen wir diese natürlich erst noch schaffen.
LAMP-Stack:
sudo apt-get install lamp-server^
Reverse Proxy Module aktivieren:
sudo a2enmod proxy proxy_http proxy_ajp rewrite deflate headers proxy_balancer proxy_connect proxy_html proxy_wstunnel authz_core authn_core setenvif ssl
Docker:
Version aus den offiziellen Paketquellen:
sudo apt-get install docker.io sudo systemctl start docker sudo systemctl enable docker
oder direkt von Docker:
sudo curl -sSL https://get.docker.com/ | CHANNEL=stable sh sudo systemctl enable docker.service sudo systemctl start docker.service
Certbot:
sudo apt-get update sudo apt-get install software-properties-common sudo add-apt-repository ppa:certbot/certbot sudo apt-get update sudo apt-get install python-certbot-apache
Im Anschluss können wir fortfahren und Portainer in Betrieb nehmen.
Step 1: Portainer-Container starten
Mit dem folgenden Befehl starten wir den Container auf unseren Server:
sudo docker run -d -p 9000:9000 --restart always -v /var/run/docker.sock:/var/run/docker.sock -v /opt/portainer:/data portainer/portainer
Nun prüfen wir noch, ob der Container gestartet wurde:
sudo docker ps
Portainer hört nun auf dem Port 9000.
Step 2: Apache2 vHost anlegen
Wenn der Container läuft, legen wir uns einen vHost an, damit wir die Reverse Proxy Funktionalität nutzen können und im Browser ohne Port-Angabe arbeiten können:
sudo nano /etc/apache2/sites-available/003-portainer.conf
dort fügen wir den folgenden Inhalt ein:
<VirtualHost *:80> ServerName portainer.deine-domain.tld </VirtualHost>
Datei speichern, Site aktivieren und Apache2 neu starten:
sudo a2ensite 003-portainer.conf sudo systemctl restart apache2
Nun wäre Portainer bereits über http://portainer.deine-domain.tld erreichbar. Da wir aber mit Passwort-Eingabe arbeiten, verschlüsseln wir die Verbindung mit SSL.
Dazu nutzen wir Certbot:
sudo certbot --apache
entsprechenden vHost auswählen und am Ende „2“ für „redirect“ auswählen.
Nun müssen wir die soeben erstellte Config noch einmal bearbeiten:
sudo nano /etc/apache2/sites-available/003-portainer-le-ssl.conf
und den folgenden Block nach ServerName
eintragen:
# Proxy to Portainer ProxyPreserveHost On ProxyPass / http://127.0.0.1:9000/ ProxyPassReverse / http://127.0.0.1:9000/ RequestHeader set X-Forwarded-Proto "https" ProxyVia Block <Proxy *> Require all granted </Proxy> # SSL Configuration - uses strong cipher list - these might need to be downgraded if you need to support older browsers/devices SSLEngine on SSLCipherSuite EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH SSLProtocol All -SSLv2 -SSLv3 -TLSv1 -TLSv1.1 SSLHonorCipherOrder On # HSTS (optional) Header always set Strict-Transport-Security "max-age=63072000; includeSubdomains;" # Prevent MIME based attacks Header set X-Content-Type-Options "nosniff" ErrorLog /var/log/apache2/portainer-error.log CustomLog /var/log/apache2/portainer-access.log combined #Proxy to docker container console <Location /api/websocket/> RewriteEngine on RewriteCond %{HTTP:UPGRADE} ^WebSocket$ [NC] RewriteCond %{HTTP:CONNECTION} Upgrade$ [NC] RewriteRule /api/websocket/(.*) ws://127.0.0.1:9000/api/websocket/$1 [P] </Location>
Abspeichern und Apache2 neu starten:
sudo systemctl restart apache2
Step 3: Portainer konfigurieren
über den Browser unserer Wahl rufen wir https://portainer.deine-domain.tld auf und müssen zuerst ein Passwort für den admin vergeben:
Im nächsten Dialog setzen wir die Einstellung auf „Local“:
betätigen den Button „Connect“ und landen nach kurzer Zeit im Dashboard:
Wenn wir auf „Container“ klicken, können wir uns weitere Infos zu den einzelnen Containern anschauen oder diese neu starten, stoppen etc.:
Container-Details:
Update:
Wenn Ihr Portainer über einen existierenden vHost über einen Unterordner aufrufen wollt (zum Beispiel: https://hostname.deine-domain.tld/portainer/) dann müsst Ihr dieser conf-Datei diesen Block hinzufügen:
<Location /portainer/> ProxyPass http://127.0.0.1:9000/ ProxyPassReverse http://127.0.0.1:9000/ RequestHeader set X-Forwarded-Proto "https" </Location> <Location /portainer/api/websocket/> ProxyPass http://127.0.0.1:9000/api/websocket/ ProxyPassReverse http://127.0.0.1:9000/api/websocket/ RewriteEngine on RewriteCond %{HTTP:UPGRADE} ^WebSocket$ [NC] RewriteCond %{HTTP:CONNECTION} Upgrade$ [NC] RewriteRule /api/websocket/(.*) ws://127.0.0.1:9000/api/websocket/$1 [P] </Location>
Vergestt aber nicht die Reverse Proxy Module zu aktivieren.
Das war es für heute, viel Spaß beim Ausprobieren 🙂