Docker: Benutzerdefinierte Domains mit Traefik verwalten
Diese Dokumentation ist Teil des HTTPS-Routing-Leitfadens. Den vollständigen Leitfaden finden Sie hier: Wie man HTTP-Routing und TLS-Verschlüsselung (HTTPS) in Docker-Containern verwaltet.
👋 Willkommen in der Stackhero-Dokumentation!
Stackhero bietet eine einsatzbereite Docker Cloud CaaS (Containers as a Service) Lösung, die zahlreiche Vorteile bietet, darunter:
- Einfache Bereitstellung Ihrer Container in der Produktion mit nur einem
docker-compose up.- Anpassbarer Domainname gesichert mit HTTPS (zum Beispiel, https://api.ihre-firma.com, https://www.ihre-firma.com, https://backoffice.ihre-firma.com).
- Optimale Leistung und robuste Sicherheit durch eine private und dedizierte VM.
- Mühelose Updates mit nur einem Klick.
Sparen Sie Zeit und vereinfachen Sie Ihr Leben: Es dauert nur 5 Minuten, um die Docker CaaS Cloud Hosting Lösung von Stackhero auszuprobieren und Ihre Container in der Produktion bereitzustellen!
Im vorherigen Beispiel haben wir die Standard-Domain <XXXXXX>.stackhero-network.com verwendet. In der Praxis werden Sie wahrscheinlich Ihre eigenen Unternehmens- oder Projektdomains verwenden, wie www.my-company.com oder api.my-project.io. Der folgende Abschnitt erklärt, wie benutzerdefinierte Domains konfiguriert werden.
Konfigurieren Sie Ihre erste Domain mit Traefik
In diesem Beispiel konfigurieren Sie die Domain api.my-project.io. Ersetzen Sie my-project.io durch eine Domain, die Sie besitzen, und api durch Ihren gewünschten Subdomain.
Aktualisieren Sie zunächst Ihre DNS-Einstellungen, damit api.my-project.io auf Ihre <XXXXXX>.stackhero-network.com-Domain zeigt.
- Melden Sie sich bei Ihrem Domainanbieter an und greifen Sie auf Ihre DNS-Konfiguration zu.
- Erstellen Sie einen neuen Eintrag namens
api(oder eine andere Subdomain Ihrer Wahl), setzen Sie den Typ aufCNAMEund setzen Sie das Ziel auf<XXXXXX>.stackhero-network.com.
Beispiel für DNS-Konfiguration auf der Cloudflare-DNS-Oberfläche
Sobald das DNS konfiguriert ist, können Sie es durch Ausführen des folgenden Befehls validieren:
host api.my-project.io
Sie sollten eine Antwort ähnlich der folgenden sehen:
api.my-project.io is an alias for <XXXXXX>.stackhero-network.com
Die DNS-Propagation kann je nach Anbieter bis zu 24 Stunden dauern. Wenn der
host-Befehl nicht die erwartete Antwort liefert, warten Sie bitte und versuchen Sie es später erneut.
Aktualisieren Sie als Nächstes Ihre docker-compose.yml-Datei mit der folgenden Konfiguration:
services:
api:
image: traefik/whoami
hostname: api
labels:
- "traefik.enable=true"
- "traefik.http.routers.api.rule=Host(`api.my-project.io`)" # Fügen Sie hier Ihre Domain hinzu
- "traefik.http.services.api.loadbalancer.server.port=<PORT>" # Ersetzen Sie "<PORT>" durch den Port, auf dem Ihre API hört
- "traefik.http.routers.api.tls.certresolver=letsencrypt"
Vergessen Sie nicht,
api.my-project.iodurch Ihre tatsächliche Domain im Traefik-LabelHostzu ersetzen.
Stellen Sie Ihren Container mit folgendem Befehl bereit:
docker-compose up -d
Besuchen Sie dann https://api.my-project.io. Sie sollten eine Textseite sehen, die den Hostnamen Ihres Containers api anzeigt.
Nachweis, dass Traefik unseren HTTP-Verkehr mit TLS-Verschlüsselung für unsere neue Domain verwaltet
Bei der ersten Containereinrichtung kann es einige Sekunden dauern, bis TLS-Zertifikate generiert werden. Wenn Sie einen TLS-Fehler erhalten, warten Sie einige Sekunden und aktualisieren Sie die Seite, um Zeit für die Zertifikatsgenerierung zu geben.
Herzlichen Glückwunsch, Sie haben nun Ihre erste benutzerdefinierte Domain konfiguriert!
Wie man eine "www"-Subdomain auf Ihre Root-Domain mit Traefik umleitet
Beim Definieren einer Website-URL wie my-company.com ist es eine gute Idee, auch eine "www"-Subdomain einzurichten. Dies stellt sicher, dass Benutzer, die sich über www.my-company.com verbinden, zu Ihrer Hauptseite umgeleitet werden und hilft, Probleme mit doppeltem Inhalt zu vermeiden.
Im folgenden Beispiel werden sowohl my-company.com als auch www.my-company.com behandelt. Benutzer, die auf www.my-company.com zugreifen, werden zu my-company.com umgeleitet:
services:
frontend:
image: traefik/whoami
hostname: frontend
labels:
- "traefik.enable=true"
- "traefik.http.routers.frontend.rule=Host(`my-company.com`) || Host(`www.my-company.com`)" # Fügen Sie beide Domains hier hinzu
- "traefik.http.services.frontend.loadbalancer.server.port=<PORT>" # Ersetzen Sie "<PORT>" durch den Port, auf dem Ihr Frontend hört
- "traefik.http.routers.frontend.tls.certresolver=letsencrypt"
# Leiten Sie 'www.my-company.com' zu 'my-company.com' um:
- 'traefik.http.routers.frontend.middlewares=redirect-www'
- "traefik.http.middlewares.redirect-www.redirectregex.regex=^https://www.my-company.com/(.*)"
- "traefik.http.middlewares.redirect-www.redirectregex.replacement=https://my-company.com/$${1}"
- "traefik.http.middlewares.redirect-www.redirectregex.permanent=true"
Einen Pfad zu einem bestimmten Container mit Traefik routen
Angenommen, Sie haben einen Container, der Ihrer Dokumentationsseite gewidmet ist. Sie möchten möglicherweise https://my-company.com/docs zu diesem Container routen, während andere Anfragen, wie https://my-company.com/, zu Ihrem Frontend-Container gesendet werden. Das folgende Beispiel zeigt, wie dies erreicht wird:
services:
documentations:
image: traefik/whoami
hostname: documentations
labels:
- "traefik.enable=true"
- "traefik.http.routers.documentations.rule=Host(`my-company.com`) && PathPrefix(`/docs`)" # Definieren Sie hier das Pfadpräfix
- "traefik.http.services.documentations.loadbalancer.server.port=<PORT>" # Ersetzen Sie "<PORT>" durch den Port, auf dem Ihr Dokumentationscontainer hört
- "traefik.http.routers.documentations.tls.certresolver=letsencrypt"
frontend:
image: traefik/whoami
hostname: frontend
labels:
- "traefik.enable=true"
- "traefik.http.routers.frontend.rule=Host(`my-company.com`) || Host(`www.my-company.com`)"
- "traefik.http.services.frontend.loadbalancer.server.port=<PORT>" # Ersetzen Sie "<PORT>" durch den Port, auf dem Ihr Frontend hört
- "traefik.http.routers.frontend.tls.certresolver=letsencrypt"
# Leiten Sie 'www.my-company.com' zu 'my-company.com' um:
- 'traefik.http.routers.frontend.middlewares=redirect-www'
- "traefik.http.middlewares.redirect-www.redirectregex.regex=^https://www.my-company.com/(.*)"
- "traefik.http.middlewares.redirect-www.redirectregex.replacement=https://my-company.com/$${1}"
- "traefik.http.middlewares.redirect-www.redirectregex.permanent=true"
Jetzt wird beim Besuch von https://my-company.com/docs (oder einem beliebigen Unterpfad wie https://my-company.com/docs/something) der Inhalt aus dem documentations-Container angezeigt. Andere Pfade, zum Beispiel https://my-company.com/help, werden vom frontend-Container bedient.
Einen benutzerdefinierten Container-Port in Traefik definieren
Standardmäßig verbindet sich Traefik mit dem ersten freigegebenen Port des Containers. In einigen Fällen müssen Sie möglicherweise einen bestimmten Port angeben. Das folgende Beispiel zeigt, wie ein benutzerdefinierter Port definiert wird:
services:
frontend:
image: traefik/whoami
hostname: frontend
labels:
- "traefik.enable=true"
- "traefik.http.routers.frontend.rule=Host(`my-company.com`)"
- "traefik.http.routers.frontend.tls.certresolver=letsencrypt"
# Leiten Sie den Verkehr von 'https://my-company.com' zum 'frontend'-Container auf Port 80
- "traefik.http.services.frontend.loadbalancer.server.port=80"