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 🙂

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert