- A Traefik dinamikus fordított proxyként működik és TLS tanúsítványokat kezel, míg a Portainer grafikus felületet kínál a Docker és a Swarm kezeléséhez.
- A traefik.yml, a dynamic.yml és a docker-compose.yml kombinációja lehetővé teszi belépési pontok, biztonsági köztes rétegek és címkealapú HTTP/HTTPS útválasztás definiálását.
- Docker önálló vagy Swarm környezetben egyszerűen csatlakoztassa a szolgáltatásokat a proxy hálózathoz, és címkézze meg őket, hogy a Traefik biztonságosan felfedezhesse és elérhetővé tehesse azokat.
- A Let's Encrypt, a dedikált hálózatok és az irányítópulton található alapvető hitelesítés használata robusztus környezetet biztosít több alkalmazás egyetlen szerveren történő telepítéséhez.
Egy modern stack beállítása Docker, Traefik és Portainer segítségével jelenleg az egyik legegyszerűbb módja a konténerek egyetlen szerveren történő kezelésének és több szolgáltatás HTTPS-sel történő elérhetővé tételének anélkül, hogy a konfigurációban elakadnánk. A szépsége abban rejlik, hogy a Traefik dinamikus fordított proxyként működik, míg a Portainer egy nagyon egyszerű webes felületet biztosít a Docker, és ha szeretnénk, a Swarm kezeléséhez is.
Ebben a cikkben megtudhatod, hogyan Traefik illesztése fordított proxyként Portainer elé Mind egy „klasszikus” Docker (önálló) forgatókönyvben, mind egy Docker Swarm klaszterben hogyan integrálható a TLS (önaláírt vagy Let's Encrypt), és milyen konfigurációs fájlok jönnek szóba (traefik.yml, dynamic.yml y docker-compose.yml) és néhány gyakori trükk a köztes szoftverekkel, hálózatokkal és tipikus címkézési problémákkal a Traefikben.
Milyen szerepet játszik Docker, Traefik és Portainer az architektúrában?
Ebben a beállítástípusban a Docker az alapréteg, ahol a konténerek futnak, a Traefik fordított proxyként és terheléselosztóként működik, amely az összes HTTP/HTTPS kérést fogadja a 80-as és 443-as portokon, és elküldi azokat a megfelelő konténernek, a Portainer pedig grafikus felületet biztosít a képek, konténerek, kötetek, hálózatok és Docker vagy Swarm stackek kezeléséhez.
Az ötlet az, hogy egyetlen Dockerrel rendelkező hoszt legyen, ahol A Traefik az „átjárónál” található.: figyelj a belépési pontokon web (80) és websecure (443), feloldja a TLS tanúsítványokat (általában a Let's Encrypt segítségével), és a Docker szolgáltatóval való integrációnak köszönhetően automatikusan felismeri az Ön által közzétett szolgáltatásokat a konténerek címkéinek hozzáadásával.
Másrészről a Portainer úgy működik, mint egy egyszerű konténer, de ki van téve a… egy adott aldomain, például portainer.tudominio.com, TLS-sel védve, és igény szerint egy további hitelesítési köztes szoftver mögött, a Portainer saját bejelentkezésén túl. Mindez egy dokkoló-levélírás amely meghatározza Traefik, Portainer és a típusok közös hálózatát proxy.
Ennek a megközelítésnek az egyértelmű előnye, hogy új szolgáltatásokat egyszerűen a konténerekhez címkék hozzáadásával telepíthet : a Traefik érzékeli a Dockerben bekövetkező változásokat, menet közben létrehozza az útválasztókat, szolgáltatásokat és köztes szoftvereket, és másodpercek alatt beállíthatja és futtathatja az új aldomaint vagy útvonalat anélkül, hogy manuálisan kellene megérinteni a statikus konfigurációs fájlokat.
Traefik statikus konfiguráció: traefik.yml
A Traefik statikus konfigurációját általában egy ilyen fájlban tárolják: traefik.ymlamely a tartály belsejébe van szerelve. Itt van definiálva irányítópult, belépési pontok, szolgáltatók és tanúsítványfeloldó Többek között titkosítsuk is.
Egy tipikus YAML konfiguráció az API és a vezérlőpult aktiválásával kezdődik, valami ilyesmivel: api: dashboard: trueEz hozzáférést biztosít a webes felülethez, ahol megtekintheti az útválasztókat, szolgáltatásokat és köztes szoftvereket. Ez a panel alapértelmezés szerint nincs hitelesítve, ezért később meglátjuk, hogyan lehet biztonságossá tenni alapvető hitelesítéssel a dinamikus konfigurációból.
Ezután meghatározzák a belépési pontokat. Normális esetben vannak egy belépési pont web az 80-es kikötőben és egyéb websecure az 443-ban. A web Az automatikus átirányítás általában úgy van konfigurálva, hogy websecureígy minden HTTP-hozzáférés HTTPS-re lesz átirányítva:
Egy tipikus vázlat tartalmazna egy szakaszt http.redirections.entryPoint.to: websecure hogy kikényszerítse ezt az átirányítást, és az összes titkosított forgalmat a biztonságos belépési ponton központosítsa.
hogy websecure Jelezték, hogy TLS-t kell használni, és egy linket is megadtak. tanúsítványfeloldó (például letsencrypt), amely a tanúsítványok automatikus kezeléséért lesz felelős. Mindezt támogatja a CSÚCSPONT, amely a Let's Encrypt által használt protokoll a tanúsítványok kibocsátására és megújítására.
A blokkban szolgáltatók A Docker szolgáltató konfigurálva van, a socketre mutat unix:///var/run/docker.sockegy kulcsfontosságú opcióval: exposedByDefault: falseEzzel a Traefik alapértelmezés szerint nem teszi közzé az összes konténert; csak azokat, amelyek a címkét viselik. traefik.enable=trueFájlszolgáltatót is konfigurálhat (file) további dinamikus konfiguráció betöltéséhez például innen: /configurations/dynamic.yml.
Végül a statikus fájl általában tartalmazza a szakaszt certificatesResolversahol az ACME feloldó definiálva van: regisztrációs e-mail, tárolófájl (általában acme.json), kulcstípus (például EC384) és az érvényesítési módszer (például httpChallenge a belépési ponton webFontos, hogy állíts be egy valódi e-mailt ebben a szakaszban, mert a Let's Encrypt ezt használja az értesítésekhez és megújításokhoz; ha ál- vagy helytelenül formázott értéket hagy, hibákba ütközhet a Traefik konténer indításakor.
Ezen a YAML konfiguráción kívül vannak olyan telepítések is, amelyek a következőket használják: TOML formátum (traefik.toml)De a logika ugyanaz: szakaszfeloldó tanúsítványokat használnak (például [certificatesResolvers.main.acme]), meghatározzák a kihívásokat (például dnsChallenge a provider = "route53") és adjon hozzá alapértelmezett TLS-beállításokat, például Kényszerítés minVersion = "VersionTLS13" vagy konfiguráljon egy listát cipherSuites megengedett.
Dinamikus konfiguráció: köztes szoftver, TLS és biztonság
A Traefik dinamikus része általában egy ilyen fájlba kerül: dynamic.yml, a fájlszolgáltató által betöltött. Itt definiálhatod köztes szoftverek és TLS-opciók amely a Traefik konténer újraindítása nélkül módosítható, ami nagyon hasznos a biztonság menet közbeni beállításához.
Egy tipikus eset például a header middleware létrehozása. secureHeadersamely a HSTS-hez kapcsolódó szabályzatokat és a HTTPS kötelező használatát adja hozzá. A YAML-ben olyan paramétereket találhat, mint a sslRedirect: true, forceSTSHeader: true, stsIncludeSubdomains: true, stsPreload: true és egy stsSeconds magas (például egy év másodpercben). Ez a böngésző oldaláról erősíti a forgalom biztonságát.
Egy másik gyakori köztes szoftver az alapvető hitelesítéshez használt, például user-auth típus basicAuth, ahol a felhasználók listája a következő formátumban van deklarálva: usuario:hashA hash-t általában a következővel generálják: htpasswd és be van ágyazva a fájlba. Ez a köztes szoftver általában a Traefik irányítópult routeréhez van társítva, így a HTTPS hozzáférés mellett felhasználónévre és jelszóra is szükség van.
Ugyanazon dinamikus konfiguráción belül gyakran látható egy blokk tls.options alapértelmezett profillal (default), ahol a támogatott titkosítások és a minimális TLS verzió be van állítva, például VersionTLS12Néhány telepítésben számos beállítás van definiálva (például egy profil, amelynek neve tls12 és egyéb default) a biztonsági szint szükség esetén a különböző szolgáltatásokhoz való igazításához.
Olyan környezetben, ahol kívánatos a használata TLS belsőleg is A Traefik és a háttérszolgáltatások (például a Portainer) között probléma merülhet fel, ha ezek a szolgáltatások nem rendelkeznek nyilvános hitelesítésszolgáltató által elismert tanúsítvánnyal. Itt jön képbe ez a lehetőség. insecureSkipVerify, amely a következő alatt konfigurálva van: providers.http.tls vagy a megfelelő TLS-beállításokban lehetővé teszi a Traefik számára a háttérbeli tanúsítvány-érvényesítés megkerülését. Ez laboratóriumi környezetekben vagy belső, önaláírt tanúsítványoknál hasznos, de óvatosan kell használni, mert enyhíti az ellenőrzést.
Egy gyakorlati részlet: a fájl dynamic.yml Menet közben szerkeszthető.A Traefik újraindítás nélkül tölti be a dinamikus konfigurációt, így hozzáadhat vagy eltávolíthat köztes szoftvereket, módosíthatja a biztonsági fejléceket, vagy módosíthatja az alapvető hitelesítést a proxy elérhetőségének befolyásolása nélkül.
docker-compose Traefik és Portainer segítségével Docker önálló verzióban
Egy Docker-szcenárióban, Swarm nélkül, a leggyakoribb dolog az indítás Traefik és Portainer egyetlen docker-compose.yml amely mind a szolgáltatásokat, mind egy megosztott híd típusú hálózatot definiál, amelyet például a következőnek neveznek: proxy.
A szolgáltatás Traefik Általában a hivatalos képet használja, például traefik:latest vagy egy speciális verzió, mint például traefik:v3.4A portok fel vannak térképezve. 80 és 443 webes forgalomhoz, és néhány példában a 8080-as porthoz a vezérlőpult belső eléréséhez. Ezenkívül a lehetőség is hozzáadásra került restart: unless-stopped és a biztonságot megerősítik security_opt: - no-new-privileges:true a konténeren belüli jogosultság-eszkaláció kockázatának csökkentése érdekében.
A köteteket illetően a Traefiknek csatolnia kell a csak olvasható Docker socketet (/var/run/docker.sock:/var/run/docker.sock:ro) a konténerek felfedezéséhez, a statikus fájl traefik.yml és a könyvtár, ahová a dinamikus konfiguráció mentésre kerül (./traefik-data/configurations:/configurationsA fájl is fel van csatolva. acme.jsonItt tárolja a Traefik a Let's Encrypt által kibocsátott tanúsítványokat. Ez a fájl a gazdagépen jön létre, és jogosultságokat kap. 600 hogy csak a megfelelő felhasználó tudja olvasni és írni; ha 644-gyel hagyjuk, Traefik általában panaszkodik.
Traefik varázslatának kulcsa a szervizcímkékTöbbek között a következőket találja: traefik.enable=true (hogy a Docker szolgáltató elérhetővé tegye ezt a szolgáltatást), traefik.docker.network=proxy (azt jelzi, hogy a Traefik melyik hálózatot használja a konténerrel való kommunikációhoz), és egy router, mint például traefik.http.routers.traefik-secure, a belépési pontját meghatározó címkékkel (websecure), a gazdaszabály (például Host(`traefik.tudominio.com`)), a kapcsolódó szolgáltatás (api@internal) és a hitelesítési köztes szoftver (user-auth@file).
A szolgáltatás Portaer ugyanazon docker-compose.yml általában használ portainer/portainer-ce:latest (vagy az Enterprise kiadás, ha van licence). Hasonló kötetek vannak csatolva: a Docker socket, az adatmappa (./portainer-data:/data) és gyakran a /etc/localtime így az örökli a gazdagép időzónáját.
A Portainer címkéi a Traefiknél regisztrálják: traefik.enable=true, traefik.docker.network=proxyegy olyan router, mint a traefik.http.routers.portainer-secure belépési ponttal websecure és egy gazdaszabály, mint például Host(`portainer.tudominio.com`)Ezenkívül a Traefik által használandó szolgáltatás is definiálva van, a Portainer belső portjára mutatva, például a következővel: traefik.http.services.portainer.loadbalancer.server.port=9000.
Mindezzel a folyamatban, az indítás után docker compose up -d A stack könyvtárban a Traefik letölti a képeket és létrehozza a hálózatot. proxy Ha külsőként van deklarálva, és mindkét panelt elérhetővé teszi a konfigurált aldoménekben, akkor a Automatikus HTTPS a Let's Encryptnek köszönhetőenEttől a ponttól kezdve az új szolgáltatások hozzáadása a projekt klónozásának, néhány Traefik címke hozzáadásának és a hálózathoz való csatlakoztatásának kérdése. proxy.
Docker Swarm forgatókönyv: Portainer és Traefik egy klaszterben
A Docker Swarm aktiválásakor a dolgok kissé megváltoznak, mivel a szolgáltatások veremként (stack) kerülnek telepítésre, a hálózatok pedig jellemzően overlay-alapúak. A Traefik és a Portainer mögöttes logikája azonban nagyon hasonló: a Traefik továbbra is fordított proxyként és dinamikus szolgáltatásfelderítőként működik, a Portainer pedig önálló módban és Portainer + ügynök módban is működhet a fürtön belüli távoli csomópontok kezeléséhez.
Egy tipikus Swarm telepítésben a verem létrehozása az alkalmazása előtt történik. két átfedő hálózat amelyet a Traefik a csomópontok közötti forgalom irányítására fog használni. Ezenkívül létrejön egy kötet a Portainer-adatok (például) megőrzésére. portainer_data) és ha szükséged van rá, egyet a acme.json vagy a könyvtár, ahol a Traefik tárolja a tanúsítványokat és a konfigurációt.
El docker-compose.yml (ami aztán kibontakozik a docker stack deploy például a következő használatával: -c portainer.yml) általában két szolgáltatást definiál: Hordárügynök, amely módban fut global az összes Linux csomóponton, valamint a fő Portainer szolgáltatáson (CE vagy EE), amely általában replikált módban marad, és csak a vezetőkön futhat.
A Portainer ügynök csatolja a Docker socketet és a kötetkönyvtárat (/var/lib/docker/volumes) az erőforrások vizsgálatához. Csatlakozik az átfedő hálózathoz, amelyet például a Traefik-kel fog megosztani. traefik_publicA fő Portainer szolgáltatás konfigurálható úgy, hogy TCP-n keresztül kommunikáljon az ügynökkel (tcp://tasks.agent:9001) és valójában néhány példában ez a parancs a következőképpen jelenik meg: --tlsskipverify megjegyzést tett, hogy szükség esetén kihagyja a TLS-ellenőrzést.
Ugyanazon a veremen vagy egy másikon a Traefik a Docker szolgáltatóval indul Swarm módban (swarmMode = true TOML-ben vagy azzal egyenértékű opcióval a flags-ben), figyelve a címkézett szolgáltatásokat. Konfigurációja tartalmaz egy certificatesResolvers.main.acme a Let's Encrypt számára dnsChallenge egy beszállítóval, mint például 53-os út Ha DNS-sel szeretné érvényesíteni a tanúsítványokat, és egy blokknyit tls.options ahol például arra kényszerítik, minVersion = "VersionTLS13" az alapértelmezett profilhoz, és egy explicit lista van definiálva a következőkről: cipherSuites TLS 1.2 profilhoz.
A Portainer kiadói a Swarmnál ugyanazt a filozófiát követik: traefik.enable=trueegy router, mint például traefik.http.routers.portainer a Host(`portainer.midominio.com`), traefik.http.routers.portainer.entrypoints=https (o websecure (a névadás szerint), és traefik.http.routers.portainer.tls=true hogy engedélyezze a TLS-t az adott routeren. Ezenkívül megadhatja a certresolver a traefik.http.routers.portainer.tls.certresolver=main és a háttérrendszer sémáját, ha a szolgáltatás belsőleg HTTPS-t használ traefik.http.services.portainer.loadbalancer.server.scheme=https.
A Swarm Traefik hibakeresési naplóiban a létrehozott konfigurációt láthatja: routerek, mint például api y portainer, felfedezett szolgáltatások (például portainer en http://10.0.1.12:9000 és egy szolgáltatás traefik (a műszerfal 8080-as portjára mutat), és ha probléma van a rosszul definiált címkékkel, akkor olyan üzenetek jelennek meg, mint a "Nem sikerült meghatározni a router szolgáltatásnevét: túl sok szolgáltatás"amelyek általában azt jelzik, hogy ütközés vagy duplikáció van a routerhez kapcsolódó szolgáltatások között.
Minimális példa: whoami, útvonalak és TLS Traefik segítségével
Mielőtt a Portainer-t bevonnánk az egyenletbe, meglehetősen praktikus kipróbálni a Traefik-et egy nagyon egyszerű háttérrel, mint például a képpel. traefik/whoamiamely információkat ad vissza a kérésről. Ez segít ellenőrizni, hogy a Traefik megfelelően van-e konfigurálva, és hogy az útválasztási szabályok működnek-e.
Un docker-compose.yml az alapcsomag tartalmazhatja a szolgáltatást traefik a képpel traefik:v3.4, a Docker socket csatolása és a rendszerindító jelzők definiálása a következőképpen --providers.docker=true, --providers.docker.exposedbydefault=false, --providers.docker.network=proxy és a belépési pont --entryPoints.web.address=:80A 80-as és 8080-as portokat meghirdetik a gazdagépen, és létrejön egy hálózat. proxy amely a konténert is használni fogja whoami.
A szolgáltatás whoami Ugyanazon a hálózaton indul, és a következő jelöli: traefik.enable=trueEzután egy routert a címkével definiálunk traefik.http.routers.whoami.rule=Host(`whoami.docker.localhost`) és jelezve van, hogy a belépési pontod webHa kérést nyújt be a curl -H "Host: whoami.docker.localhost" http://localhost/Látni fog egy választ, amely tartalmazza a gazdagépnevet, IP-címeket, fejléceket stb., ami megerősíti, hogy a Traefik helyesen irányítja az útvonalat.
Innentől kezdve egyszerű. útvonalak szerinti útvonaltervezés hozzáadásaPéldául létrehozhat egy másik szolgáltatást. whoami-api ugyanazzal a képpel, ugyanazon a hálózaton, és címkézd fel egy ilyen típusú szabállyal Host(`whoami.docker.localhost`) && PathPrefix(`/api`)Így a gyökér / menj whoami eredeti és a kérések /api kiszolgálja őket whoami-apiEzt kérésekkel ellenőrizheti / ya /api ugyanazzal a házigazdával.
Az aktiváláshoz TLS Ebben a helyi környezetben az egyik lehetőség egy önaláírt tanúsítvány létrehozása a domainhez. *.docker.localhost a opensslLétrehozol egy könyvtárat certs, te generálsz local.key y local.crt, majd hozzáadsz egy dinamikus fájlt (például dynamic/tls.yml) a szakasszal tls: és az útvonalak certFile y keyFile azokra a fájlokra mutatva.
Ezután frissíti a Traefik szolgáltatásdefinícióját a docker-compose.yml a mappa csatolásához ./certs és a mappa ./dynamic a konténeren belül aktiválja a biztonságos API-t a --api.dashboard=true, létrehozod a belépési pontot websecure (--entryPoints.websecure.address=:443) és engedélyezd ott a TLS-t --entryPoints.websecure.http.tls=trueA műszerfali routert és a routereket is felcímkézed. whoami hogy használják websecure és van tls=true.
Ha fel van állítva, hozzáférhetsz majd https://whoami.docker.localhost/ és a Traefik panelre egy önaláírt tanúsítvánnyal, elfogadva a böngésző biztonsági figyelmeztetését. Ez a folyamat nagyon hasonló ahhoz, amivel később a Let's Encrypt éles környezetben találkozhat, de nyilvános DNS-kiszolgálók használata nélkül.
Ajánlott eljárások, alkalmazások telepítése és a tipikus problémák megoldása
Egy minta ismétlődik ezekben a példákban: A Traefik jelentősen leegyszerűsíti az új alkalmazások telepítésétMiután megvan az alapkészleted (Traefik + Portainer + hálózat) proxy (+ tanúsítványok), egy új szolgáltatás hozzáadása általában a következőkre redukálódik:
Klónozza a projektet, vagy másolja a docker-compose.yml a szerverhez, irányítson egy aldomaint a gazdagép IP-címére egy rekord A a DNS-ben (például app.tudominio.com), majd adja hozzá a kulcscímkéket a szolgáltatáshoz: traefik.enable=true, traefik.docker.network=proxy és egy router, amely rendelkezik egy host szabállyal az adott aldomainhez, meghatározva a biztonságos belépési pontot websecure és szolgáltatás a megfelelő belső porttal.
Sok oktatóanyag bemutatná például egy kisalkalmazás telepítését FastAPI Elkülönítve: négy címke kerül hozzáadásra, biztosítva a hálózathoz való csatlakozást proxy a szakaszban networks del docker-compose.ymlés miután megcsinálta docker compose up -d Az alkalmazás automatikusan megjelenik a Traefik irányítópultján, engedélyezett TLS-sel. A Traefik automatikus felismerése azt jelenti, hogy még a statikus beállításait sem kell módosítani.
Ahhoz, hogy minden zökkenőmentesen menjen, fontos odafigyelni néhány apró részletre: ne használja újra ugyanazt a router azonosítót Különböző alkalmazásokban ellenőrizd, hogy minden routerhez csak egy szolgáltatás van-e társítva (kerüld el a „túl sok szolgáltatás” hibát), és használj következetes hálózati neveket (például proxy az összes elérhetővé tenni kívánt veremre), és ha a Let's Encrypt szolgáltatást használod, győződj meg arról, hogy a acme.json 600-as jogosultságokkal rendelkezik, és a konfigurált e-mail cím érvényes.
Swarm környezetekben azt is ellenőrizd, hogy a Traefik konfigurációja tartalmazza-e a Docker szolgáltatót. swarmMode=true y watch=trueés hogy a szolgáltatások korlátai (például node.role == manager (Portainer esetén) nem ütközik a Traefik telepítési helyével. A hibakeresési naplók nagyon részletesek, de kulcsfontosságúak az útválasztási vagy TLS-problémák megtalálásához.
A Docker, a Traefik és a Portainer kombinálásával egyetlen szerveren létrehozhat egy komplett, könnyűsúlyú orchestrációs környezetet grafikus műszerfalakkal, automatikus tanúsítványokkal és nagyon gyors telepítési folyamattal, ahol a szolgáltatások hozzáadása, frissítése vagy eltávolítása csupán néhány sornyi YAML módosítására szolgál, és a Traefik végzi el a fordított proxy és a TLS piszkos munkáját.
