Abbildung 1: Laradock und Traefik
Die Entwicklung mit Laravel ist dank des ausgezeichneten Ecosystems hervorragend und auch sehr bequem. Dank Homestead oder Valet (allerdings nur für Mac) erhält man eine Arbeitsumgebung und kann direkt losstarten.
Mit Docker ist es jedoch noch bequemer geworden, spätestens mit Laradock. Hierbei lassen sich die einzelnen Services nicht nur schnell zu- und abschalten, sondern auch viele Konfigurationen oder auch Umgebungen lassen sich wie mit git
verwalten.
Aber auch hier gibt es einen kleinen Nachteil - man verwendet localhost:port
, um auf den jeweiligen Dienst zuzugreifen. Zwar kann man auch etwas in die hosts
Datei (z.B. laradock.local
) eintragen, aber die Ports bleiben. Obwohl es in der docker-compose.yml
Einträge für Proxy, Varnish und mehr gibt, habe ich mich gefragt, wieso hier Traefik fehlt.
Wieso es uns recht nützlich sein könnte, beschreibe ich nun im weiteren Verlauf. Aber zuerst machen wir einen kleinen Sprung zu DNS.
DNS
Eine Website oder ein SaaS ist normalerweise unter einer Domain, wie z.B. audk.at
, verfügbar. Handelt es sich um ein größeres Projekt, so gibt es u.U. auch so etwas wie testing.audk.at
oder staging.audk.at
. Lokal wird jedoch oft so etwas wie audk.dev
oder audk.local
verwendet. Wieso eigentlich nicht *.dev.audk.at
? Wir könnten ja 127.0.0.1
eintragen und zudem auch noch über echte Let’s Encrypt Zertifikate arbeiten! Feine Sache, machen wir das mal.
Hierzu benutze ich mal docker
, um mir manuell ein Wildcard-Zertifikat über LE zu holen.
$ docker run -it --rm --name letsencrypt \
-v "$PWD/le/config:/etc/letsencrypt" \
-v "$PWD/le/work:/var/lib/letsencrypt" \
quay.io/letsencrypt/letsencrypt:latest \
certonly \
-d dev.audk.at \
-d *.dev.audk.at \
--manual \
--preferred-challenges dns \
--server https://acme-v02.api.letsencrypt.org/directory
Sobald dieser Vorgang erfolgreich abgeschlossen ist, kann man das Zertifikat mit Traefik nutzen.
Tipp: Wenn man seine Domain bei gewissen Anbietern hat, welche auch eine API anbieten, kann dieser Vorgang mit Traefik automatisiert werden
Traefik
Definieren wir mal eine docker-compose.yml
mit traefik
als unseren LB. Hier geben wir auch gleich die Subdomain an, unter welcher das Dashboard erreichbar ist.
version: '3'
services:
traefik:
image: traefik:latest
volumes:
- /var/run/docker.sock:/var/run/docker.sock
- ./traefik.toml:/traefik.toml
- $PWD/le/config/live/dev.audk.at/cert.pem:/cert.pem
- $PWD/le/config//live/dev.audk.at/privkey.pem:/key.pem
ports:
- "80:80"
- "443:443"
networks:
- proxy
labels:
- "traefik.port=8080"
- "traefik.enable=true"
- "traefik.frontend.rule=Host:lb.dev.audk.at"
- "traefik.docker.network=proxy"
networks:
proxy:
external:
name: proxy
Tipp: Das Netzwerk proxy
wurde vorher angelegt
Laradock
Sobald wir den LB laufen haben, können wir die einzelnen Services mit Laradock starten. Hierbei ist zu beachten, dass man in der .env
keine Ports 80/443
mehr verwendet, da diese vom LB belegt sind. Wenn wir nun aber die Services, so wie beschrieben, starten, bringt uns das nicht wirklich viel. Unter welcher Subdomain wären denn die einzelnen Services, wie z.B. nginx
oder mailhog
, erreichbar? Man denkt wohl zuerst, dass Veränderungen an der docker-compose.yml
im laradock
-Ordner nötig wären. Wir erinnern uns aber, dass man die Konfigurationen auch ergänzen kann. So legt man eine docker-compose.override.yml
im laradock
-Ordner (oder im eigenen Dev-Repo, hier ist man frei) an. Der Inhalt kann ungefähr so aussehen:
version: '3'
networks:
proxy:
external: true
services:
### NGINX Server #####################################################
nginx:
networks:
- proxy
labels:
- "traefik.port=80"
- "traefik.enable=true"
- "traefik.frontend.rule=Host:api.dev.audk.at"
- "traefik.docker.network=proxy"
...
Gestartet werden die Services nun jedoch etwas anders und zwar mit (z.B.) docker-compose -f docker-compose.yml -f docker-compose.override.yml up -d nginx postgres redis mailhog
. Nun kann man entweder den Browser öffnen und https://api.dev.audk.at
eingeben oder mit Postman auf eine API über HTTPS zugreifen.
Tipp: In der docker-compose.override.yml
können auch andere zusätzliche Services definiert werden, wie z.B. Keycloak