/ Docker

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.