Cum să integrezi Docker, Traefik și Portainer ca o stivă completă

Ultima actualizare: 7 martie 2026
  • Traefik acționează ca un proxy invers dinamic și rezolvă certificatele TLS, în timp ce Portainer oferă o interfață grafică pentru gestionarea Docker și Swarm.
  • Combinația dintre traefik.yml, dynamic.yml și docker-compose.yml vă permite să definiți puncte de intrare, middleware de securitate și rutare HTTP/HTTPS bazată pe etichete.
  • În scenariile Docker standalone sau Swarm, pur și simplu conectați serviciile la rețeaua proxy și etichetați-le astfel încât Traefik să le poată descoperi și expune în siguranță.
  • Utilizarea Let's Encrypt, a rețelelor dedicate și a autentificării de bază pe tabloul de bord consolidează un mediu robust pentru implementarea mai multor aplicații pe un singur server.

Docker Portainer Traefik

Configurarea unui stack modern cu Docker, Traefik și Portainer este în prezent una dintre cele mai ușoare metode de a gestiona containerele pe un singur server și de a expune mai multe servicii cu HTTPS fără a te împotmoli în configurație. Frumusețea acestui lucru este că Traefik acționează ca un proxy invers dinamic, în timp ce Portainer oferă o interfață web foarte simplă pentru gestionarea Docker și, dacă dorești, și a Swarm.

În acest articol veți vedea cum potrivirea lui Traefik ca proxy invers în fața lui Portainer Atât într-un scenariu Docker „clasic” (autonom), cât și într-un cluster Docker Swarm, cum se integrează TLS (autosemnat sau Let's Encrypt) și ce fișiere de configurare intră în joc (traefik.yml, dynamic.yml y docker-compose.yml) și câteva trucuri comune cu middleware, rețele și probleme tipice de etichetare în Traefik.

Ce roluri au Docker, Traefik și Portainer în arhitectură?

În acest tip de configurație, Docker este stratul de bază pe care rulează containerele, Traefik acționează ca un proxy invers și un echilibrator de încărcare care primește toate cererile HTTP/HTTPS pe porturile 80 și 443 și le trimite către containerul corespunzător, iar Portainer oferă o interfață grafică pentru gestionarea imaginilor, containerelor, volumelor, rețelelor și stivelor Docker sau Swarm.

Ideea este să avem o singură gazdă cu Docker unde Traefik este situat la „poartă”ascultați la punctele de intrare web (80) y websecure (443), rezolvă certificatele TLS (de obicei cu Let's Encrypt) și, datorită integrării cu furnizorul Docker, descoperă automat serviciile pe care le expuneți prin adăugarea de etichete containerelor.

Pe de altă parte, Portainer funcționează ca un alt container, dar expus prin un subdomeniu specific, de exemplu portainer.tudominio.com, protejat de TLS și, dacă se dorește, în spatele unui middleware de autentificare suplimentar, dincolo de datele de autentificare ale Portainer. Toate acestea sunt orchestrate cu un Docker-scriere care definește Traefik, Portainer și rețeaua comună de tip proxy.

Un avantaj clar al acestei abordări este că puteți implementa servicii noi pur și simplu prin adăugarea de etichete containerelor: Traefik detectează modificarea în Docker, creează routere, servicii și middleware din mers, iar în câteva secunde aveți un nou subdomeniu sau o nouă rută funcțională, fără a atinge manual fișierele de configurare statice.

Configurația statică Traefik: traefik.yml

Configurația statică a lui Traefik este de obicei stocată într-un fișier de genul traefik.ymlcare este montat în interiorul containerului. Aici este definit tabloul de bord, punctele de intrare, furnizorii și rezolvatorul de certificate Să criptăm, printre altele.

O configurație YAML tipică începe prin activarea API-ului și a panoului de control cu ​​ceva de genul api: dashboard: trueAceasta permite accesul la interfața web unde puteți vizualiza routere, servicii și middleware. Acest panou nu este autentificat în mod implicit, așa că vom vedea mai târziu cum să îl securizăm cu autentificare de bază din configurația dinamică.

Apoi, se definesc punctele de intrare. În mod normal, există un punct de intrare web la portul 80 si alta websecure în 443. În web O redirecționare automată este de obicei configurată pentru a websecureastfel încât orice acces HTTP să fie redirecționat către HTTPS:

O schiță tipică ar include o secțiune http.redirections.entryPoint.to: websecure pentru a forța acea redirecționare și a centraliza tot traficul criptat la punctul de intrare securizat.

la websecure Se indică faptul că ar trebui utilizat TLS și este furnizat un link. certResolver (de exemplu letsencrypt) care va fi responsabil pentru gestionarea automată a certificatelor. Toate acestea sunt susținute de ACME, care este protocolul folosit de Let's Encrypt pentru a emite și reînnoi certificate.

În bloc furnizori Furnizorul Docker este configurat, indicând către socket unix:///var/run/docker.sockcu o singură opțiune cheie: exposedByDefault: falsePrin aceasta, Traefik nu publică toate containerele în mod implicit; doar pe cele care poartă eticheta traefik.enable=trueDe asemenea, puteți configura un furnizor de fișiere (file) pentru a încărca o configurație dinamică suplimentară, de exemplu, din /configurations/dynamic.yml.

În cele din urmă, fișierul static include de obicei secțiunea certificatesResolversunde este definit rezolverul ACME: e-mail de înregistrare, fișier de stocare (de obicei acme.json), tipul cheii (de exemplu EC384) și metoda de validare (de exemplu httpChallenge la punctul de intrare webEste important ca configurează un e-mail real în această secțiune deoarece Let's Encrypt o folosește pentru notificări și reînnoiri; dacă lăsați o valoare fictivă sau incorectă, este posibil să întâmpinați erori la pornirea containerului Traefik.

  Ce este Apache: Motorul invizibil care alimentează web-ul

Pe lângă această configurație YAML, există implementări care utilizează Format TOML (traefik.toml)Dar logica este aceeași: ei secționează certificatele de resolver (de exemplu [certificatesResolvers.main.acme]), definesc provocări (cum ar fi dnsChallenge cu provider = "route53") și adăugați opțiuni TLS implicite, cum ar fi forta minVersion = "VersionTLS13" sau configurați o listă de cipherSuites permis.

Arhitectura Docker Traefik Portainer

Configurare dinamică: middleware, TLS și securitate

Partea dinamică a Traefik se află de obicei într-un fișier de genul dynamic.yml, încărcat de furnizorul de fișiere. Aici definiți middleware-uri și opțiuni TLS care poate fi modificat fără a reporni containerul Traefik, ceea ce este foarte util pentru ajustarea securității din mers.

Un caz tipic este crearea middleware-ului pentru antete, de exemplu secureHeaderscare adaugă politici legate de HSTS și utilizarea obligatorie a HTTPS. În YAML puteți găsi parametri precum sslRedirect: true, forceSTSHeader: true, stsIncludeSubdomains: true, stsPreload: true și o stsSeconds ridicat (de exemplu, un an în secunde). Acest lucru consolidează securitatea traficului din partea browserului.

Un alt middleware comun este cel pentru autentificarea de bază, de exemplu user-auth tip basicAuth, unde o listă de utilizatori este declarată în formatul usuario:hashHash-ul este de obicei generat cu htpasswd și este încorporat în fișier. Acest middleware este de obicei asociat cu routerul de bord Traefik, astfel încât, pe lângă accesul HTTPS, necesită un nume de utilizator și o parolă.

În cadrul aceleiași configurații dinamice, este obișnuit să vedem un bloc tls.options cu un profil implicit (default) unde sunt setate cifrurile acceptate și versiunea minimă TLS, de exemplu VersionTLS12În unele implementări, sunt definite mai multe opțiuni (de exemplu, un profil numit tls12 si alta default) pentru a adapta nivelul de securitate la diferite servicii, dacă este necesar.

În mediile în care se dorește utilizarea TLS, de asemenea, intern Între Traefik și serviciile backend (cum ar fi Portainer), poate apărea o problemă în cazul în care aceste servicii nu au un certificat recunoscut de o CA publică. Aici intervine această opțiune. insecureSkipVerify, care, configurat sub providers.http.tls sau, în opțiunile TLS corespunzătoare, permite Traefik să ocolească validarea certificatelor backend. Acest lucru este util pentru mediile de laborator sau certificatele interne autosemnate, dar trebuie utilizat cu precauție, deoarece relaxează verificarea.

Un detaliu practic: dosarul dynamic.yml Poate fi editat din mers.Traefik reîncarcă configurația dinamică fără a necesita o repornire, astfel încât să puteți adăuga sau elimina middleware, să modificați anteturile de securitate sau să modificați autentificarea de bază fără a afecta disponibilitatea proxy-ului.

docker-compose cu Traefik și Portainer în Docker standalone

Într-un scenariu Docker simplu, fără Swarm, cel mai obișnuit lucru de făcut este să lansezi Traefik și Portainer cu un singur docker-compose.yml care definește atât servicii, cât și o rețea partajată de tip punte numită, de exemplu, proxy.

Serviciul de Traefik De obicei, folosește imaginea oficială, de exemplu traefik:latest sau o versiune specifică, cum ar fi traefik:v3.4Porturile sunt mapate. 80 443 și pentru traficul web și, în unele exemple, portul 8080 pentru a expune intern panoul de control. În plus, este adăugată opțiunea restart: unless-stopped iar securitatea este consolidată cu security_opt: - no-new-privileges:true pentru a reduce riscul escaladării privilegiilor în cadrul containerului.

În ceea ce privește volumele, Traefik trebuie să monteze socketul Docker read-only (/var/run/docker.sock:/var/run/docker.sock:ro) pentru a descoperi containere, fișierul static traefik.yml și directorul în care va fi salvată configurația dinamică (./traefik-data/configurations:/configurationsFișierul este, de asemenea, montat. acme.jsonAici stochează Traefik certificatele emise de Let's Encrypt. Acest fișier este creat pe gazdă și i se acordă permisiuni. 600 astfel încât doar utilizatorul corespunzător să îl poată citi și scrie; dacă îl lăsați cu 644, Traefik se plânge de obicei.

Cheia pentru ca Traefik să-și folosească magia este etichete de serviciiPrintre altele, veți găsi: traefik.enable=true (astfel încât furnizorul Docker să expună acest serviciu), traefik.docker.network=proxy (indică ce rețea ar trebui să utilizeze Traefik pentru a comunica cu containerul) și un router precum traefik.http.routers.traefik-secure, cu etichete care definesc punctul său de intrare (websecure), regula gazdă (de exemplu Host(`traefik.tudominio.com`)), serviciul asociat (api@internal) și middleware-ul de autentificare (user-auth@file).

  Ghid complet pentru optimizarea serverelor Linux

serviciul de Portar în aceeași docker-compose.yml folosește în general portainer/portainer-ce:latest (sau ediția Enterprise dacă aveți o licență). Volume similare sunt montate: socketul Docker, folderul de date (./portainer-data:/data) și adesea și /etc/localtime astfel încât să moștenească fusul orar al gazdei.

Etichetele Portainer îl înregistrează la Traefik: traefik.enable=true, traefik.docker.network=proxyun router de tipul traefik.http.routers.portainer-secure cu punct de intrare websecure și o regulă de gazdă precum Host(`portainer.tudominio.com`)În plus, este definit serviciul pe care Traefik ar trebui să îl utilizeze, indicând portul intern al Portainer, de exemplu cu traefik.http.services.portainer.loadbalancer.server.port=9000.

Cu toate acestea în desfășurare, după lansare docker compose up -d În directorul stivă, Traefik descarcă imaginile și creează rețeaua. proxy Dacă este declarat ca extern și expune ambele panouri din subdomeniile configurate, cu HTTPS automat datorită Let's EncryptDin acel moment, adăugarea de noi servicii se rezumă la clonarea proiectului, adăugarea câtorva etichete Traefik și conectarea acestuia la rețea. proxy.

Scenariul Docker Swarm: Portainer și Traefik într-un cluster

Când activezi Docker Swarm, lucrurile se schimbă puțin, deoarece serviciile sunt implementate ca stive, iar rețelele sunt de obicei bazate pe suprapuneri. Cu toate acestea, logica de bază cu Traefik și Portainer este foarte similară: Traefik continuă să acționeze ca un proxy invers și un detector dinamic de servicii, iar Portainer poate funcționa atât în ​​modul standalone, cât și în modul Portainer + agent pentru a gestiona nodurile la distanță din cadrul clusterului.

Într-o implementare Swarm tipică, stiva este creată înainte de a fi aplicată. două rețele suprapuse pe care Traefik îl va folosi pentru a direcționa traficul între noduri. În plus, este creat un volum pentru a persista datele Portainer (de exemplu) portainer_data) și, dacă aveți nevoie, unul pentru acme.json sau directorul în care Traefik stochează certificatele și configurația.

El docker-compose.yml (care se desfășoară apoi cu docker stack deploy folosind, de exemplu, -c portainer.yml) definește de obicei două servicii: Agent portainer, care rulează în modul global pe toate nodurile Linux și serviciul principal Portainer (CE sau EE), care în mod normal rămâne în mod replicat cu o constrângere de a rula doar pe manageri.

Agentul Portainer montează socketul Docker și directorul volumului (/var/lib/docker/volumes) pentru a putea inspecta resursele. Se conectează la rețeaua suprapusă pe care o va partaja cu Traefik, de exemplu traefik_publicServiciul principal Portainer poate fi configurat să comunice cu agentul prin TCP (tcp://tasks.agent:9001) și, de fapt, în unele exemple, comanda respectivă este afișată cu --tlsskipverify a comentat, pentru a omite verificarea TLS dacă este necesar.

Pe aceeași stivă sau alta, Traefik pornește cu furnizorul Docker în modul Swarm (swarmMode = true în TOML sau opțiunea echivalentă în flags), observând serviciile etichetate. Configurația sa include un certificatesResolvers.main.acme pentru Let's Encrypt, o dnsChallenge cu un furnizor precum Ruta 53 Dacă doriți să validați certificatele prin DNS și un bloc de tls.options unde, de exemplu, este forțat minVersion = "VersionTLS13" pentru profilul implicit și este definită o listă explicită de cipherSuites pentru un profil TLS 1.2.

Etichetele Portainer de la Swarm urmează aceeași filozofie: traefik.enable=trueun router ca traefik.http.routers.portainer cu Host(`portainer.midominio.com`), traefik.http.routers.portainer.entrypoints=https (o websecure (conform denumirii) și traefik.http.routers.portainer.tls=true pentru a activa TLS pe ​​routerul respectiv. În plus, puteți specifica certresolver cu traefik.http.routers.portainer.tls.certresolver=main și schema backend dacă serviciul comunică intern HTTPS cu traefik.http.services.portainer.loadbalancer.server.scheme=https.

În jurnalele de depanare Traefik din Swarm veți vedea configurația generată: routere precum api y portainer, servicii descoperite (de exemplu portainer en http://10.0.1.12:9000 și un serviciu traefik (indicând portul 8080 al tabloului de bord) și, dacă există o problemă cu etichete prost definite, mesaje precum „Nu s-a putut defini numele serviciului pentru router: prea multe servicii”care indică de obicei existența unui conflict sau a unei duplicații a serviciilor asociate cu un router.

Exemplu minimal: whoami, rute și TLS cu Traefik

Înainte de a introduce Portainer în ecuație, este destul de practic să încercați Traefik cu un backend foarte simplu, precum cel din imagine. traefik/whoamicare returnează informații despre solicitare. Acest lucru vă ajută să validați dacă Traefik este configurat corect și dacă regulile de rutare funcționează.

Un docker-compose.yml de bază poate include serviciul traefik cu imaginea traefik:v3.4, montarea socketului Docker și definirea flag-urilor de boot ca --providers.docker=true, --providers.docker.exposedbydefault=false, --providers.docker.network=proxy și punctul de intrare --entryPoints.web.address=:80Porturile 80 și 8080 sunt anunțate pe gazdă și se creează o rețea. proxy care va folosi și containerul whoami.

Serviciul de whoami Începe în aceeași rețea și este marcat cu traefik.enable=trueApoi, un router este definit cu eticheta traefik.http.routers.whoami.rule=Host(`whoami.docker.localhost`) și este indicat că punctul dvs. de intrare este webDacă faceți o cerere cu curl -H "Host: whoami.docker.localhost" http://localhost/Veți vedea un răspuns cu numele de gazdă, adresele IP, anteturile și așa mai departe, care confirmă că Traefik rutează corect.

  Eroare 404 Negăsită: Ce este, cauzele, impactul asupra site-ului dvs. web și cum se poate remedia.

De acolo, e simplu adăugați rutare prin căiDe exemplu, puteți crea un alt serviciu. whoami-api cu aceeași imagine, pe aceeași rețea și etichetați-o cu o regulă de tipul Host(`whoami.docker.localhost`) && PathPrefix(`/api`)Astfel, rădăcina / mergi la whoami original și cererile către /api îi va servi whoami-apiPuteți verifica acest lucru adresând solicitări către / ya /api cu aceeași gazdă.

Pentru a activa TLS În acest mediu local, o opțiune este generarea unui certificat autosemnat pentru domeniu *.docker.localhost cu opensslCreați un director certs, generezi local.key y local.crt, apoi adăugați un fișier dinamic (de exemplu dynamic/tls.yml) cu secțiunea tls: și rutele certFile y keyFile arătând spre acele fișiere.

Apoi, actualizați definiția serviciului Traefik în docker-compose.yml pentru a monta folderul ./certs și dosarul ./dynamic în interiorul containerului, activați API-ul securizat cu --api.dashboard=true, creați punctul de intrare websecure (--entryPoints.websecure.address=:443) și activați TLS acolo cu --entryPoints.websecure.http.tls=trueDe asemenea, etichetați routerul de bord și routerele whoami pentru ca ei să folosească websecure si are tls=true.

Odată ce este activat, veți putea accesa https://whoami.docker.localhost/ și către panoul Traefik cu un certificat autosemnat, acceptând avertismentul de securitate al browserului. Această experiență este foarte similară cu cea pe care o veți avea mai târziu în producție cu Let's Encrypt, dar fără a vă baza pe servere DNS publice.

Cele mai bune practici, implementarea aplicațiilor și rezolvarea problemelor tipice

Un model care se repetă în toate aceste exemple este acela că Traefik simplifică considerabil implementarea de noi aplicațiiDupă ce ai stiva de bază (Traefik + Portainer + rețea) proxy (+ certificate), adăugarea unui nou serviciu se reduce de obicei la:

Clonează proiectul sau copiază-l docker-compose.yml către server, indicați un subdomeniu către adresa IP a gazdei folosind un înregistrarea A în DNS-ul dvs. (de exemplu app.tudominio.com), apoi adăugați etichetele cheii la serviciu: traefik.enable=true, traefik.docker.network=proxy și un router cu o regulă de gazdă pentru acel subdomeniu, specificând punctul de intrare securizat websecure și serviciu cu portul intern corect.

Multe tutoriale ar arăta, de exemplu, implementarea unei mici aplicații FastAPI Separat: sunt adăugate patru etichete, asigurând că se alătură rețelei proxy în secțiune networks del docker-compose.ymlși după ce a făcut docker compose up -d Aplicația apare automat în tabloul de bord Traefik cu TLS activat. Descoperirea automată a Traefik înseamnă că nici măcar nu trebuie să ajustați setările statice.

Pentru a asigura că totul merge fără probleme, este important să acordați atenție câtorva detalii: Nu reutilizați același identificator de router În diverse aplicații, verificați dacă există un singur serviciu asociat cu fiecare router (evitând eroarea „prea multe servicii”), utilizați nume de rețea consecvente (de exemplu, proxy pe toate stivele pe care doriți să le expuneți) și, dacă utilizați Let's Encrypt, asigurați-vă că acme.json Are permisiuni 600 și adresa de e-mail configurată este validă.

În mediile Swarm, verificați și dacă configurația Traefik include furnizorul Docker. swarmMode=true y watch=trueși că constrângerile serviciilor (de exemplu node.role == manager (pentru Portainer) nu intră în conflict cu locul în care este implementat Traefik. Jurnalele de depanare sunt foarte detaliate, dar sunt esențiale pentru localizarea problemelor de rutare sau TLS.

Combinand Docker, Traefik și Portainer, puteți configura un mediu complet de orchestrare ușoară pe un singur server, cu tablouri de bord grafice, certificate automate și un flux de implementare foarte rapid, unde adăugarea, actualizarea sau eliminarea serviciilor se reduce la modificarea câtorva linii de YAML și lăsarea lui Traefik să facă treaba murdară de proxy invers și TLS.