Docker-Container mit Portainer verwalten auf Ubuntu 16.04 LTS mit Apache2 als Reverse Proxy

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 🙂