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.

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.

  1. Zaloguj się do swojego dostawcy domen i uzyskaj dostęp do konfiguracji DNS.
  2. Utwórz nowy wpis o nazwie api (lub innej wybranej subdomenie), ustaw jego typ na CNAME i ustaw jego cel na <XXXXXX>.stackhero-network.com.

Przykład konfiguracji DNS w interfejsie DNS CloudflarePrzykł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 host nie 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.io swoją rzeczywistą domeną w etykiecie Traefik Host.

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 domenyDowó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ę!

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"

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.

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"