Docker: Obsługa niestandardowych domen za pomocą Traefik
Ta dokumentacja jest częścią przewodnika Routing HTTPS. Pełny przewodnik znajdziesz tutaj: Jak zarządzać routingiem HTTP i szyfrowaniem TLS (HTTPS) w kontenerach Docker.
👋 Witamy w dokumentacji Stackhero!
Stackhero oferuje gotowe do użycia rozwiązanie Docker cloud CaaS (Containers as a Service), które zapewnia wiele korzyści, w tym:
- Łatwe wdrażanie kontenerów do produkcji za pomocą prostego
docker-compose up.- Dostosowywana nazwa domeny zabezpieczona HTTPS (na przykład, https://api.twoja-firma.com, https://www.twoja-firma.com, https://backoffice.twoja-firma.com).
- Optymalna wydajność i solidne zabezpieczenia dzięki prywatnej i dedykowanej VM.
- Bezproblemowe aktualizacje za pomocą jednego kliknięcia.
Oszczędzaj czas i upraszczaj swoje życie: wystarczy 5 minut, aby wypróbować rozwiązanie Docker CaaS cloud hosting Stackhero i wdrożyć swoje kontenery do produkcji!
W poprzednim przykładzie użyliśmy domyślnej domeny <XXXXXX>.stackhero-network.com. W praktyce prawdopodobnie użyjesz własnych domen firmowych lub projektowych, takich jak www.my-company.com lub api.my-project.io. Poniższa sekcja wyjaśnia, jak skonfigurować niestandardowe domeny.
Konfiguracja pierwszej domeny z Traefik
W tym przykładzie skonfigurujesz domenę api.my-project.io. Zastąp my-project.io domeną, którą posiadasz, a api pożądanym subdomeną.
Najpierw zaktualizuj ustawienia DNS swojej domeny, aby api.my-project.io wskazywało na domenę <XXXXXX>.stackhero-network.com.
- Zaloguj się do swojego dostawcy domen i uzyskaj dostęp do konfiguracji DNS.
- Utwórz nowy wpis o nazwie
api(lub innej wybranej subdomenie), ustaw jego typ naCNAMEi ustaw jego cel na<XXXXXX>.stackhero-network.com.
Przykład konfiguracji DNS w interfejsie DNS Cloudflare
Po skonfigurowaniu DNS możesz go zweryfikować, uruchamiając:
host api.my-project.io
Powinieneś zobaczyć odpowiedź podobną do:
api.my-project.io is an alias for <XXXXXX>.stackhero-network.com
Propagacja DNS może zająć do 24 godzin w zależności od dostawcy. Jeśli polecenie
hostnie zwraca oczekiwanej odpowiedzi, poczekaj i spróbuj ponownie później.
Następnie zaktualizuj swój plik docker-compose.yml z następującą konfiguracją:
services:
api:
image: traefik/whoami
hostname: api
labels:
- "traefik.enable=true"
- "traefik.http.routers.api.rule=Host(`api.my-project.io`)" # Dodaj tutaj swoją domenę
- "traefik.http.services.api.loadbalancer.server.port=<PORT>" # Zastąp "<PORT>" portem, na którym nasłuchuje Twoje API
- "traefik.http.routers.api.tls.certresolver=letsencrypt"
Nie zapomnij zastąpić
api.my-project.ioswoją rzeczywistą domeną w etykiecie TraefikHost.
Wdróż swój kontener za pomocą:
docker-compose up -d
Następnie odwiedź https://api.my-project.io. Powinieneś zobaczyć stronę tekstową wyświetlającą nazwę hosta Twojego kontenera api.
Dowód, że Traefik obsługuje nasz ruch HTTP z szyfrowaniem TLS dla naszej nowej domeny
Przy pierwszym tworzeniu kontenera certyfikaty TLS mogą zająć kilka sekund do wygenerowania. Jeśli napotkasz błąd TLS, poczekaj kilka sekund i odśwież stronę, aby dać czas na wygenerowanie certyfikatów.
Gratulacje, skonfigurowałeś swoją pierwszą niestandardową domenę!
Jak przekierować subdomenę "www" do swojej domeny głównej za pomocą Traefik
Podczas definiowania adresu URL strony internetowej, takiego jak my-company.com, warto również skonfigurować subdomenę "www". Zapewnia to, że użytkownicy łączący się przez www.my-company.com są przekierowywani do Twojej głównej strony i pomaga unikać problemów z duplikatami treści.
W poniższym przykładzie obsługiwane są zarówno my-company.com, jak i www.my-company.com. Użytkownicy uzyskujący dostęp do www.my-company.com są przekierowywani do my-company.com:
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`)" # Dodaj tutaj obie domeny
- "traefik.http.services.frontend.loadbalancer.server.port=<PORT>" # Zastąp "<PORT>" portem, na którym nasłuchuje Twój frontend
- "traefik.http.routers.frontend.tls.certresolver=letsencrypt"
# Przekieruj 'www.my-company.com' do 'my-company.com':
- '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"
Przekierowanie ścieżki do konkretnego kontenera za pomocą Traefik
Załóżmy, że masz kontener dedykowany swojej stronie dokumentacji. Możesz chcieć przekierować https://my-company.com/docs do tego kontenera, jednocześnie wysyłając inne żądania, takie jak https://my-company.com/, do swojego kontenera frontend. Poniższy przykład pokazuje, jak to osiągnąć:
services:
documentations:
image: traefik/whoami
hostname: documentations
labels:
- "traefik.enable=true"
- "traefik.http.routers.documentations.rule=Host(`my-company.com`) && PathPrefix(`/docs`)" # Zdefiniuj tutaj prefiks ścieżki
- "traefik.http.services.documentations.loadbalancer.server.port=<PORT>" # Zastąp "<PORT>" portem, na którym nasłuchuje Twój kontener dokumentacji
- "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>" # Zastąp "<PORT>" portem, na którym nasłuchuje Twój frontend
- "traefik.http.routers.frontend.tls.certresolver=letsencrypt"
# Przekieruj 'www.my-company.com' do 'my-company.com':
- '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"
Teraz, odwiedzając https://my-company.com/docs (lub dowolną podścieżkę, taką jak https://my-company.com/docs/something), zobaczysz zawartość z kontenera documentations. Inne ścieżki, na przykład https://my-company.com/help, będą obsługiwane przez kontener frontend.
Definiowanie niestandardowego portu kontenera w Traefik
Domyślnie Traefik łączy się z pierwszym wystawionym portem kontenera. W niektórych przypadkach możesz potrzebować określić konkretny port. Poniższy przykład pokazuje, jak zdefiniować niestandardowy port:
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"
# Przekieruj ruch z 'https://my-company.com' do kontenera 'frontend' na porcie 80
- "traefik.http.services.frontend.loadbalancer.server.port=80"