Reverse-Proxy für Docker-Apps
Proxy
Wenn man auf einem Server mehrere Docker-Apps hosten möchte, kommt man oft an einem Reverse-Proxy nicht vorbei. Wünschenswert wäre es, wenn er nicht umfangreich für jede neue App umkonfiguriert werden müsste. Auch die Apps sollten mit möglichst geringem Aufwand für die Verwendung des Proxy konfiguriert werden können.
Nginx
Die Lösung ist ein simpler, dockerisierter Nginx-Server, der vor andere Container geschaltet wird. jwilder/nginx-proxy wurde genau für Rolle eines generischen Reverse-Proxy geschaffen. Mit Hilfe von docker-gen können Nginx-Konfigurationsdateien automatisiert generiert werden. Weitere Informationen kann man im Jason Wilder's Blog nachschlagen.
Docker
Wir legen folgende Ordnerstruktur an:
/docker
-/nproxy
--/certs
--docker.compose.yml
-/apps
--/blog
---docker-compose.yml
Die docker-compose.yml des Proxy (/docker/nproxy/docker-compose.yml
):
version: '2'
services:
nproxy:
image: jwilder/nginx-proxy:latest
container_name: nproxy
restart: always
ports:
- "80:80"
- "443:443"
volumes:
- ./certs:/etc/nginx/certs
- /var/run/docker.sock:/tmp/docker.sock:ro
/var/run/docker.sock
erlaubt dem Proxy-Container auf die Docker-API zuzugreifen.
Im Verzeichnis certs
können SSL-Zertifikate für unsere Apps abgelegt werden. Neu generiert können sie werden zum Beispiel mit:
$ openssl req -x509 -newkey rsa:4096 -keyout www.example.com.key -out www.example.com.crt -days 365
Wichtig ist, dass die Namen des Key und des Zertifikats dem Schema entsprechen: [DOMAINNAME].[key|crt]
Den Proxy können wir schon mal starten mit docker-compose up -d
Apps
Eine App können wir nun hinzufügen, in dem wir eine weitere Docker-Compose-Datei ablegen. Wir starten zum Beispiel ein Blog mit Ghost-CMS im Verzeichnis docker/apps/blog
:
version: '2'
services:
blog:
image: ghost
container_name: blog
restart: always
volumes:
- blog-data:/var/lib/ghost
environment:
- VIRTUAL_HOST=www.example.com
- NODE_ENV=production
volumes:
blog-data: {}
networks:
nproxy_default:
external: true
Der zuvor gestartete Proxy-Container hat ein lokales Netzwerk mit dem Namen "nproxy_default" erstellt. Im Blog-Container wird im Block "networks" derselbe Netzwerkname konfiguriert. Nun ist der Blog über den Reverse-Proxy erreichbar. Jede weitere App muss einfach mit dem Netzwerk "nproxy_default" verbunden werden und den "VIRTUAL_HOST" konfiguriert haben und schon ist sie über die Ports 80 / 443 erreichbar.