- Traefik fungerer som en dynamisk omvendt proxy og løser TLS-sertifikater, mens Portainer tilbyr et grafisk grensesnitt for å administrere Docker og Swarm.
- Kombinasjonen av traefik.yml, dynamic.yml og docker-compose.yml lar deg definere inngangspunkter, sikkerhetsmellomvare og etikettbasert HTTP/HTTPS-ruting.
- I Docker-frittstående eller Swarm-scenarier kobler du ganske enkelt tjenester til proxy-nettverket og merker dem slik at Traefik kan oppdage og eksponere dem sikkert.
- Bruken av Let's Encrypt, dedikerte nettverk og grunnleggende autentisering på dashbordet konsoliderer et robust miljø for distribusjon av flere applikasjoner på én server.
Å sette opp en moderne stack med Docker, Traefik og Portainer er for tiden en av de enkleste måtene å administrere containere på en enkelt server og eksponere flere tjenester med HTTPS uten å bli forvirret av konfigurasjonen. Det fine med dette er at Traefik fungerer som en dynamisk reverse proxy, mens Portainer tilbyr et veldig enkelt webgrensesnitt for å administrere Docker og, hvis du vil, også Swarm.
I denne artikkelen vil du se hvordan monterer Traefik som en omvendt proxy foran Portainer I både et "klassisk" Docker (frittstående) scenario og en Docker Swarm-klynge, hvordan integrere TLS (selvsignert eller Let's Encrypt), og hvilke konfigurasjonsfiler som kommer i spill (traefik.yml, dynamic.yml y docker-compose.yml) og noen vanlige triks med mellomvare, nettverk og typiske taggingproblemer i Traefik.
Hvilke roller har Docker, Traefik og Portainer i arkitekturen?
I denne typen oppsett er Docker basislaget der containerne kjører, Traefik fungerer som en omvendt proxy og lastbalanserer som mottar alle HTTP/HTTPS-forespørsler på port 80 og 443 og sender dem til riktig container, og Portainer tilbyr et grafisk grensesnitt for å administrere bilder, containere, volumer, nettverk og Docker- eller Swarm-stabler.
Tanken er å ha én enkelt vert med Docker der Traefik ligger ved «inngangsporten»: lytt ved inngangspunktene web (80) y websecure (443), løser TLS-sertifikater (vanligvis med Let's Encrypt) og, takket være integrasjonen med Docker-leverandøren, oppdager automatisk tjenestene du eksponerer ved å legge til etiketter på containerne.
På den annen side fungerer Portainer som bare en annen beholder, men eksponert gjennom et spesifikt underdomene, for eksempel portainer.tudominio.com, beskyttet av TLS og, om ønskelig, bak en ekstra autentiseringsmellomvare utover Portainers egen pålogging. Alt dette er orkestrert med en Docker-komponere som definerer Traefik, Portainer og det vanlige nettverket av typen proxy.
En klar fordel med denne tilnærmingen er at du kan distribuere nye tjenester ganske enkelt ved å legge til etiketter på containerne dine: Traefik oppdager endringen i Docker, oppretter rutere, tjenester og mellomvare på farten, og i løpet av sekunder har du et nytt underdomene eller en ny rute oppe og går uten å manuelt berøre statiske konfigurasjonsfiler.
Traefik statisk konfigurasjon: traefik.yml
Traefiks statiske konfigurasjon lagres vanligvis i en fil som traefik.ymlsom er montert inne i beholderen. Her er den definert dashbord, inngangspunkter, leverandører og sertifikatløser La oss kryptere, blant annet.
En typisk YAML-konfigurasjon starter med å aktivere API-et og kontrollpanelet med noe sånt som api: dashboard: trueDette gir tilgang til webgrensesnittet der du kan se rutere, tjenester og mellomvare. Dette panelet er ikke autentisert som standard, så vi skal se senere hvordan du sikrer det med grunnleggende autentisering fra den dynamiske konfigurasjonen.
Deretter defineres inngangspunktene. Normalt finnes det et inngangspunkt web i havn 80 og andre websecure i 443. På web En automatisk omdirigering er vanligvis konfigurert til å websecureslik at all HTTP-tilgang blir omdirigert til HTTPS:
En typisk disposisjon vil inneholde en seksjon http.redirections.entryPoint.to: websecure å fremtvinge den omdirigeringen og sentralisere all kryptert trafikk på det sikre inngangspunktet.
Til websecure Det er indikert at TLS skal brukes, og en lenke er oppgitt. certResolver (for eksempel letsencrypt) som vil være ansvarlig for automatisk administrasjon av sertifikatene. Alt dette støttes av ACME, som er protokollen som Let's Encrypt bruker til å utstede og fornye sertifikater.
I blokken tilbydere Docker-leverandøren er konfigurert og peker til socketen unix:///var/run/docker.sockmed ett nøkkelalternativ: exposedByDefault: falseMed dette publiserer ikke Traefik alle beholdere som standard; bare de som har etiketten. traefik.enable=trueDu kan også konfigurere en filleverandør (file) for å laste inn en ekstra dynamisk konfigurasjon fra, for eksempel, /configurations/dynamic.yml.
Til slutt inneholder den statiske filen vanligvis seksjonen certificatesResolversder ACME-resolveren er definert: registrerings-e-postadresse, lagringsfil (vanligvis acme.json), nøkkeltype (for eksempel EC384) og valideringsmetoden (for eksempel httpChallenge på inngangspunktet webDet er viktig at sette opp en ekte e-post i denne delen fordi Let's Encrypt bruker den til varsler og fornyelser. Hvis du legger igjen en dummy- eller feilformet verdi, kan du støte på feil når du starter Traefik-containeren.
I tillegg til denne YAML-konfigurasjonen finnes det distribusjoner som bruker TOML-format (traefik.toml)Men logikken er den samme: de deler opp resolver-sertifikater (for eksempel [certificatesResolvers.main.acme]), definere utfordringer (som dnsChallenge med provider = "route53") og legg til standard TLS-alternativer, for eksempel makt minVersion = "VersionTLS13" eller konfigurer en liste over cipherSuites tillatt.
Dynamisk konfigurasjon: mellomvare, TLS og sikkerhet
Den dynamiske delen av Traefik går vanligvis i en fil som dynamic.yml, lastet inn av filleverandøren. Her definerer du mellomvare og TLS-alternativer som kan endres uten å starte Traefik-containeren på nytt, noe som er veldig nyttig for å justere sikkerheten underveis.
Et typisk tilfelle er å lage header-mellomvare, for eksempel secureHeaderssom legger til retningslinjer knyttet til HSTS og obligatorisk bruk av HTTPS. I YAML kan du finne parametere som sslRedirect: true, forceSTSHeader: true, stsIncludeSubdomains: true, stsPreload: true og en stsSeconds høy (for eksempel et år i sekunder). Dette styrker trafikksikkerheten fra nettlesersiden.
En annen vanlig mellomvare er en for grunnleggende autentisering, for eksempel user-auth av typen basicAuth, hvor en liste over brukere er deklarert i formatet usuario:hashHashen genereres vanligvis med htpasswd og er innebygd i filen. Denne mellomprogramvaren er vanligvis knyttet til Traefik-dashbordruteren, slik at den i tillegg til HTTPS-tilgang krever et brukernavn og passord.
Innenfor den samme dynamiske konfigurasjonen er det vanlig å se en blokk tls.options med en standardprofil (default) der de støttede chifferene og minimum TLS-versjonen er angitt, for eksempel VersionTLS12I noen distribusjoner er flere alternativer definert (for eksempel en profil kalt tls12 og andre default) for å tilpasse sikkerhetsnivået til ulike tjenester om nødvendig.
I miljøer der det er ønskelig å bruke TLS også internt Mellom Traefik og backend-tjenester (som Portainer) kan det oppstå et problem der disse tjenestene ikke har et sertifikat som er anerkjent av en offentlig CA. Det er her alternativet kommer inn i bildet. insecureSkipVerify, som, konfigurert under providers.http.tls eller i de riktige TLS-alternativene, lar det Traefik omgå validering av backend-sertifikater. Dette er nyttig for laboratoriemiljøer eller interne selvsignerte sertifikater, men bør brukes med forsiktighet fordi det letter på verifiseringen.
En praktisk detalj: filen dynamic.yml Den kan redigeres på sparket.Traefik laster inn den dynamiske konfigurasjonen på nytt uten å kreve omstart, slik at du kan legge til eller fjerne mellomprogramvare, endre sikkerhetshoder eller modifisere grunnleggende autentisering uten å påvirke proxy-tilgjengeligheten.
docker-compose med Traefik og Portainer i Docker standalone
I et scenario uten Docker, uten Swarm, er det vanligste å lansere Traefik og Portainer med en singel docker-compose.yml som definerer både tjenester og et delt brolignende nettverk kalt for eksempel proxy.
Tjenesten Traefik Den bruker vanligvis det offisielle bildet, for eksempel traefik:latest eller en spesifikk versjon som traefik:v3.4Portene er kartlagt. 80 og 443 for webtrafikk og, i noen eksempler, port 8080 for å eksponere kontrollpanelet internt. I tillegg er alternativet lagt til restart: unless-stopped og sikkerheten er forsterket med security_opt: - no-new-privileges:true for å redusere risikoen for rettighetseskalering i containeren.
Når det gjelder volumer, må Traefik montere den skrivebeskyttede Docker-socketen (/var/run/docker.sock:/var/run/docker.sock:ro) for å oppdage containere, den statiske filen traefik.yml og katalogen der den dynamiske konfigurasjonen skal lagres (./traefik-data/configurations:/configurationsFilen er også montert. acme.jsonDet er her Traefik lagrer sertifikatene utstedt av Let's Encrypt. Denne filen opprettes på verten og gis tillatelser. 600 slik at bare den aktuelle brukeren kan lese og skrive den; hvis du lar den stå med 644, klager Traefik vanligvis.
Nøkkelen til at Traefik utøver magien sin er serviceetiketterBlant annet finner du: traefik.enable=true (slik at Docker-leverandøren eksponerer denne tjenesten), traefik.docker.network=proxy (angir hvilket nettverk Traefik skal bruke for å kommunisere med containeren), og en ruter som traefik.http.routers.traefik-secure, med etiketter som definerer inngangspunktet (websecure), vertsregelen (for eksempel Host(`traefik.tudominio.com`)), den tilknyttede tjenesten (api@internal) og autentiseringsmellomvare (user-auth@file).
Tjeneste transportør i det samme docker-compose.yml bruker vanligvis portainer/portainer-ce:latest (eller Enterprise-utgaven hvis du har en lisens). Lignende volumer er montert: Docker-socketen, datamappen (./portainer-data:/data) og ofte også /etc/localtime slik at den arver vertens tidssone.
Portainers etiketter registrerer det hos Traefik: traefik.enable=true, traefik.docker.network=proxyen ruter av typen traefik.http.routers.portainer-secure med inngangspunkt websecure og en vertsregel som Host(`portainer.tudominio.com`)I tillegg er tjenesten som Traefik skal bruke definert, og peker til den interne porten til Portainer, for eksempel med traefik.http.services.portainer.loadbalancer.server.port=9000.
Med alt dette i gang, etter lanseringen docker compose up -d I stakkkatalogen laster Traefik ned bildene og oppretter nettverket. proxy Hvis den er deklarert som ekstern og eksponerer begge panelene i de konfigurerte underdomenene, med Automatisk HTTPS takket være Let's EncryptFra det tidspunktet handler det å legge til nye tjenester om å klone prosjektet ditt, legge til noen Traefik-etiketter og koble det til nettverket. proxy.
Docker Swarm-scenario: Portainer og Traefik i en klynge
Når du aktiverer Docker Swarm, endrer ting seg litt, fordi tjenester distribueres som stabler og nettverk vanligvis er overlay-baserte. Den underliggende logikken med Traefik og Portainer er imidlertid veldig lik: Traefik fortsetter å fungere som en omvendt proxy og dynamisk tjenesteoppdager, og Portainer kan operere i både frittstående modus og Portainer + agent- modus for å administrere eksterne noder i klyngen.
I en typisk Swarm-distribusjon opprettes stakken før den brukes. to overlay-nettverk som Traefik vil bruke til å rute trafikk mellom noder. I tillegg opprettes et volum for å lagre Portainer-data (for eksempel) portainer_data) og, hvis du trenger det, en for acme.json eller katalogen der Traefik lagrer sertifikater og konfigurasjon.
El docker-compose.yml (som deretter utfolder seg med docker stack deploy ved å bruke for eksempel -c portainer.yml) definerer vanligvis to tjenester: Portainer-agent, som kjører i modus global på alle Linux-noder, og den viktigste Portainer-tjenesten (CE eller EE), som vanligvis forblir i replikert modus med en begrensning til bare å kjøre på administratorer.
Portainer-agenten monterer Docker-socketen og volumkatalogen (/var/lib/docker/volumes) for å kunne inspisere ressurser. Den kobler seg til overlay-nettverket som den vil dele med Traefik, for eksempel traefik_publicHovedtjenesten i Portainer kan konfigureres til å kommunisere med agenten via TCP (tcp://tasks.agent:9001) og faktisk, i noen eksempler vises kommandoen med --tlsskipverify kommentert, for å hoppe over TLS-verifiseringen om nødvendig.
På samme eller en annen stabel starter Traefik opp med Docker-leverandøren i Swarm-modus (swarmMode = true i TOML eller tilsvarende alternativ i flagg), observere de merkede tjenestene. Konfigurasjonen inkluderer en certificatesResolvers.main.acme for Let's Encrypt, en dnsChallenge med en leverandør som Route53 Hvis du vil validere sertifikater via DNS, og en blokk med tls.options hvor det for eksempel er tvunget minVersion = "VersionTLS13" for standardprofilen, og en eksplisitt liste er definert av cipherSuites for en TLS 1.2-profil.
Portainers etiketter hos Swarm følger den samme filosofien: traefik.enable=trueen ruter som traefik.http.routers.portainer med Host(`portainer.midominio.com`), traefik.http.routers.portainer.entrypoints=https (o websecure (i henhold til navngivningen), og traefik.http.routers.portainer.tls=true for å aktivere TLS på den ruteren. I tillegg kan du spesifisere certresolver med traefik.http.routers.portainer.tls.certresolver=main og backend-skjemaet hvis tjenesten snakker HTTPS internt med traefik.http.services.portainer.loadbalancer.server.scheme=https.
I Traefik-feilsøkingsloggene i Swarm vil du se den genererte konfigurasjonen: rutere som api y portainer, tjenester oppdaget (for eksempel portainer en http://10.0.1.12:9000 og en tjeneste traefik (peker til port 8080 på dashbordet), og hvis det er et problem med dårlig definerte etiketter, meldinger som "Kunne ikke definere tjenestenavnet for ruteren: for mange tjenester"som vanligvis indikerer at det er en konflikt eller duplisering av tjenester knyttet til en ruter.
Minimalt eksempel: whoami, ruter og TLS med Traefik
Før vi tar Portainer med i ligningen, er det ganske praktisk å prøve Traefik med et veldig enkelt backend, som på bildet. traefik/whoamisom returnerer informasjon om forespørselen. Dette hjelper deg med å bekrefte at Traefik er riktig konfigurert og at rutingsreglene fungerer.
Un docker-compose.yml grunnleggende kan inkludere tjenesten traefik med bildet traefik:v3.4, montere Docker-sokkelen og definere oppstartsflaggene som --providers.docker=true, --providers.docker.exposedbydefault=false, --providers.docker.network=proxy og inngangspunktet --entryPoints.web.address=:80Portene 80 og 8080 annonseres på verten, og et nettverk opprettes. proxy som også vil bruke beholderen whoami.
Tjenesten whoami Den starter på samme nettverk og er merket med traefik.enable=trueDeretter defineres en ruter med etiketten traefik.http.routers.whoami.rule=Host(`whoami.docker.localhost`) og det er indikert at inngangspunktet ditt er webHvis du sender en forespørsel med curl -H "Host: whoami.docker.localhost" http://localhost/Du vil se et svar med vertsnavn, IP-adresser, overskrifter og så videre, som bekrefter at Traefik ruter riktig.
Derfra er det enkelt legg til ruting etter stierFor eksempel kan du opprette en annen tjeneste. whoami-api med samme bilde, på samme nettverk, og tagg det med en regel av typen Host(`whoami.docker.localhost`) && PathPrefix(`/api`)Dermed roten / gå til whoami originalen og forespørslene til /api vil tjene dem whoami-apiDu kan bekrefte dette ved å sende forespørsler til / ya /api med samme vert.
Å aktivere TLS I dette lokale miljøet er ett alternativ å generere et selvsignert sertifikat for domenet. *.docker.localhost med opensslDu oppretter en katalog certsgenererer du local.key y local.crt, og deretter legger du til en dynamisk fil (for eksempel dynamic/tls.yml) med seksjonen tls: og rutene certFile y keyFile peker på disse filene.
Deretter oppdaterer du Traefik-tjenestedefinisjonen i docker-compose.yml å montere mappen ./certs og mappen ./dynamic inne i containeren aktiverer du det sikre API-et med --api.dashboard=true, du oppretter inngangspunktet websecure (--entryPoints.websecure.address=:443) og aktiver TLS der med --entryPoints.websecure.http.tls=trueDu merker også dashbordruteren og ruterne til whoami for dem å bruke websecure og har tls=true.
Når det er oppe, vil du kunne få tilgang https://whoami.docker.localhost/ og til Traefik-panelet med et selvsignert sertifikat, og godtar nettleserens sikkerhetsadvarsel. Denne opplevelsen er veldig lik den du senere vil ha i produksjon med Let's Encrypt, men uten å være avhengig av offentlige DNS-servere.
Beste praksis, apputrulling og løsning av typiske problemer
Et mønster som går igjen i alle disse eksemplene er at Traefik forenkler utrullingen av nye applikasjoner betrakteligNår du har basisstakken din (Traefik + Portainer + nettverk) proxy (+ sertifikater), å legge til en ny tjeneste koker vanligvis ned til:
Klon prosjektet eller kopier docker-compose.yml til serveren, pek et underdomene til vertens IP-adresse ved hjelp av en rekord A i DNS-en din (for eksempel app.tudominio.com), og legg deretter til nøkkeletikettene til tjenesten: traefik.enable=true, traefik.docker.network=proxy og en ruter med en vertsregel for det underdomenet, som spesifiserer det sikre inngangspunktet websecure og tjeneste med riktig intern port.
Mange veiledninger ville for eksempel vise utrullingen av en liten app FastAPI Separert: fire etiketter legges til, slik at den kobles til nettverket proxy i seksjonen networks den docker-compose.ymlog etter å ha gjort docker compose up -d Appen vises automatisk på Traefik-dashbordet med TLS aktivert. Traefiks automatiske oppdagelse betyr at du ikke engang trenger å justere de statiske innstillingene.
For å sikre at alt går knirkefritt, er det viktig å være oppmerksom på noen få detaljer: ikke bruk samme ruteridentifikator på nytt I ulike apper, sjekk at det bare er én tjeneste tilknyttet hver ruter (unngå feilen «for mange tjenester»), bruk konsistente nettverksnavn (for eksempel proxy på alle stablene du vil eksponere), og hvis du bruker Let's Encrypt, sørg for at acme.json Den har tillatelser 600 og den konfigurerte e-postadressen er gyldig.
I Swarm-miljøer må du også sjekke at Traefik-konfigurasjonen inkluderer Docker-leverandøren. swarmMode=true y watch=trueog at tjenestenes begrensninger (for eksempel node.role == manager (for Portainer) er ikke i konflikt med hvor Traefik er distribuert. Feilsøkingsloggene er svært ordrike, men er viktige for å finne problemer med ruting eller TLS.
Ved å kombinere Docker, Traefik og Portainer kan du sette opp et komplett lettvektsorkestreringsmiljø på én server, med grafiske dashbord, automatiske sertifikater og en veldig rask distribusjonsflyt, der det å legge til, oppdatere eller fjerne tjenester reduseres til å justere noen få linjer med YAML og la Traefik gjøre det skitne arbeidet med omvendt proxy og TLS.
