Die Nutzung von Docker als Mittel zum Deployment vereinfacht das Betreiben von Applikationen stark, führt aber dazu, dass die typische Aufgabe von Apache oder NGINX (zum Nutzen eines Servers für mehrere Dienste) nicht übernommen wird.
Als Ergebnis haben wir einen Server, welcher anstatt über URLs über Ports zwischen den Applikationen unterscheidet - insbesondere da Port 443/80, etc. nur einmal verwendet werden kann.
Während es natürlich Problemlos möglich wäre, dem Nutzer die URL https://mein-server:46579/ freizuschalten, scheint dies nicht das gewünschte Mittel der Wahl zu sein.
Daher benötigen wir einen Reverse-Proxy, welcher die Namensauflösung übernimmt und dem entsprechden Port zuweißt.
Z.B. Allgemeine Anleitung wie man NGINX als Reverse Proxy verwenden kann.
https://www.thepolyglotdeveloper.com/2017/03/nginx-reverse-proxy-containerized-docker-applications/
Alternativ kann man einen automatisierten Mechanismus verwenden: http://jasonwilder.com/blog/2014/03/25/automated-nginx-reverse-proxy-for-docker/.
Dazu bitte auch https://hub.docker.com/r/jwilder/nginx-proxy/ betrachten, da es nötig sein könnte, dass die Server ihre Ports "veröffentlichen" (expose).
image: jwilder/nginx-proxy:alpine
ports:
- "80:80"
- "443:443"
volumes:
- /var/run/docker.sock:/tmp/docker.sock:ro
Dies erfordert dann zeitgleich, dass alle Container mit öffentlichen Ports ihren VIRTUAL_HOST angeben müssen.
environment:
# ...
VIRTUAL_HOST: app.dev.dynexite.rwth-aachen.de
Wichtig: Siehe Dokumentation!
Die Zertifikate müssen alle in einem Ordner liegen und so heißen wie der VIRTUAL_HOST, dann muss dieser Ordner
an den Reverse-Proxy gegeben werden
volumes:
# ...
- /path/to/certs:/etc/nginx/certs