Docker: HTTPS maršrutizavimas

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ą!

Kiekviena Stackhero for Docker instancija apima dedikuotą, iš anksto sukonfigūruotą Traefik serverį, kuris valdo HTTP srautą ir automatiškai jį šifruoja naudodamas TLS sertifikatus. Ši supaprastinta konfigūracija daro maršrutizavimą paprastą ir efektyvų. Pavyzdžiui:

  • Siųskite srautą iš https://www.my-company.com (su arba be www priešdėlio) į jūsų frontend konteinerį.
  • Maršrutizuokite https://www.my-company.com/documentations į jūsų documentations konteinerį.
  • Nukreipkite https://api.my-project.io į jūsų api konteinerį.

Galite valdyti neribotą domenų skaičių su automatiniu TLS sertifikatų kūrimu ir atnaujinimu. Geriausia tai, kad galite viską sukonfigūruoti tik trimis eilutėmis!

Visuose tolesniuose konfigūracijos pavyzdžiuose turėsite pakeisti <XXXXXX>.stackhero-network.com savo Stackhero for Docker instancijos domeno vardu.

Žemiau pateiktas pagrindinis docker-compose.yml failo pavyzdys:

services:
  test:
    image: nginx
    labels:
      - "traefik.enable=true" # Įgalinti Traefik maršrutizuoti srautą į šį konteinerį
      - "traefik.http.routers.test.rule=Host(`<XXXXXX>.stackhero-network.com`)" # Nustatyti hostą
      - "traefik.http.routers.test.tls.certresolver=letsencrypt" # Naudoti 'letsencrypt' kaip TLS sertifikato sprendėją

Šiame pavyzdyje konteineris pavadinimu test veikia naudojant Nginx atvaizdą. Pagrindinė konfigūracija pateikiama etikečių skyriuje. Jums tereikia nukopijuoti šias eilutes į savo docker-compose.yml failą ir pakeisti <XXXXXX>.stackhero-network.com savo paslaugos domenu.

Galite diegti konteinerį naudodami:

docker context use <XXXXXX>.stackhero-network.com
docker-compose up

Po konteinerio paleidimo apsilankykite https://<XXXXXX>.stackhero-network.com/, kad pamatytumėte "Welcome to nginx!" puslapį.

Nginx pasveikinimo puslapisNginx pasveikinimo puslapis

Jei nematote Nginx pasveikinimo puslapio, patikrinkite Traefik prietaisų skydelį dėl galimų klaidų!

Su šia konfigūracija HTTP užklausos, siunčiamos į <XXXXXX>.stackhero-network.com, yra maršrutizuojamos į jūsų test konteinerį, o Traefik automatiškai kuria ir valdo TLS sertifikatus HTTPS.

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"

Nustatant konteinerį jūsų docker-compose.yml faile, keli laukai yra svarbūs geresniam nuoseklumui ir valdymo paprastumui. Apsvarstykite galimybę naudoti šią rekomenduojamą konfigūraciją:

services:
  <CONTAINER_NAME>:
    image: traefik/whoami
    hostname: <CONTAINER_NAME>
    container_name: <CONTAINER_NAME>
    restart: unless-stopped
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.<CONTAINER_NAME>.rule=Host(`my-company.com`)"
      - "traefik.http.routers.<CONTAINER_NAME>.tls.certresolver=letsencrypt"

Tiesiog pakeiskite <CONTAINER_NAME> į norimą jūsų konteinerio pavadinimą, pavyzdžiui, frontend.

Kuriant subdomeną, Let's Encrypt laikosi RFC 952 ir 1123, kurie leidžia tik simbolius iš rinkinio [a-zA-Z0-9-].

Nors pabraukimai ('_') yra leidžiami DNS įrašų pavadinimuose, jie nėra priimtini hostų varduose. Todėl Let's Encrypt atmeta subdomenus, tokius kaip "my_subdomain.example.com", ir rodo klaidą "Domeno vardas turi neteisingą simbolį".

Norėdami išspręsti šią problemą, tiesiog pašalinkite visus pabraukimus iš savo subdomenų.