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