Si të integrohen Docker, Traefik dhe Portainer si një pirg i plotë

Përditësimi i fundit: 7 Mars 2026
  • Traefik vepron si një proxy dinamik i kundërt dhe zgjidh certifikatat TLS, ndërsa Portainer ofron një ndërfaqe grafike për menaxhimin e Docker dhe Swarm.
  • Kombinimi i traefik.yml, dynamic.yml dhe docker-compose.yml ju lejon të përcaktoni pikat e hyrjes, middleware-in e sigurisë dhe rrugëzimin HTTP/HTTPS të bazuar në etiketë.
  • Në skenarët e pavarur të Docker ose Swarm, thjesht bashkoni shërbimet në rrjetin proxy dhe etiketoni ato në mënyrë që Traefik të mund t'i zbulojë dhe ekspozojë ato në mënyrë të sigurt.
  • Përdorimi i Let's Encrypt, rrjeteve të dedikuara dhe autentifikimit bazë në panelin e kontrollit konsolidon një mjedis të fuqishëm për vendosjen e aplikacioneve të shumta në një server të vetëm.

Docker Portainer Traefik

Konfigurimi i një stack-u modern me Docker, Traefik dhe Portainer është aktualisht një nga mënyrat më të lehta për të menaxhuar kontejnerët në një server të vetëm dhe për të ekspozuar shërbime të shumëfishta me HTTPS pa u zhytur në konfigurim. Bukuria e kësaj është se Traefik vepron si një proxy dinamik i kundërt, ndërsa Portainer ofron një ndërfaqe shumë të thjeshtë në internet për menaxhimin e Docker dhe, nëse dëshironi, edhe të Swarm.

Në këtë artikull do të shihni se si duke e përshtatur Traefik si një përfaqësues të kundërt përpara Portainer Si në një skenar "klasik" të Docker (të pavarur) ashtu edhe në një klaster Docker Swarm, si të integrohet TLS (vetë-nënshkruar ose Let's Encrypt) dhe cilat skedarë konfigurimi hyjnë në lojë (traefik.yml, dynamic.yml y docker-compose.yml) dhe disa truke të zakonshme me middleware, rrjete dhe probleme tipike të etiketimit në Traefik.

Çfarë rolesh kanë Docker, Traefik dhe Portainer në arkitekturë?

Në këtë lloj konfigurimi, Docker është shtresa bazë ku funksionojnë kontejnerët, Traefik vepron si një proxy i kundërt dhe balancues i ngarkesës që merr të gjitha kërkesat HTTP/HTTPS në portet 80 dhe 443 dhe i dërgon ato në kontejnerin përkatës, dhe Portainer ofron një ndërfaqe grafike për menaxhimin e imazheve, kontejnerëve, vëllimeve, rrjeteve dhe pirgjeve Docker ose Swarm.

Ideja është të kemi një host të vetëm me Docker ku Traefik ndodhet në "portë": dëgjoni në pikat e hyrjes web (80) y websecure (443), zgjidh certifikatat TLS (zakonisht me Let's Encrypt) dhe, falë integrimit me ofruesin e Docker, zbulon automatikisht shërbimet që ekspozoni duke shtuar etiketa në kontejnerë.

Nga ana tjetër, Portainer funksionon si një kontejner tjetër, por i ekspozuar përmes një nën-domen specifik, për shembull portainer.tudominio.com, i mbrojtur nga TLS dhe, nëse dëshirohet, pas një middleware shtesë vërtetimi përtej hyrjes së Portainer. E gjithë kjo është orkestruar me një Docker-Shkruaj që përcakton Traefik, Portainer dhe rrjetin e përbashkët të tipit proxy.

Një avantazh i qartë i kësaj qasje është se ju mund të vendosni shërbime të reja thjesht duke shtuar etiketa në kontejnerët tuaj: Traefik zbulon ndryshimin në Docker, krijon routerë, shërbime dhe middleware menjëherë, dhe brenda sekondave keni një nën-domen ose rrugë të re në funksion pa prekur manualisht skedarët e konfigurimit statik.

Konfigurimi statik i Traefik: traefik.yml

Konfigurimi statik i Traefik zakonisht ruhet në një skedar si traefik.ymle cila është montuar brenda kontejnerit. Këtu përcaktohet paneli i kontrollit, pikat e hyrjes, ofruesit dhe zgjidhësi i certifikatave Le të Enkriptojmë, ndër të tjera.

Një konfigurim tipik YAML fillon duke aktivizuar API-në dhe panelin e kontrollit me diçka si api: dashboard: trueKjo lejon qasje në ndërfaqen e internetit ku mund të shikoni routerat, shërbimet dhe middleware-in. Ky panel nuk është i autentifikuar si parazgjedhje, kështu që do të shohim më vonë se si ta sigurojmë atë me autentifikim bazë nga konfigurimi dinamik.

Më pas, përcaktohen pikat e hyrjes. Normalisht, ka një pikë hyrjeje web në portin 80 dhe të tjera websecure në 443. Në web Një ridrejtim automatik zakonisht konfigurohet për të websecurenë mënyrë që çdo qasje HTTP të ridrejtohet në HTTPS:

Një skicë tipike do të përfshinte një seksion http.redirections.entryPoint.to: websecure për të detyruar atë ridrejtim dhe për të centralizuar të gjithë trafikun e koduar në pikën e sigurt të hyrjes.

në websecure Tregohet se duhet të përdoret TLS dhe ofrohet një lidhje. certResolver (për shembull letsencrypt) i cili do të jetë përgjegjës për menaxhimin automatik të certifikatave. E gjithë kjo mbështetet nga AKME, i cili është protokolli që Let's Encrypt përdor për të lëshuar dhe rinovuar certifikatat.

Në bllok ofruesit e Ofruesi i Docker është konfiguruar, duke treguar në socket unix:///var/run/docker.sockme një opsion kyç: exposedByDefault: falseMe këtë, Traefik nuk i publikon të gjitha kontejnerët si parazgjedhje; vetëm ato që mbajnë etiketën traefik.enable=trueGjithashtu mund të konfiguroni një ofrues skedarësh (file) për të ngarkuar një konfigurim dinamik shtesë nga, për shembull, /configurations/dynamic.yml.

Së fundmi, skedari statik zakonisht përfshin seksionin certificatesResolversku përcaktohet zgjidhësi ACME: email regjistrimi, skedar ruajtjeje (zakonisht acme.json), lloji i çelësit (për shembull EC384) dhe metoda e validimit (për shembull httpChallenge në pikën e hyrjes webËshtë e rëndësishme që konfiguroni një email të vërtetë në këtë seksion sepse Let's Encrypt e përdor atë për njoftime dhe rinovime; nëse lini një vlerë artificiale ose të deformuar, mund të hasni gabime gjatë fillimit të kontejnerit Traefik.

  Çfarë është Apache: Motori i padukshëm që fuqizon uebin

Përveç këtij konfigurimi YAML, ka edhe implementime që përdorin Formati TOML (traefik.toml)Por logjika është e njëjtë: ato ndajnë certifikatat e zgjidhësit (për shembull [certificatesResolvers.main.acme]), përcaktojnë sfidat (si p.sh. dnsChallenge me provider = "route53") dhe shtoni opsionet e parazgjedhura të TLS, të tilla si forcë minVersion = "VersionTLS13" ose konfiguroni një listë të cipherSuites lejohet.

Arkitektura Docker Traefik Portainer

Konfigurimi dinamik: middleware, TLS dhe siguria

Pjesa dinamike e Traefik zakonisht shkon në një skedar si dynamic.yml, i ngarkuar nga ofruesi i skedarit. Këtu ju përcaktoni middleware dhe opsione TLS e cila mund të modifikohet pa rinisjen e enës Traefik, e cila është shumë e dobishme për rregullimin e sigurisë në lëvizje.

Një rast tipik është krijimi i middleware-it për header-at, për shembull secureHeadersqë shton politika që lidhen me HSTS dhe përdorimin e detyrueshëm të HTTPS. Në YAML mund të gjeni parametra si sslRedirect: true, forceSTSHeader: true, stsIncludeSubdomains: true, stsPreload: true dhe një stsSeconds e lartë (për shembull, një vit në sekonda). Kjo forcon sigurinë e trafikut nga ana e shfletuesit.

Një tjetër middleware i zakonshëm është ai për autentifikimin bazë, për shembull user-auth të tipit basicAuth, ku një listë përdoruesish deklarohet në formatin usuario:hashHashi zakonisht gjenerohet me htpasswd dhe është i integruar në skedar. Ky middleware zakonisht shoqërohet me routerin e panelit Traefik, kështu që, përveç aksesit HTTPS, kërkon një emër përdoruesi dhe fjalëkalim.

Brenda të njëjtit konfigurim dinamik, është e zakonshme të shihet një bllok tls.options me një profil të paracaktuar (default) ku janë vendosur shifrat e mbështetura dhe versioni minimal i TLS-së, për shembull VersionTLS12Në disa vendosje, përcaktohen disa opsione (për shembull, një profil i quajtur tls12 dhe të tjera default) për të përshtatur nivelin e sigurisë në shërbime të ndryshme nëse është e nevojshme.

Në mjediset ku dëshirohet të përdoret TLS gjithashtu në mënyrë të brendshme Midis Traefik dhe shërbimeve backend (si Portainer), mund të lindë një problem kur këto shërbime nuk kanë një certifikatë të njohur nga një CA publik. Këtu hyn në lojë opsioni. insecureSkipVerify, e cila, e konfiguruar nën providers.http.tls ose në opsionet e duhura TLS, i lejon Traefik të anashkalojë validimin e certifikatës së prapavijës. Kjo është e dobishme për mjediset e laboratorit ose certifikatat e brendshme të vetë-nënshkruara, por duhet të përdoret me kujdes sepse lehtëson verifikimin.

Një detaj praktik: dosja dynamic.yml Mund të redaktohet menjëherë.Traefik ringarkon konfigurimin dinamik pa kërkuar një rinisje, kështu që ju mund të shtoni ose hiqni middleware, të ndryshoni headers-at e sigurisë ose të modifikoni autentifikimin bazë pa ndikuar në disponueshmërinë e proxy-t.

docker-compose me Traefik dhe Portainer në Docker të pavarur

Në një skenar të thjeshtë Docker, pa Swarm, gjëja më e zakonshme që duhet bërë është të nisësh Traefik dhe Portainer me një të vetme docker-compose.yml i cili përcakton si shërbimet ashtu edhe një rrjet të përbashkët të tipit urë të quajtur, për shembull, proxy.

Shërbimi Traefik Zakonisht përdor imazhin zyrtar, për shembull traefik:latest ose një version specifik si p.sh. traefik:v3.4Portet janë të hartuara. 80 dhe 443 për trafikun e uebit dhe, në disa shembuj, porta 8080 për të ekspozuar panelin e kontrollit brenda vendit. Përveç kësaj, shtohet opsioni restart: unless-stopped dhe siguria përforcohet me security_opt: - no-new-privileges:true për të zvogëluar rrezikun e përshkallëzimit të privilegjeve brenda kontejnerit.

Lidhur me vëllimet, Traefik duhet të montojë socketin Docker vetëm për lexim (/var/run/docker.sock:/var/run/docker.sock:ro) për të zbuluar kontejnerët, skedari statik traefik.yml dhe direktoria ku do të ruhet konfigurimi dinamik (./traefik-data/configurations:/configurationsSkedari është gjithashtu i montuar. acme.jsonKëtu Traefik ruan certifikatat e lëshuara nga Let's Encrypt. Ky skedar krijohet në host dhe i jepen lejet. 600 në mënyrë që vetëm përdoruesi i duhur ta lexojë dhe ta shkruajë atë; nëse e lini me 644, Traefik zakonisht ankohet.

Çelësi i Traefik-ut që bën magjinë e tij është etiketat e shërbimitNdër të tjera, do të gjeni: traefik.enable=true (në mënyrë që ofruesi i Docker ta ekspozojë këtë shërbim), traefik.docker.network=proxy (tregon se cilin rrjet Traefik duhet të përdorë për të komunikuar me kontejnerin), dhe një ruter si traefik.http.routers.traefik-secure, me etiketa që përcaktojnë pikën e hyrjes së saj (websecure), rregulli pritës (për shembull Host(`traefik.tudominio.com`)), shërbimi i lidhur (api@internal) dhe middleware-i i autentifikimit (user-auth@file).

  Udhëzues i plotë për optimizimin e serverëve Linux

Shërbimi Portier në të njëjtën gjë docker-compose.yml përgjithësisht përdor portainer/portainer-ce:latest (ose versioni Enterprise nëse keni një licencë). Vëllime të ngjashme montohen: socket-i Docker, dosja e të dhënave (./portainer-data:/data) dhe shpesh edhe /etc/localtime në mënyrë që të trashëgojë zonën kohore të hostit.

Etiketat e Portainer e regjistrojnë atë te Traefik: traefik.enable=true, traefik.docker.network=proxynjë ruter i tipit traefik.http.routers.portainer-secure me pikë hyrjeje websecure dhe një rregull pritës si Host(`portainer.tudominio.com`)Për më tepër, shërbimi që Traefik duhet të përdorë është përcaktuar, duke treguar portin e brendshëm të Portainer, për shembull me traefik.http.services.portainer.loadbalancer.server.port=9000.

Me gjithë këtë që është duke ndodhur, pas lançimit docker compose up -d Në direktorinë e stack-ut, Traefik shkarkon imazhet dhe krijon rrjetin. proxy Nëse deklarohet si i jashtëm dhe ekspozon të dy panelet në nën-domenet e konfiguruara, me HTTPS automatike falë Let's EncryptNga ajo pikë e tutje, shtimi i shërbimeve të reja është çështje klonimi i projektit tuaj, shtimi i disa etiketave Traefik dhe lidhja e tij me rrjetin. proxy.

Skenari Docker Swarm: Portainer dhe Traefik në një grumbull

Kur aktivizoni Docker Swarm, gjërat ndryshojnë pak, sepse shërbimet vendosen si pirgje dhe rrjetet zakonisht bazohen në mbivendosje. Megjithatë, logjika themelore me Traefik dhe Portainer është shumë e ngjashme: Traefik vazhdon të veprojë si një proxy i kundërt dhe zbulues dinamik i shërbimeve, dhe Portainer mund të funksionojë si në modalitetin e pavarur ashtu edhe në modalitetin Portainer + agjent për të menaxhuar nyjet e largëta brenda klasterit.

Në një vendosje tipike të Swarm, pirgu krijohet përpara se të aplikohet. dy rrjete mbivendosëse të cilin Traefik do ta përdorë për të drejtuar trafikun midis nyjeve. Përveç kësaj, krijohet një vëllim për të ruajtur të dhënat e Portainer (për shembull) portainer_data) dhe, nëse keni nevojë për të, një për acme.json ose direktoria ku Traefik ruan certifikatat dhe konfigurimin.

El docker-compose.yml (e cila më pas shpaloset me docker stack deploy duke përdorur, për shembull, -c portainer.yml) zakonisht përcakton dy shërbime: Agjent portues, i cili funksionon në modalitetin global në të gjitha nyjet Linux, dhe shërbimin kryesor Portainer (CE ose EE), i cili normalisht mbetet në modalitetin e replikuar me një kufizim për t'u ekzekutuar vetëm në menaxherë.

Agjenti Portainer monton socket-in Docker dhe direktorinë e vëllimit (/var/lib/docker/volumes) për të qenë në gjendje të inspektojë burimet. Ai lidhet me rrjetin e mbivendosur që do ta ndajë me Traefik, për shembull traefik_publicShërbimi kryesor Portainer mund të konfigurohet për të komunikuar me agjentin nëpërmjet TCP (tcp://tasks.agent:9001) dhe, në fakt, në disa shembuj ajo komandë tregohet me --tlsskipverify komentoi, për të anashkaluar verifikimin TLS nëse është e nevojshme.

Në të njëjtën pirg ose në një tjetër, Traefik fillon me ofruesin Docker në modalitetin Swarm (swarmMode = true në TOML ose opsionin ekuivalent në flamuj), duke vëzhguar shërbimet e etiketuara. Konfigurimi i tij përfshin një certificatesResolvers.main.acme për Let's Encrypt, një dnsChallenge me një furnizues si Rruga 53 Nëse doni të validoni certifikatat me anë të DNS-së dhe një blloku të tls.options ku, për shembull, është e detyruar minVersion = "VersionTLS13" për profilin e parazgjedhur dhe përcaktohet një listë e qartë e cipherSuites për një profil TLS 1.2.

Etiketat e Portainer te Swarm ndjekin të njëjtën filozofi: traefik.enable=truenjë ruter si traefik.http.routers.portainer me Host(`portainer.midominio.com`), traefik.http.routers.portainer.entrypoints=https (o websecure (sipas emërtimit), dhe traefik.http.routers.portainer.tls=true për të aktivizuar TLS në atë router. Përveç kësaj, mund të specifikoni zgjidhës certre me traefik.http.routers.portainer.tls.certresolver=main dhe skema e backend-it nëse shërbimi flet HTTPS në mënyrë të brendshme me traefik.http.services.portainer.loadbalancer.server.scheme=https.

Në regjistrat e debugimit Traefik në Swarm do të shihni konfigurimin e gjeneruar: routerët si api y portainershërbimet e zbuluara (për shembull portainer en http://10.0.1.12:9000 dhe një shërbim traefik (duke treguar portin 8080 të panelit), dhe, nëse ka një problem me etiketa të përcaktuara dobët, mesazhe si "Nuk mund të përcaktohej emri i shërbimit për routerin: shumë shërbime"të cilat zakonisht tregojnë se ekziston një konflikt ose dyfishim i shërbimeve të shoqëruara me një ruter.

Shembull minimal: whoami, rrugët dhe TLS me Traefik

Përpara se të përfshijmë Portainer në ekuacion, është mjaft praktike të provojmë Traefik me një backend shumë të thjeshtë, si imazhi. traefik/whoamii cili kthen informacion në lidhje me kërkesën. Kjo ju ndihmon të vërtetoni që Traefik është konfiguruar saktë dhe që rregullat e rrugëzimit po funksionojnë.

Un docker-compose.yml bazë mund të përfshijë shërbimin traefik me imazhin traefik:v3.4, duke montuar socket-in Docker dhe duke përcaktuar flamujt e nisjes si --providers.docker=true, --providers.docker.exposedbydefault=false, --providers.docker.network=proxy dhe pika e hyrjes --entryPoints.web.address=:80Portat 80 dhe 8080 reklamohen në host dhe krijohet një rrjet. proxy e cila do të përdorë gjithashtu kontejnerin whoami.

Shërbimi whoami Fillon në të njëjtin rrjet dhe shënohet me traefik.enable=truePastaj një ruter përcaktohet me etiketën traefik.http.routers.whoami.rule=Host(`whoami.docker.localhost`) dhe tregohet se pika juaj e hyrjes është webNëse bëni një kërkesë me curl -H "Host: whoami.docker.localhost" http://localhost/Do të shihni një përgjigje me emrin e hostit, IP-të, headers etj., gjë që konfirmon se Traefik po drejton saktë.

  Gabimi 404 Nuk u gjet: Çfarë është, shkaqet, ndikimi në faqen tuaj të internetit dhe si ta rregulloni atë.

Nga aty, është e thjeshtë. shtoni rrugëzimin sipas shtigjevePër shembull, mund të krijoni një shërbim tjetër. whoami-api me të njëjtën imazh, në të njëjtin rrjet dhe etiketojeni atë me një rregull të tipit Host(`whoami.docker.localhost`) && PathPrefix(`/api`)Kështu, rrënja / shkoni në whoami origjinale dhe kërkesat për /api do t'u shërbejë atyre whoami-apiJu mund ta verifikoni këtë duke bërë kërkesa te / tashmë /api me të njëjtin mikpritës.

Për të aktivizuar TLS Në këtë mjedis lokal, një mundësi është të gjeneroni një certifikatë të vetë-nënshkruar për domenin. *.docker.localhost me opensslJu krijoni një drejtori certs, ju gjeneroni local.key y local.crt, dhe pastaj shtoni një skedar dinamik (për shembull dynamic/tls.yml) me seksionin tls: dhe rrugët certFile y keyFile duke treguar drejt atyre skedarëve.

Tjetra, ju përditësoni përkufizimin e shërbimit Traefik në docker-compose.yml për të montuar dosjen ./certs dhe dosja ./dynamic brenda kontejnerit, aktivizoni API-në e sigurt me --api.dashboard=true, ju krijoni pikën e hyrjes websecure (--entryPoints.websecure.address=:443) dhe aktivizoni TLS atje me --entryPoints.websecure.http.tls=trueJu gjithashtu etiketoni routerin e panelit dhe routerat e whoami që ata të përdorin websecure dhe kam tls=true.

Pasi të jetë gati, do të keni mundësi të hyni https://whoami.docker.localhost/ dhe në panelin Traefik me një certifikatë të vetë-nënshkruar, duke pranuar paralajmërimin e sigurisë së shfletuesit. Kjo përvojë është shumë e ngjashme me atë që do të keni më vonë në prodhim me Let's Encrypt, por pa u mbështetur në serverat publikë DNS.

Praktikat më të mira, vendosja e aplikacioneve dhe zgjidhja e problemeve tipike

Një model që përsëritet në të gjitha këto shembuj është se Traefik thjeshton shumë vendosjen e aplikacioneve të rejaPasi të keni stack-un tuaj bazë (Traefik + Portainer + rrjet) proxy (+ certifikata), shtimi i një shërbimi të ri zakonisht reduktohet në:

Klononi projektin ose kopjoni tuajin docker-compose.yml te serveri, drejto një nën-domen te adresa IP e hostit duke përdorur një rekord A në DNS-in tuaj (për shembull app.tudominio.com), dhe pastaj shtoni etiketat kryesore në shërbim: traefik.enable=true, traefik.docker.network=proxy dhe një ruter me një rregull pritës për atë nën-domen, duke specifikuar pikën e hyrjes së sigurt websecure dhe shërbim me portin e brendshëm të saktë.

Shumë tutoriale do të tregonin, për shembull, vendosjen e një aplikacioni të vogël. FastAPI I ndarë: shtohen katër etiketa, duke siguruar që të bashkohet me rrjetin proxy në pjesën networks del docker-compose.ymldhe pasi bëri docker compose up -d Aplikacioni shfaqet automatikisht në panelin e Traefik me TLS të aktivizuar. Zbulimi automatik i Traefik do të thotë që nuk keni nevojë as të rregulloni cilësimet e tij statike.

Që gjithçka të shkojë mirë, është e rëndësishme t'i kushtoni vëmendje disa detajeve: Mos e ripërdorni të njëjtin identifikues të ruterit Në aplikacione të ndryshme, kontrolloni që të ketë vetëm një shërbim të lidhur me secilin router (duke shmangur gabimin "shumë shërbime"), përdorni emra të qëndrueshëm rrjeti (për shembull, proxy në të gjitha stikat që dëshironi të ekspozoni), dhe, nëse po përdorni Let's Encrypt, sigurohuni që acme.json Ka lejet 600 dhe emaili i konfiguruar është i vlefshëm.

Në mjediset Swarm, kontrolloni gjithashtu që konfigurimi i Traefik përfshin ofruesin Docker. swarmMode=true y watch=truedhe se kufizimet e shërbimeve (për shembull node.role == manager (për Portainer) nuk bien ndesh me vendin ku është vendosur Traefik. Regjistrat e debugimit janë shumë të hollësishëm, por janë thelbësorë për gjetjen e problemeve të rrugëzimit ose TLS.

Me kombinimin e Docker, Traefik dhe Portainer, ju mund të krijoni një mjedis të plotë orkestrimi të lehtë në një server të vetëm, me panele grafike, certifikata automatike dhe një rrjedhë shumë të shpejtë vendosjeje, ku shtimi, përditësimi ose heqja e shërbimeve reduktohet në rregullimin e disa rreshtave të YAML dhe lejimin e Traefik të bëjë punën e ndyrë të proxy-t të kundërt dhe TLS.