Ein Reverse Proxy mit Docker einrichten

Wie und was die Vorteile von Docker sind, habe ich bereits hier beschrieben. Um jetzt einzelne Container unter einer oder mehreren Domains erreichbar zu machen, wird ein Reverse Proxy benötigt. Noch schöner ist es, wenn diese dabei mit einem Zertifikat verschlüsselt über HTTPS im Browser erreichbar gemacht werden.

Alles ist super einfach umsetzbar und in unter 5 Minuten einsatzbereit. Die Zertifikate werden automatisch mit Lets Encrypt erstellt und eingebunden. Docker und Docker-Compose sollten bereits installiert sein.

Und so geht es. Ordnung geht vor, deshalb erstelle ich einen Ordner in meiner Struktur (/root/docker/), wo die benötigten Dateien liegen.

mkdir /root/docker/jwilder-proxy

cd /root/docker/jwilder-proxy

Wir brauchen eine Datei docker-compose.yml mit dem Inhalt:

version: '2.4'

services:
  proxy:
    build: ./proxy
    restart: always
    ports:
      - 80:80
      - 443:443
    labels:
      com.github.jrcs.letsencrypt_nginx_proxy_companion.nginx_proxy: "true"
    volumes:
      - certs:/etc/nginx/certs:ro
      - vhost.d:/etc/nginx/vhost.d
      - html:/usr/share/nginx/html
      - /var/run/docker.sock:/tmp/docker.sock:ro
    networks:
      - proxy-tier

  letsencrypt-companion:
    image: jrcs/letsencrypt-nginx-proxy-companion
    restart: always
    volumes:
      - certs:/etc/nginx/certs
      - vhost.d:/etc/nginx/vhost.d
      - html:/usr/share/nginx/html
      - /var/run/docker.sock:/var/run/docker.sock:ro
    networks:
      - proxy-tier
    depends_on:
      - proxy

networks:
  proxy-tier:
    external: true

volumes:
  certs:
  vhost.d:
  html:

Auch eine update.sh wird benötigt (eigentlich nicht, aber sie vereinfacht den Update-Prozess später):

docker-compose down && docker-compose build --pull && docker-compose up -d

Auch erstelle ich noch einen Ordner mit dem Namen “proxy”, springe rein und erstelle die Datei Dockerfile und uploadsize.conf:

mkdir proxy

cd proxy

Dockerfile im Ordner proxy:

FROM jwilder/nginx-proxy:alpine
COPY uploadsize.conf /etc/nginx/conf.d/uploadsize.conf

uploadsize.conf im Ordner proxy (10G bedeutet, dass einzelne Dateien bis zu 10 GB über den Proxy hochgeladen werden dürfen):

client_max_body_size 10G;

Somit habe ich jetzt folgene Ordner- und Dateienstruktur:

jwilder-proxy/
├── docker-compose.yml
├── proxy
│   ├── Dockerfile
│   └── uploadsize.conf
└── update.sh

1 directory, 4 files

Starten kann ich den Proxy mit dem üblichen Befehl, im Ordner, wo die docker-compose.yml Datei drin liegt, also im Ordner jwilder-proxy:

docker-compose up -d

Es dauert kurz bis die Zertifikate und Keys erstellt werden, dann prüfe ich ob die beiden Container laufen:

docker ps

Das war es im großen und ganzen. Um jetzt einen anderen Container z. B. einen Webserver-Container unter einer Domain erreichbar zu machen, muss folgendes zu der gewünschten Docker-Compose Datei des Webservers hinzugefügt werden (Beispiel mit NGINX):

version: '3.1'

services:
  nginx:
    image: nginx
...
   environment:
      - VIRTUAL_HOST=houz.de
      - LETSENCRYPT_HOST=houz.de
      - [email protected]
      - ...
    networks:
      - proxy-tier


networks:
  proxy-tier:
    external: true

Einige stellen wurden mit “…” ausgeblendet. Wichtig ist die Definition der environment Variablen und die Anbindung des proxy-tier Netzwerkes. Wird dieses Netzwerk nicht angebunden, kann keine Verbindung durch den Proxy hergestellt werden.

Schaut euch am besten einen Beispielpost an, wie eine komplette Docker-Compose Datei eines Dienstes aussieht.

PS: Ein Update des Reverse Proxys kann ich ganz einfach mit der Datei “update.sh” durchführen. Sie macht nichts anderes, als den Proxy zu beenden, die neuen Pakete runterzuladen und den Proxy wieder zu starten:

sh update.sh