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ųfrontendkonteinerį. - Maršrutizuokite
https://www.my-company.com/documentationsį jūsųdocumentationskonteinerį. - Nukreipkite
https://api.my-project.ioį jūsųapikonteinerį.
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!
Traefik bazinė konfigūracija
Visuose tolesniuose konfigūracijos pavyzdžiuose turėsite pakeisti
<XXXXXX>.stackhero-network.comsavo 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 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.
Tvarkykite pasirinktinius domenus su Traefik
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.
Konfigūruokite savo pirmąjį domeną su Traefik
Š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ą.
- Prisijunkite prie savo domeno teikėjo ir pasiekite savo DNS konfigūraciją.
- Sukurkite naują įrašą pavadinimu
api(arba kitą jūsų pasirinkto subdomeno), nustatykite jo tipą kaipCNAMEir nustatykite jo paskirtį kaip<XXXXXX>.stackhero-network.com.
DNS 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
hostkomanda 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ėjeHost.
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
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ą!
Kaip nukreipti "www" subdomeną į jūsų pagrindinį domeną naudojant Traefik
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"
Maršrutizuoti kelią į konkretų konteinerį su Traefik
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.
Nustatyti pasirinktą konteinerio portą Traefik
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"
Traefik ir Docker Compose gerosios praktikos pavadinimų suteikimui
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.
Let's Encrypt klaida "Domeno vardas turi neteisingą simbolį"
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ų.