- Ang Traefik ay gumaganap bilang isang dynamic reverse proxy at nireresolba ang mga TLS certificate, habang ang Portainer ay nag-aalok ng graphical interface para sa pamamahala ng Docker at Swarm.
- Ang kombinasyon ng traefik.yml, dynamic.yml at docker-compose.yml ay nagbibigay-daan sa iyong magtakda ng mga entrypoint, security middleware at label-based HTTP/HTTPS routing.
- Sa mga sitwasyon ng Docker standalone o Swarm, ikonekta lang ang mga serbisyo sa proxy network at i-tag ang mga ito para matuklasan at ma-expose nang ligtas ng Traefik.
- Ang paggamit ng Let's Encrypt, mga dedicated network, at basic authentication sa dashboard ay nagpapatibay ng isang matatag na kapaligiran para sa pag-deploy ng maraming application sa iisang server.
Ang pag-set up ng isang modernong stack gamit ang Docker, Traefik, at Portainer ay kasalukuyang isa sa mga pinakamadaling paraan upang pamahalaan ang mga container sa isang server at ilantad ang maraming serbisyo gamit ang HTTPS nang hindi nababalot ng abala sa configuration. Ang maganda rito ay ang Traefik ay gumaganap bilang isang dynamic reverse proxy, habang ang Portainer ay nagbibigay ng isang napakasimpleng web interface para sa pamamahala ng Docker at, kung gusto mo, pati na rin ang Swarm.
Sa artikulong ito makikita mo kung paano paglalagay ng Traefik bilang isang reverse proxy sa harap ng Portainer Sa parehong "klasikong" Docker (standalone) na senaryo at isang Docker Swarm cluster, paano i-integrate ang TLS (self-signed o Let's Encrypt), at kung anong mga configuration file ang gagamitin (traefik.yml, dynamic.yml y docker-compose.yml) at ilang karaniwang mga trick sa middleware, mga network at mga tipikal na problema sa pag-tag sa Traefik.
Ano ang mga papel na ginagampanan ng Docker, Traefik, at Portainer sa arkitektura?
Sa ganitong uri ng setup, ang Docker ang base layer kung saan tumatakbo ang mga container, ang Traefik ay gumaganap bilang isang reverse proxy at load balancer na tumatanggap ng lahat ng HTTP/HTTPS request sa mga port 80 at 443 at ipinapadala ang mga ito sa naaangkop na container, at ang Portainer ay nagbibigay ng graphical interface para sa pamamahala ng mga imahe, container, volume, network, at Docker o Swarm stack.
Ang ideya ay magkaroon ng iisang host na may Docker kung saan Ang Traefik ay matatagpuan sa "gateway": makinig sa mga pasukan web (80) y websecure (443), nireresolba ang mga TLS certificate (karaniwan ay gamit ang Let's Encrypt) at, salamat sa integrasyon sa Docker provider, awtomatikong natutuklasan ang mga serbisyong inilalantad mo sa pamamagitan ng pagdaragdag ng mga label sa mga container.
Sa kabilang banda, ang Portainer ay tumatakbo na parang isa lamang lalagyan, ngunit nakalantad sa pamamagitan ng isang partikular na subdomain, halimbawa portainer.tudominio.com, pinoprotektahan ng TLS at, kung ninanais, sa likod ng karagdagang authentication middleware na lampas sa sariling login ng Portainer. Ang lahat ng ito ay inayos gamit ang isang docker-compose na tumutukoy sa Traefik, Portainer at sa karaniwang network ng uri proxy.
Isang malinaw na bentahe ng pamamaraang ito ay maaari kang mag-deploy ng mga bagong serbisyo sa pamamagitan lamang ng pagdaragdag ng mga label sa iyong mga container: Natutukoy ng Traefik ang pagbabago sa Docker, lumilikha ng mga router, serbisyo, at middleware nang walang kahirap-hirap, at sa loob ng ilang segundo ay magkakaroon ka ng bagong subdomain o ruta na tumatakbo nang hindi manu-manong hinahawakan ang mga static na configuration file.
Konpigurasyong estatiko ng Traefik: traefik.yml
Ang static configuration ng Traefik ay karaniwang nakaimbak sa isang file tulad ng traefik.ymlna naka-mount sa loob ng lalagyan. Dito ito binibigyang kahulugan dashboard, mga entrypoint, mga provider, at tagalutas ng sertipiko Mag-encrypt tayo, bukod sa iba pang mga bagay.
Ang isang tipikal na configuration ng YAML ay nagsisimula sa pamamagitan ng pag-activate ng API at control panel gamit ang isang bagay tulad ng api: dashboard: trueNagbibigay-daan ito ng access sa web interface kung saan maaari mong tingnan ang mga router, serbisyo, at middleware. Ang panel na ito ay hindi na-authenticate bilang default, kaya titingnan natin mamaya kung paano ito i-secure gamit ang basic authentication mula sa dynamic configuration.
Susunod, ang mga entry point ay tinutukoy. Karaniwan, mayroong isang punto ng pagpasok web sa daungan 80 at iba pang mga websecure sa 443. Sa web Ang awtomatikong pag-redirect ay karaniwang naka-configure upang websecurepara ang anumang HTTP access ay ma-redirect sa HTTPS:
Ang isang karaniwang balangkas ay magsasama ng isang seksyon http.redirections.entryPoint.to: websecure para pilitin ang pag-redirect na iyon at i-sentralisa ang lahat ng naka-encrypt na trapiko sa secure entry point.
Sa websecure Ipinapahiwatig na dapat gamitin ang TLS at may ibinigay na link. certResolver (halimbawa letsencrypt) na siyang magiging responsable sa awtomatikong pamamahala ng mga sertipiko. Ang lahat ng ito ay sinusuportahan ng acme, na siyang protocol na ginagamit ng Let's Encrypt para mag-isyu at mag-renew ng mga certificate.
Sa bloke provider Na-configure na ang Docker provider, na nakaturo sa socket unix:///var/run/docker.sockna may isang pangunahing opsyon: exposedByDefault: falseDahil dito, hindi inilalathala ng Traefik ang lahat ng container bilang default; tanging ang mga may label lamang traefik.enable=trueMaaari mo ring i-configure ang isang file provider (file) para mag-load ng karagdagang dynamic configuration mula sa, halimbawa, /configurations/dynamic.yml.
Panghuli, ang static file ay karaniwang kinabibilangan ng seksyon certificatesResolverskung saan tinukoy ang ACME resolver: email sa pagpaparehistro, storage file (karaniwan acme.json), uri ng susi (halimbawa EC384) at ang paraan ng pagpapatunay (halimbawa httpChallenge sa pasukan webMahalaga na mag-set up ng totoong email sa seksyong ito dahil ginagamit ito ng Let's Encrypt para sa mga abiso at pag-renew; kung mag-iiwan ka ng dummy o maling anyo ng value, maaaring makaranas ka ng mga error kapag sinisimulan ang Traefik container.
Bukod sa configuration na ito ng YAML, may mga deployment na gumagamit ng Format ng TOML (traefik.toml)Ngunit pareho ang lohika: hinahati nila ang mga sertipiko ng resolver (halimbawa [certificatesResolvers.main.acme]), tukuyin ang mga hamon (tulad ng dnsChallenge sa provider = "route53") at magdagdag ng mga default na opsyon sa TLS, tulad ng forzar minVersion = "VersionTLS13" o i-configure ang isang listahan ng cipherSuites pinahihintulutan.
Dinamikong pagsasaayos: middleware, TLS at seguridad
Ang dynamic na bahagi ng Traefik ay karaniwang nasa isang file tulad ng dynamic.yml, nilo-load ng file provider. Dito mo tinutukoy ang mga opsyon sa middleware at TLS na maaaring baguhin nang hindi na muling nire-restart ang Traefik container, na lubhang kapaki-pakinabang para sa pagsasaayos ng seguridad nang mabilisan.
Ang isang karaniwang kaso ay ang paggawa ng header middleware, halimbawa secureHeadersna nagdaragdag ng mga patakaran na may kaugnayan sa HSTS at sa mandatoryong paggamit ng HTTPS. Sa YAML, maaari kang makakita ng mga parameter tulad ng sslRedirect: true, forceSTSHeader: true, stsIncludeSubdomains: true, stsPreload: true at stsSeconds mataas (halimbawa, isang taon sa segundo). Pinapalakas nito ang seguridad ng trapiko mula sa panig ng browser.
Isa pang karaniwang middleware ay para sa basic authentication, halimbawa user-auth ng uri basicAuth, kung saan ang isang listahan ng mga gumagamit ay idineklara sa format na usuario:hashAng hash ay karaniwang nabubuo gamit ang htpasswd at naka-embed sa file. Ang middleware na ito ay karaniwang iniuugnay sa Traefik dashboard router kaya, bilang karagdagan sa HTTPS access, nangangailangan din ito ng username at password.
Sa loob ng parehong dynamic na configuration, karaniwan na makakita ng isang bloke tls.options na may default na profile (default) kung saan nakatakda ang mga sinusuportahang cipher at ang minimum na bersyon ng TLS, halimbawa VersionTLS12Sa ilang mga deployment, maraming mga opsyon ang tinukoy (halimbawa, isang profile na tinatawag na tls12 at iba pang mga default) upang iakma ang antas ng seguridad sa iba't ibang serbisyo kung kinakailangan.
Sa mga kapaligiran kung saan nais gamitin Ang TLS ay nasa loob din ng Sa pagitan ng Traefik at mga serbisyo ng backend (tulad ng Portainer), maaaring lumitaw ang isang problema kung saan ang mga serbisyong iyon ay walang sertipiko na kinikilala ng isang pampublikong CA. Dito pumapasok ang opsyon. insecureSkipVerify, na, na-configure sa ilalim ng providers.http.tls o sa mga naaangkop na opsyon sa TLS, pinapayagan nito ang Traefik na malampasan ang pagpapatunay ng sertipiko sa backend. Ito ay kapaki-pakinabang para sa mga kapaligiran sa lab o mga panloob na sertipiko na nilagdaan mismo, ngunit dapat gamitin nang may pag-iingat dahil niluluwagan nito ang beripikasyon.
Isang praktikal na detalye: ang file dynamic.yml Maaari itong i-edit nang walang kahirap-hirap.Nire-reload ng Traefik ang dynamic configuration nang hindi nangangailangan ng pag-restart, para makapagdagdag o makapag-alis ka ng middleware, makapagpalit ng mga security header, o makapagbago ng basic authentication nang hindi naaapektuhan ang availability ng proxy.
docker-compose gamit ang Traefik at Portainer sa Docker nang mag-isa
Sa isang hubad na senaryo ng Docker, nang walang Swarm, ang pinakakaraniwang gawin ay ang paglulunsad Sina Traefik at Portainer na may iisang docker-compose.yml na tumutukoy sa parehong mga serbisyo at isang nakabahaging network na uri ng tulay na tinatawag, halimbawa, proxy.
Ang serbisyo Traefik Karaniwan itong gumagamit ng opisyal na imahe, halimbawa traefik:latest o isang partikular na bersyon tulad ng traefik:v3.4Nakamapa ang mga daungan. 80 at 443 para sa trapiko sa web at, sa ilang halimbawa, port 8080 upang ilantad ang control panel sa loob. Bukod pa rito, idinaragdag ang opsyon restart: unless-stopped at pinatibay ang seguridad gamit ang security_opt: - no-new-privileges:true upang mabawasan ang panganib ng pagtaas ng pribilehiyo sa loob ng lalagyan.
Tungkol sa mga volume, kailangang i-mount ng Traefik ang read-only Docker socket (/var/run/docker.sock:/var/run/docker.sock:ro) para matuklasan ang mga lalagyan, ang static na file traefik.yml at ang direktoryo kung saan ise-save ang dynamic configuration (./traefik-data/configurations:/configurationsNaka-mount na rin ang file. acme.jsonDito iniimbak ng Traefik ang mga sertipikong inisyu ng Let's Encrypt. Ang file na ito ay ginagawa sa host at binibigyan ng mga pahintulot. 600 para tanging ang angkop na gumagamit lamang ang makakabasa at makakasulat nito; kung iiwan mo ito sa 644, karaniwang nagrereklamo ang Traefik.
Ang susi sa paggamit ni Traefik ng kanyang mahika ay ang mga label ng serbisyoKabilang sa iba pang mga bagay, makikita mo ang: traefik.enable=true (upang mailantad ng Docker provider ang serbisyong ito), traefik.docker.network=proxy (nagpapahiwatig kung aling network ang dapat gamitin ng Traefik upang makipag-ugnayan sa container), at isang router tulad ng traefik.http.routers.traefik-secure, na may mga label na tumutukoy sa entrypoint nito (websecure), ang tuntunin ng host (halimbawa Host(`traefik.tudominio.com`)), ang kaugnay na serbisyo (api@internal) at ang authentication middleware (user-auth@file).
Ang serbisyo carrier sa pareho docker-compose.yml karaniwang ginagamit portainer/portainer-ce:latest (o ang edisyon ng Enterprise kung mayroon kang lisensya). Naka-mount ang mga katulad na volume: ang Docker socket, ang data folder (./portainer-data:/data) at kadalasan din ang /etc/localtime para mamana nito ang time zone ng host.
Ang mga label ng Portainer ay nakarehistro dito sa Traefik: traefik.enable=true, traefik.docker.network=proxyisang router ng uri traefik.http.routers.portainer-secure may entrypoint websecure at isang tuntunin ng host tulad ng Host(`portainer.tudominio.com`)Bukod pa rito, ang serbisyong dapat gamitin ng Traefik ay tinukoy, na tumuturo sa panloob na port ng Portainer, halimbawa sa traefik.http.services.portainer.loadbalancer.server.port=9000.
Sa lahat ng ito ay nagaganap, pagkatapos ilunsad docker compose up -d Sa direktoryo ng stack, dina-download ng Traefik ang mga imahe at lumilikha ng network. proxy Kung ito ay idineklara bilang panlabas at inilalantad ang parehong panel sa mga na-configure na subdomain, na may Awtomatikong HTTPS salamat sa Let's EncryptMula sa puntong iyon, ang pagdaragdag ng mga bagong serbisyo ay isang bagay ng pag-clone ng iyong proyekto, pagdaragdag ng ilang mga label ng Traefik, at pagkonekta nito sa network. proxy.
Senaryo ng Docker Swarm: Portainer at Traefik sa isang kumpol
Kapag in-activate mo ang Docker Swarm, medyo magbabago ang mga bagay-bagay, dahil ang mga serbisyo ay idine-deploy bilang mga stack at ang mga network ay karaniwang nakabatay sa overlay. Gayunpaman, ang pinagbabatayang lohika sa Traefik at Portainer ay halos magkapareho: Ang Traefik ay patuloy na kumikilos bilang isang reverse proxy at dynamic service discoverer, at ang Portainer ay maaaring gumana sa parehong standalone mode at Portainer + agent mode upang pamahalaan ang mga remote node sa loob ng cluster.
Sa isang tipikal na pag-deploy ng Swarm, ang stack ay ginagawa bago ito ilapat. dalawang overlay network na gagamitin ng Traefik upang iruta ang trapiko sa pagitan ng mga node. Bukod pa rito, isang volume ang ginagawa upang mapanatili ang data ng Portainer (halimbawa) portainer_data) at, kung kailangan mo ito, isa para sa acme.json o ang direktoryo kung saan nag-iimbak ang Traefik ng mga sertipiko at configuration.
El docker-compose.yml (na pagkatapos ay magbubukas kasama ang docker stack deploy gamit, halimbawa, -c portainer.yml) ay karaniwang tumutukoy sa dalawang serbisyo: Ahente ng portainer, na tumatakbo sa mode global sa lahat ng Linux nodes, at ang pangunahing serbisyo ng Portainer (CE o EE), na karaniwang nananatili sa replicated mode na may constraint na tumakbo lamang sa mga manager.
Inilalagay ng ahente ng Portainer ang Docker socket at ang direktoryo ng volume (/var/lib/docker/volumes) para masuri ang mga mapagkukunan. Kumokonekta ito sa overlay network na ibabahagi nito sa Traefik, halimbawa traefik_publicMaaaring i-configure ang pangunahing serbisyo ng Portainer upang makipag-ugnayan sa ahente sa pamamagitan ng TCP (tcp://tasks.agent:9001) at, sa katunayan, sa ilang mga halimbawa ang utos na iyon ay ipinapakita gamit ang --tlsskipverify nagkomento, na laktawan ang pag-verify ng TLS kung kinakailangan.
Sa parehong stack o iba pa, nagsisimula ang Traefik gamit ang Docker provider sa Swarm mode (swarmMode = true sa TOML o ang katumbas na opsyon sa mga flag), na nagmamasid sa mga naka-tag na serbisyo. Kasama sa configuration nito ang isang certificatesResolvers.main.acme para sa Let's Encrypt, isang dnsChallenge kasama ang isang supplier tulad ng Route 53 Kung gusto mong i-validate ang mga sertipiko gamit ang DNS, at isang bloke ng tls.options kung saan, halimbawa, ito ay napipilitan minVersion = "VersionTLS13" para sa default na profile at isang tahasang listahan ang tinukoy ng cipherSuites para sa isang TLS 1.2 na profile.
Ang mga tatak ni Portainer sa Swarm ay sumusunod sa parehong pilosopiya: traefik.enable=trueparang router traefik.http.routers.portainer sa Host(`portainer.midominio.com`), traefik.http.routers.portainer.entrypoints=https (o websecure (ayon sa pagpapangalan), at traefik.http.routers.portainer.tls=true para paganahin ang TLS sa router na iyon. Bukod pa rito, maaari mong tukuyin ang certresolver sa traefik.http.routers.portainer.tls.certresolver=main at ang backend schema kung ang serbisyo ay nagsasalita ng HTTPS sa loob gamit ang traefik.http.services.portainer.loadbalancer.server.scheme=https.
Sa mga debug log ng Traefik sa Swarm, makikita mo ang nabuong configuration: mga router tulad ng api y portainer, mga serbisyong natuklasan (halimbawa portainer en http://10.0.1.12:9000 at isang serbisyo traefik (nakaturo sa port 8080 ng dashboard), at, kung may problema sa mga label na hindi maayos ang pagkakatukoy, ang mga mensaheng tulad ng "Hindi matukoy ang pangalan ng serbisyo para sa router: napakaraming serbisyo"na karaniwang nagpapahiwatig na mayroong conflict o duplication ng mga serbisyong nauugnay sa isang router.
Minimal na halimbawa: whoami, mga ruta at TLS gamit ang Traefik
Bago gamitin ang Portainer sa talakayan, praktikal munang subukan ang Traefik gamit ang isang napakasimpleng backend, tulad ng nasa larawan. traefik/whoamina nagbabalik ng impormasyon tungkol sa kahilingan. Makakatulong ito sa iyo na mapatunayan na ang Traefik ay wastong na-configure at gumagana ang mga panuntunan sa pagruruta.
Un docker-compose.yml maaaring kasama sa pangunahing serbisyo ang traefik kasama ang larawan traefik:v3.4, pag-mount ng Docker socket at pagtukoy sa mga boot flag bilang --providers.docker=true, --providers.docker.exposedbydefault=false, --providers.docker.network=proxy at ang pasukan --entryPoints.web.address=:80Ang mga port 80 at 8080 ay ina-advertise sa host, at isang network ang nalilikha. proxy na gagamit din ng lalagyan whoami.
Ang serbisyo whoami Nagsisimula ito sa parehong network at minarkahan ng traefik.enable=truePagkatapos, ang isang router ay binibigyang kahulugan gamit ang label na traefik.http.routers.whoami.rule=Host(`whoami.docker.localhost`) at ipinapahiwatig na ang iyong entry point ay webKung gagawa ka ng kahilingan gamit ang curl -H "Host: whoami.docker.localhost" http://localhost/Makakakita ka ng tugon na may hostname, mga IP, mga header at iba pa, na nagpapatunay na tama ang pagruruta ng Traefik.
Mula roon, simple na lang magdagdag ng routing ayon sa mga pathHalimbawa, maaari kang lumikha ng isa pang serbisyo. whoami-api na may parehong larawan, sa parehong network, at lagyan ito ng tag gamit ang isang tuntunin ng uri Host(`whoami.docker.localhost`) && PathPrefix(`/api`)Kaya, ang ugat / pumunta sa whoami orihinal at ang mga kahilingan sa /api maglilingkod sa kanila whoami-apiMaaari mong patunayan ito sa pamamagitan ng paghiling sa / na /api kasama ang parehong host.
Upang buhayin TLS Sa lokal na kapaligirang ito, isang opsyon ang bumuo ng self-signed certificate para sa domain. *.docker.localhost sa opensslGumawa ka ng direktoryo certs, makabuo ka local.key y local.crt, at pagkatapos ay magdadagdag ka ng dynamic na file (halimbawa dynamic/tls.yml) kasama ang seksyon tls: at ang mga ruta certFile y keyFile nakaturo sa mga file na iyon.
Susunod, ia-update mo ang kahulugan ng serbisyo ng Traefik sa docker-compose.yml para i-mount ang folder ./certs at ang folder ./dynamic sa loob ng lalagyan, ia-activate mo ang secure API gamit ang --api.dashboard=true, ikaw ang gagawa ng entrypoint websecure (--entryPoints.websecure.address=:443) at paganahin ang TLS doon gamit ang --entryPoints.websecure.http.tls=trueLagyan mo rin ng label ang dashboard router at ang mga router ng whoami para magamit nila websecure at mayroon tls=true.
Kapag tapos na ito, maaari mo nang ma-access https://whoami.docker.localhost/ at sa panel ng Traefik na may self-signed certificate, na tumatanggap ng babala sa seguridad ng browser. Ang karanasang ito ay halos kapareho ng makikita mo sa produksyon gamit ang Let's Encrypt sa hinaharap, ngunit hindi umaasa sa mga pampublikong DNS server.
Mga pinakamahusay na kasanayan, pag-deploy ng app, at paglutas ng mga karaniwang problema
Isang padron na inuulit sa lahat ng mga halimbawang ito ay ang Pinapadali ng Traefik ang pag-deploy ng mga bagong aplikasyonKapag mayroon ka nang base stack (Traefik + Portainer + network) proxy (+ mga sertipiko), ang pagdaragdag ng isang bagong serbisyo ay karaniwang bumababa sa:
I-clone ang proyekto o kopyahin ang iyong docker-compose.yml sa server, ituro ang isang subdomain sa IP address ng host gamit ang isang rekord A sa iyong DNS (halimbawa app.tudominio.com), at pagkatapos ay idagdag ang mga key label sa serbisyo: traefik.enable=true, traefik.docker.network=proxy at isang router na may host rule para sa subdomain na iyon, na tumutukoy sa secure entrypoint websecure at serbisyo gamit ang tamang panloob na port.
Maraming tutorial ang magpapakita, halimbawa, ng pag-deploy ng isang maliit na app FastAPI Pinaghihiwalay: apat na label ang idinagdag, tinitiyak na sasali ito sa network proxy sa seksyon networks del docker-compose.ymlat pagkatapos gawin docker compose up -d Awtomatikong lumalabas ang app sa Traefik dashboard kapag naka-enable ang TLS. Dahil sa auto-discovery ng Traefik, hindi mo na kailangang ayusin ang mga static setting nito.
Upang maging maayos ang lahat, mahalagang bigyang-pansin ang ilang detalye: huwag gamitin muli ang parehong router identifier Sa iba't ibang app, tiyaking iisa lang ang serbisyong nauugnay sa bawat router (upang maiwasan ang error na "masyadong maraming serbisyo"), gumamit ng pare-parehong pangalan ng network (halimbawa, proxy sa lahat ng stack na gusto mong i-expose), at, kung gumagamit ka ng Let's Encrypt, siguraduhin na ang acme.json Mayroon itong mga pahintulot na 600 at ang na-configure na email ay balido.
Sa mga Swarm environment, tiyakin din na kasama sa configuration ng Traefik ang Docker provider. swarmMode=true y watch=trueat ang mga limitasyon ng mga serbisyo (halimbawa node.role == manager (para sa Portainer) ay hindi sumasalungat sa kung saan naka-deploy ang Traefik. Ang mga debug log ay napaka-malawak ngunit mahalaga sa paghahanap ng mga problema sa routing o TLS.
Gamit ang pinagsamang Docker, Traefik, at Portainer, maaari kang mag-set up ng isang kumpletong magaan na kapaligiran ng orkestrasyon sa iisang server, na may mga graphical dashboard, awtomatikong sertipiko, at napakabilis na daloy ng pag-deploy, kung saan ang pagdaragdag, pag-update, o pag-alis ng mga serbisyo ay nababawasan sa pag-aayos ng ilang linya ng YAML at pagpapahintulot sa Traefik na gawin ang maruming gawain ng reverse proxying at TLS.
