Docker: Gestire domini personalizzati con Traefik

Questa documentazione fa parte della guida Routing HTTPS. Consulta la guida completa qui: Come gestire il routing HTTP e la crittografia TLS (HTTPS) nei tuoi container Docker.

👋 Benvenuti nella documentazione di Stackhero!

Stackhero offre una soluzione Docker cloud CaaS (Containers as a Service) pronta all'uso che fornisce numerosi vantaggi, tra cui:

  • Distribuisci facilmente i tuoi container in produzione con un semplice docker-compose up.
  • Nome di dominio personalizzabile protetto con HTTPS (ad esempio, https://api.tua-azienda.com, https://www.tua-azienda.com, https://backoffice.tua-azienda.com).
  • Prestazioni ottimali e sicurezza robusta grazie a una VM privata e dedicata.
  • Aggiornamenti senza sforzo con un solo clic.

Risparmia tempo e semplifica la tua vita: bastano 5 minuti per provare la soluzione di hosting cloud Docker CaaS di Stackhero e distribuire i tuoi container in produzione!

Nell'esempio precedente, abbiamo utilizzato il dominio predefinito <XXXXXX>.stackhero-network.com. In pratica, probabilmente utilizzerai i tuoi domini aziendali o di progetto, come www.my-company.com o api.my-project.io. La sezione seguente spiega come configurare domini personalizzati.

In questo esempio, configurerai il dominio api.my-project.io. Sostituisci my-project.io con un dominio che possiedi e api con il tuo sottodominio desiderato.

Per prima cosa, aggiorna le impostazioni DNS del tuo dominio in modo che api.my-project.io punti al tuo dominio <XXXXXX>.stackhero-network.com.

  1. Accedi al tuo provider di dominio e accedi alla tua configurazione DNS.
  2. Crea una nuova voce chiamata api (o un altro sottodominio a tua scelta), imposta il suo tipo su CNAME e imposta la sua destinazione su <XXXXXX>.stackhero-network.com.

Esempio di configurazione DNS sull'interfaccia DNS di CloudflareEsempio di configurazione DNS sull'interfaccia DNS di Cloudflare

Una volta configurato il DNS, puoi convalidarlo eseguendo:

host api.my-project.io

Dovresti vedere una risposta simile a:

api.my-project.io is an alias for <XXXXXX>.stackhero-network.com

La propagazione DNS può richiedere fino a 24 ore a seconda del tuo provider. Se il comando host non restituisce la risposta prevista, attendi e riprova più tardi.

Successivamente, aggiorna il tuo file docker-compose.yml con la seguente configurazione:

services:
  api:
    image: traefik/whoami
    hostname: api
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.api.rule=Host(`api.my-project.io`)" # Aggiungi qui il tuo dominio
      - "traefik.http.services.api.loadbalancer.server.port=<PORT>" # Sostituisci "<PORT>" con la porta su cui la tua API sta ascoltando
      - "traefik.http.routers.api.tls.certresolver=letsencrypt"

Non dimenticare di sostituire api.my-project.io con il tuo dominio reale nell'etichetta Traefik Host.

Distribuisci il tuo container con:

docker-compose up -d

Poi visita https://api.my-project.io. Dovresti vedere una pagina di testo che mostra il nome host del tuo container api.

Prova che Traefik gestisce il nostro traffico HTTP con crittografia TLS per il nostro nuovo dominioProva che Traefik gestisce il nostro traffico HTTP con crittografia TLS per il nostro nuovo dominio

Alla prima creazione del container, i certificati TLS potrebbero richiedere alcuni secondi per essere generati. Se incontri un errore TLS, attendi qualche secondo e aggiorna la pagina per consentire il tempo necessario alla generazione dei certificati.

Congratulazioni, hai ora configurato il tuo primo dominio personalizzato!

Quando si definisce un URL del sito web come my-company.com, è una buona idea configurare anche un sottodominio "www". Questo garantisce che gli utenti che si connettono tramite www.my-company.com siano reindirizzati al tuo sito principale e aiuta a evitare problemi di contenuto duplicato.

Nell'esempio seguente, sia my-company.com che www.my-company.com sono gestiti. Gli utenti che accedono a www.my-company.com sono reindirizzati a 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`)" # Aggiungi entrambi i domini qui
      - "traefik.http.services.frontend.loadbalancer.server.port=<PORT>" # Sostituisci "<PORT>" con la porta su cui il tuo frontend sta ascoltando
      - "traefik.http.routers.frontend.tls.certresolver=letsencrypt"

      # Reindirizza 'www.my-company.com' a '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"

Supponiamo che tu abbia un container dedicato al tuo sito di documentazione. Potresti voler instradare https://my-company.com/docs a questo container mentre invii altre richieste, come https://my-company.com/, al tuo container frontend. L'esempio seguente mostra come questo viene realizzato:

services:
  documentations:
    image: traefik/whoami
    hostname: documentations
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.documentations.rule=Host(`my-company.com`) && PathPrefix(`/docs`)" # Definisci qui il prefisso del percorso
      - "traefik.http.services.documentations.loadbalancer.server.port=<PORT>" # Sostituisci "<PORT>" con la porta su cui il tuo container di documentazione sta ascoltando
      - "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>" # Sostituisci "<PORT>" con la porta su cui il tuo frontend sta ascoltando
      - "traefik.http.routers.frontend.tls.certresolver=letsencrypt"

      # Reindirizza 'www.my-company.com' a '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"

Ora, visitando https://my-company.com/docs (o qualsiasi sottopercorso come https://my-company.com/docs/something) verrà visualizzato il contenuto del container documentations. Altri percorsi, ad esempio https://my-company.com/help, saranno serviti dal container frontend.

Per impostazione predefinita, Traefik si connette alla prima porta esposta del container. In alcuni casi, potresti dover specificare una porta particolare. L'esempio seguente dimostra come definire una porta personalizzata:

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"

      # Instrada il traffico da 'https://my-company.com' al container 'frontend' sulla porta 80
      - "traefik.http.services.frontend.loadbalancer.server.port=80"