Docker: Tvarkykite pasirinktinius domenus su Traefik

Ši dokumentacija yra HTTPS maršrutizavimas vadovo dalis. Visą vadovą rasite čia: Kaip valdyti HTTP maršrutizavimą ir TLS šifravimą (HTTPS) jūsų Docker konteineriuose.

👋 Sveiki atvykę į Stackhero dokumentaciją!

Stackhero siūlo paruoštą naudoti Docker cloud CaaS (Containers as a Service) sprendimą, kuris suteikia daugybę privalumų, įskaitant:

  • Lengvai diekite savo konteinerius į gamybą su paprastu docker-compose up.
  • Pritaikomas domeno vardas su HTTPS apsauga (pavyzdžiui, https://api.jusu-imone.com, https://www.jusu-imone.com, https://backoffice.jusu-imone.com).
  • Optimali veikla ir tvirta apsauga naudojant privačią ir dedikuotą VM.
  • Paprasti atnaujinimai vienu paspaudimu.

Taupykite laiką ir supaprastinkite savo gyvenimą: tereikia 5 minučių išbandyti Stackhero Docker CaaS cloud hosting sprendimą ir diegti savo konteinerius į gamybą!

Ankstesniame pavyzdyje naudojome numatytąjį <XXXXXX>.stackhero-network.com domeną. Praktiškai greičiausiai naudosite savo įmonės ar projekto domenus, tokius kaip www.my-company.com ar api.my-project.io. Žemiau pateikta dalis paaiškina, kaip konfigūruoti pasirinktinius domenus.

Šiame pavyzdyje konfigūruosite domeną api.my-project.io. Pakeiskite my-project.io į domeną, kurį turite, ir api į norimą subdomeną.

Pirmiausia atnaujinkite savo domeno DNS nustatymus, kad api.my-project.io nukreiptų į jūsų <XXXXXX>.stackhero-network.com domeną.

  1. Prisijunkite prie savo domeno teikėjo ir pasiekite savo DNS konfigūraciją.
  2. Sukurkite naują įrašą pavadinimu api (arba kitą jūsų pasirinkto subdomeno), nustatykite jo tipą kaip CNAME ir nustatykite jo paskirtį kaip <XXXXXX>.stackhero-network.com.

DNS konfigūracijos pavyzdys Cloudflare DNS sąsajojeDNS konfigūracijos pavyzdys Cloudflare DNS sąsajoje

Kai DNS sukonfigūruotas, galite jį patikrinti paleisdami:

host api.my-project.io

Turėtumėte pamatyti atsakymą, panašų į:

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

DNS propagacija gali užtrukti iki 24 valandų, priklausomai nuo jūsų teikėjo. Jei host komanda negrąžina tikėtino atsakymo, palaukite ir bandykite dar kartą vėliau.

Tada atnaujinkite savo docker-compose.yml failą su šia konfigūracija:

services:
  api:
    image: traefik/whoami
    hostname: api
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.api.rule=Host(`api.my-project.io`)" # Pridėkite savo domeną čia
      - "traefik.http.services.api.loadbalancer.server.port=<PORT>" # Pakeiskite "<PORT>" į portą, kuriame jūsų API klausosi
      - "traefik.http.routers.api.tls.certresolver=letsencrypt"

Nepamirškite pakeisti api.my-project.io į savo tikrąjį domeną Traefik etiketėje Host.

Diekite savo konteinerį su:

docker-compose up -d

Tada apsilankykite https://api.my-project.io. Turėtumėte pamatyti tekstinį puslapį, rodantį jūsų konteinerio hostname api.

Įrodymas, kad Traefik tvarko mūsų HTTP srautą su TLS šifravimu mūsų naujam domenuiĮrodymas, kad Traefik tvarko mūsų HTTP srautą su TLS šifravimu mūsų naujam domenui

Pirmą kartą kuriant konteinerį, TLS sertifikatai gali užtrukti kelias sekundes generuoti. Jei susiduriate su TLS klaida, palaukite kelias sekundes ir atnaujinkite puslapį, kad leistumėte laiką sertifikatams generuoti.

Sveikiname, dabar sukonfigūravote savo pirmąjį pasirinktą domeną!

Nustatant svetainės URL, pvz., my-company.com, gera idėja taip pat nustatyti "www" subdomeną. Tai užtikrina, kad vartotojai, prisijungiantys per www.my-company.com, yra nukreipiami į jūsų pagrindinę svetainę ir padeda išvengti pasikartojančio turinio problemų.

Žemiau pateiktame pavyzdyje tiek my-company.com, tiek www.my-company.com yra tvarkomi. Vartotojai, pasiekiantys www.my-company.com, yra nukreipiami į 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`)" # Pridėkite abu domenus čia
      - "traefik.http.services.frontend.loadbalancer.server.port=<PORT>" # Pakeiskite "<PORT>" į portą, kuriame jūsų frontend klausosi
      - "traefik.http.routers.frontend.tls.certresolver=letsencrypt"

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

Tarkime, kad turite konteinerį, skirtą jūsų dokumentacijos svetainei. Galbūt norėsite maršrutizuoti https://my-company.com/docs į šį konteinerį, tuo pačiu metu siunčiant kitas užklausas, pvz., https://my-company.com/, į jūsų frontend konteinerį. Žemiau pateiktas pavyzdys parodo, kaip tai pasiekiama:

services:
  documentations:
    image: traefik/whoami
    hostname: documentations
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.documentations.rule=Host(`my-company.com`) && PathPrefix(`/docs`)" # Nustatyti kelio priešdėlį čia
      - "traefik.http.services.documentations.loadbalancer.server.port=<PORT>" # Pakeiskite "<PORT>" į portą, kuriame jūsų dokumentacijos konteineris klausosi
      - "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>" # Pakeiskite "<PORT>" į portą, kuriame jūsų frontend klausosi
      - "traefik.http.routers.frontend.tls.certresolver=letsencrypt"

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

Dabar, apsilankius https://my-company.com/docs (ar bet kuriame subkelyje, pvz., https://my-company.com/docs/something), bus rodomas turinys iš documentations konteinerio. Kiti keliai, pavyzdžiui, https://my-company.com/help, bus aptarnaujami frontend konteinerio.

Pagal numatytuosius nustatymus, Traefik jungiasi prie pirmojo konteinerio atidengto porto. Kai kuriais atvejais gali prireikti nurodyti konkretų portą. Žemiau pateiktas pavyzdys parodo, kaip nustatyti pasirinktą 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"

      # Maršrutizuoti srautą iš 'https://my-company.com' į 'frontend' konteinerį per portą 80
      - "traefik.http.services.frontend.loadbalancer.server.port=80"