- Traefik funguje jako dynamická reverzní proxy a řeší TLS certifikáty, zatímco Portainer nabízí grafické rozhraní pro správu Dockeru a Swarmu.
- Kombinace souborů traefik.yml, dynamic.yml a docker-compose.yml umožňuje definovat vstupní body, bezpečnostní middleware a směrování HTTP/HTTPS na základě štítků.
- V samostatných scénářích Dockeru nebo Swarmu jednoduše připojte služby k proxy síti a označte je, aby je Traefik mohl bezpečně objevit a zpřístupnit.
- Použití Let's Encrypt, dedikovaných sítí a základního ověřování na řídicím panelu konsoliduje robustní prostředí pro nasazení více aplikací na jednom serveru.
Nastavení moderního stacku s Dockerem, Traefikem a Portainerem je v současnosti jedním z nejjednodušších způsobů, jak spravovat kontejnery na jednom serveru a zpřístupnit více služeb pomocí HTTPS, aniž byste se museli zaobírat konfigurací. Krása spočívá v tom, že Traefik funguje jako dynamická reverzní proxy, zatímco Portainer poskytuje velmi jednoduché webové rozhraní pro správu Dockeru a případně i Swarmu.
V tomto článku uvidíte, jak použití Traefiku jako reverzní proxy před Portainer Jak v „klasickém“ scénáři Dockeru (samostatný) a v clusteru Docker Swarm, jak integrovat TLS (self-signed nebo Let's Encrypt) a jaké konfigurační soubory se uplatňují (traefik.yml, dynamic.yml y docker-compose.yml) a některé běžné triky s middlewarem, sítěmi a typickými problémy s tagováním v Traefiku.
Jakou roli hrají v architektuře Docker, Traefik a Portainer?
V tomto typu nastavení je Docker základní vrstvou, kde běží kontejnery, Traefik funguje jako reverzní proxy a vyrovnávač zátěže , který přijímá všechny HTTP/HTTPS požadavky na portech 80 a 443 a odesílá je do příslušného kontejneru, a Portainer poskytuje grafické rozhraní pro správu imagí, kontejnerů, svazků, sítí a Docker nebo Swarm stacků.
Myšlenkou je mít jednoho hostitele s Dockerem, kde Traefik se nachází u „brány“poslouchat u vstupních bodů web (80) y websecure (443), řeší TLS certifikáty (obvykle pomocí Let's Encrypt) a díky integraci s poskytovatelem Docker automaticky vyhledává služby, které zpřístupňujete, přidáním štítků ke kontejnerům.
Na druhou stranu, Portainer běží jako další kontejner, ale je vystaven skrz například konkrétní subdoména portainer.tudominio.com, chráněný protokolem TLS a v případě potřeby za dalším ověřovacím middlewarem nad rámec vlastního přihlášení Portaineru. To vše je zorganizováno pomocí docker-compose která definuje Traefika, Portainera a společnou síť typu proxy.
Jasnou výhodou tohoto přístupu je, že můžete nasazovat nové služby pouhým přidáním štítků do kontejnerů: Traefik detekuje změnu v Dockeru, vytváří routery, služby a middleware za běhu a během několika sekund máte spuštěnou novou subdoménu nebo route, aniž byste se museli ručně dotýkat statických konfiguračních souborů.
Statická konfigurace Traefiku: traefik.yml
Statická konfigurace Traefiku je obvykle uložena v souboru typu traefik.ymlkterý je namontován uvnitř kontejneru. Zde je definován řídicí panel, vstupní body, poskytovatelé a překladač certifikátů Pojďme šifrovat, mimo jiné.
Typická konfigurace YAML začíná aktivací API a ovládacího panelu pomocí něčeho jako api: dashboard: trueTo umožňuje přístup k webovému rozhraní, kde si můžete prohlédnout routery, služby a middleware. Tento panel není ve výchozím nastavení ověřován, takže později uvidíme, jak jej zabezpečit základním ověřováním z dynamické konfigurace.
Dále se definují vstupní body. Obvykle existují vstupní bod web v přístavu 80 a další websecure v zařízení 443. V web Automatické přesměrování je obvykle nakonfigurováno tak, aby websecureaby jakýkoli přístup HTTP byl přesměrován na HTTPS:
Typická osnova by měla obsahovat část http.redirections.entryPoint.to: websecure vynutit toto přesměrování a centralizovat veškerý šifrovaný provoz v zabezpečeném vstupním bodě.
na websecure Je uvedeno, že by se mělo použít TLS, a je poskytnut odkaz. certResolver (například letsencrypt), který bude zodpovědný za automatickou správu certifikátů. To vše je podporováno systémem VRCHOL, což je protokol, který Let's Encrypt používá k vydávání a obnovování certifikátů.
V bloku Poskytovatelů služeb Poskytovatel Dockeru je nakonfigurován a ukazuje na socket. unix:///var/run/docker.socks jednou klíčovou možností: exposedByDefault: falseDíky tomu Traefik standardně nepublikuje všechny kontejnery, ale pouze ty, které nesou daný štítek. traefik.enable=trueMůžete také nakonfigurovat poskytovatele souborů (file) k načtení další dynamické konfigurace například z /configurations/dynamic.yml.
Nakonec statický soubor obvykle obsahuje sekci certificatesResolverskde je definován resolver ACME: registrační e-mail, úložný soubor (obvykle acme.json), typ klíče (například EC384) a metoda validace (například httpChallenge na vstupním bodě webJe důležité, aby nastavit skutečný e-mail v této sekci, protože Let's Encrypt ji používá pro oznámení a obnovení; pokud ponecháte fiktivní nebo chybně formátovanou hodnotu, můžete se při spuštění kontejneru Traefik setkat s chybami.
Kromě této konfigurace YAML existují i nasazení, která používají Formát TOML (traefik.toml)Ale logika je stejná: rozdělují certifikáty resolveru (například [certificatesResolvers.main.acme]), definovat výzvy (jako například dnsChallenge s provider = "route53") a přidat výchozí možnosti TLS, například forzar minVersion = "VersionTLS13" nebo nakonfigurovat seznam cipherSuites povoleno.
Dynamická konfigurace: middleware, TLS a zabezpečení
Dynamická část Traefiku se obvykle ukládá do souboru, jako je dynamic.yml, načtený poskytovatelem souboru. Zde definujete middleware a možnosti TLS které lze upravit bez restartu kontejneru Traefik, což je velmi užitečné pro úpravu zabezpečení za chodu.
Typickým případem je například vytváření middlewaru pro hlavičky. secureHeaderskterý přidává zásady týkající se HSTS a povinného používání HTTPS. V YAML můžete najít parametry jako sslRedirect: true, forceSTSHeader: true, stsIncludeSubdomains: true, stsPreload: true a stsSeconds vysoká (například rok v sekundách). Tím se posiluje zabezpečení provozu ze strany prohlížeče.
Dalším běžným middlewarem je například middleware pro základní ověřování. user-auth typ basicAuth, kde je seznam uživatelů deklarován ve formátu usuario:hashHash se obvykle generuje pomocí htpasswd a je vložen do souboru. Tento middleware je obvykle spojen s routerem Traefik dashboardu, takže kromě přístupu HTTPS vyžaduje uživatelské jméno a heslo.
V rámci stejné dynamické konfigurace je běžné vidět blok tls.options s výchozím profilem (default), kde jsou například nastaveny podporované šifry a minimální verze TLS VersionTLS12V některých nasazeních je definováno několik možností (například profil s názvem tls12 a další default) v případě potřeby přizpůsobit úroveň zabezpečení různým službám.
V prostředích, kde je žádoucí používat TLS také interně Mezi Traefikem a backendovými službami (jako je Portainer) může nastat problém, pokud tyto služby nemají certifikát uznaný veřejnou certifikační autoritou. A právě zde přichází na řadu tato možnost. insecureSkipVerify, který je nakonfigurován pod providers.http.tls nebo v příslušných možnostech TLS umožňuje Traefiku obejít ověřování certifikátů na backendu. To je užitečné pro laboratorní prostředí nebo interní certifikáty s vlastním podpisem, ale mělo by se to používat s opatrností, protože to zjednodušuje ověřování.
Praktický detail: spis dynamic.yml Lze to upravovat za chodu.Traefik znovu načte dynamickou konfiguraci bez nutnosti restartu, takže můžete přidávat nebo odebírat middleware, měnit bezpečnostní hlavičky nebo upravovat základní ověřování bez ovlivnění dostupnosti proxy serveru.
docker-compose s Traefikem a Portainerem v samostatném Dockeru
V holém Dockeru, bez Swarmu, je nejběžnějším krokem spuštění Traefik a Portainer s jedním docker-compose.yml která definuje jak služby, tak sdílenou síť typu mostu, nazývanou například proxy.
Služby Traefik Obvykle se používá oficiální obrázek, například traefik:latest nebo konkrétní verzi, jako např. traefik:v3.4Porty jsou namapované. 80 a 443 pro webový provoz a v některých případech i port 8080 pro interní zobrazení ovládacího panelu. Dále je přidána možnost restart: unless-stopped a bezpečnost je posílena security_opt: - no-new-privileges:true aby se snížilo riziko eskalace oprávnění v rámci kontejneru.
Co se týče svazků, Traefik potřebuje připojit socket Dockeru určený pouze pro čtení (/var/run/docker.sock:/var/run/docker.sock:ro) k objevení kontejnerů, statický soubor traefik.yml a adresář, kam bude uložena dynamická konfigurace (./traefik-data/configurations:/configurationsSoubor je také připojen. acme.jsonZde Traefik ukládá certifikáty vydané službou Let's Encrypt. Tento soubor se vytvoří na hostiteli a jsou mu přidělena oprávnění. 600 aby jej mohl číst a zapisovat pouze příslušný uživatel; pokud ho necháte s hodnotou 644, Traefik si obvykle stěžuje.
Klíčem k Traefikově magii je servisní štítkyMimo jiné zde najdete: traefik.enable=true (aby poskytovatel Dockeru tuto službu zpřístupnil), traefik.docker.network=proxy (označuje, kterou síť by měl Traefik použít pro komunikaci s kontejnerem) a router jako traefik.http.routers.traefik-secure, s popisky, které definují jeho vstupní bod (websecure), pravidlo hostitele (například Host(`traefik.tudominio.com`)), související služba (api@internal) a middleware pro ověřování (user-auth@file).
Služba Porttainer ve stejné docker-compose.yml obecně používá portainer/portainer-ce:latest (nebo edici Enterprise, pokud máte licenci). Jsou připojeny podobné svazky: socket Docker, datová složka (./portainer-data:/data) a často také /etc/localtime takže zdědí časové pásmo hostitele.
Etikety Portaineru jej registrují u Traefiku: traefik.enable=true, traefik.docker.network=proxyrouter typu traefik.http.routers.portainer-secure se vstupním bodem websecure a pravidlo hostitele jako Host(`portainer.tudominio.com`)Dále je definována služba, kterou by měl Traefik používat, a to odkazem na interní port Portaineru, například pomocí traefik.http.services.portainer.loadbalancer.server.port=9000.
S tímto vším v chodu, po spuštění docker compose up -d V adresáři stack si Traefik stáhne obrazy a vytvoří síť. proxy Pokud je deklarován jako externí a zpřístupňuje oba panely v nakonfigurovaných subdoménách, s Automatické HTTPS díky Let's EncryptOd tohoto okamžiku je přidávání nových služeb otázkou klonování vašeho projektu, přidání několika Traefik štítků a jeho připojení k síti. proxy.
Scénář Docker Swarm: Portainer a Traefik v clusteru
Když aktivujete Docker Swarm, věci se trochu změní, protože služby jsou nasazovány jako stacky a sítě jsou obvykle založeny na překrytí. Základní logika Traefiku a Portaineru je však velmi podobná: Traefik nadále funguje jako reverzní proxy a dynamický vyhledávač služeb a Portainer může fungovat jak v samostatném režimu, tak v režimu Portainer + agent pro správu vzdálených uzlů v clusteru.
V typickém nasazení Swarmu se zásobník vytvoří před jeho aplikací. dvě překryvné sítě který Traefik použije ke směrování provozu mezi uzly. Dále se vytvoří svazek pro uchování dat Portaineru (například) portainer_data) a pokud ho potřebujete, jeden pro acme.json nebo adresář, kde Traefik ukládá certifikáty a konfiguraci.
El docker-compose.yml (který se pak odvíjí s docker stack deploy například s použitím -c portainer.yml) obvykle definuje dvě služby: Agent pro přepravu osob, který běží v režimu global na všech linuxových uzlech a hlavní službu Portainer (CE nebo EE), která obvykle zůstává v replikovaném režimu s omezením spouštění pouze na správcích.
Agent Portainer připojí socket Docker a adresář svazku (/var/lib/docker/volumes) aby mohl kontrolovat zdroje. Připojuje se k překryvné síti, kterou bude sdílet například s Traefikem traefik_publicHlavní službu Portainer lze nakonfigurovat pro komunikaci s agentem přes TCP (tcp://tasks.agent:9001) a ve skutečnosti je v některých příkladech tento příkaz zobrazen pomocí --tlsskipverify komentoval, aby v případě potřeby přeskočil ověření TLS.
Na stejném nebo jiném zásobníku se Traefik spouští s poskytovatelem Dockeru v režimu Swarm (swarmMode = true v TOML nebo ekvivalentní možnost ve flags), přičemž se sledují označené služby. Jeho konfigurace zahrnuje certificatesResolvers.main.acme pro Let's Encrypt, dnsChallenge s dodavatelem jako je 53 Pokud chcete ověřit certifikáty pomocí DNS a blok tls.options kde je například nucen minVersion = "VersionTLS13" pro výchozí profil a je definován explicitní seznam cipherSuites pro profil TLS 1.2.
Portainer's etikety ve Swarmu se řídí stejnou filozofií: traefik.enable=truerouter jako traefik.http.routers.portainer s Host(`portainer.midominio.com`), traefik.http.routers.portainer.entrypoints=https (o websecure (podle názvu) a traefik.http.routers.portainer.tls=true pro povolení TLS na daném routeru. Dále můžete zadat certifikační resolver s traefik.http.routers.portainer.tls.certresolver=main a schéma backendu, pokud služba interně komunikuje přes HTTPS s traefik.http.services.portainer.loadbalancer.server.scheme=https.
V ladicích protokolech Traefik ve Swarmu uvidíte vygenerovanou konfiguraci: routery jako api y portainer, objevené služby (například portainer en http://10.0.1.12:9000 a služba traefik (ukazující na port 8080 dashboardu) a pokud se vyskytne problém se špatně definovanými popisky, zprávy jako "Nelze definovat název služby pro router: příliš mnoho služeb"které obvykle naznačují, že existuje konflikt nebo duplikace služeb spojených s routerem.
Minimální příklad: whoami, trasy a TLS s Traefikem
Než do rovnice zapojíme Portainer, je docela praktické vyzkoušet Traefik s velmi jednoduchým backendem, jako je ten na obrázku. traefik/whoami, který vrací informace o požadavku. To vám pomůže ověřit, zda je Traefik správně nakonfigurován a zda pravidla směrování fungují.
Un docker-compose.yml základní může zahrnovat službu traefik s obrázkem traefik:v3.4, připojení Docker socketu a definování bootovacích příznaků jako --providers.docker=true, --providers.docker.exposedbydefault=false, --providers.docker.network=proxy a vstupní bod --entryPoints.web.address=:80Na hostiteli jsou inzerovány porty 80 a 8080 a je vytvořena síť. proxy který bude také používat kontejner whoami.
Služby whoami Začíná ve stejné síti a je označeno traefik.enable=truePak je router definován s označením traefik.http.routers.whoami.rule=Host(`whoami.docker.localhost`) a je uvedeno, že váš vstupní bod je webPokud podáte žádost s curl -H "Host: whoami.docker.localhost" http://localhost/Zobrazí se odpověď s názvem hostitele, IP adresami, hlavičkami atd., což potvrzuje, že Traefik správně směruje.
Odtud je to jednoduché přidat směrování podle cestMůžete například vytvořit další službu. whoami-api se stejným obrázkem, ve stejné síti a označit jej pravidlem typu Host(`whoami.docker.localhost`) && PathPrefix(`/api`)Kořen tedy / jít do whoami originál a žádosti o /api jim bude sloužit whoami-apiMůžete si to ověřit zasláním požadavků na / před /api se stejným hostitelem.
Chcete-li aktivovat TLS V tomto lokálním prostředí je jednou z možností vygenerovat pro doménu certifikát s vlastním podpisem. *.docker.localhost s opensslVytvoříte adresář certs, generujete local.key y local.crta poté přidáte dynamický soubor (například dynamic/tls.yml) se sekcí tls: a trasy certFile y keyFile ukazující na ty soubory.
Dále aktualizujete definici služby Traefik v docker-compose.yml připojit složku ./certs a složku ./dynamic uvnitř kontejneru aktivujete zabezpečené API pomocí --api.dashboard=true, vytvoříte vstupní bod websecure (--entryPoints.websecure.address=:443) a povolte tam TLS pomocí --entryPoints.websecure.http.tls=trueTaké označíte router na dashboardu a routery whoami aby je mohli používat websecure a mít tls=true.
Jakmile to bude hotové, budete mít přístup https://whoami.docker.localhost/ a na panel Traefik s certifikátem podepsaným držitelem, čímž se přijme bezpečnostní varování prohlížeče. Tato zkušenost je velmi podobná té, kterou později budete mít v produkčním prostředí s Let's Encrypt, ale bez spoléhání se na veřejné DNS servery.
Nejlepší postupy, nasazení aplikací a řešení typických problémů
Jeden vzorec, který se opakuje ve všech těchto příkladech, je, že Traefik výrazně zjednodušuje nasazení nových aplikacíJakmile máte základní sadu (Traefik + Portainer + síť) proxy (+ certifikáty), přidání nové služby se obvykle omezuje na:
Naklonujte projekt nebo zkopírujte svůj docker-compose.yml k serveru, nasměrujte subdoménu na IP adresu hostitele pomocí záznam A ve vašem DNS (například app.tudominio.com) a poté přidejte ke službě klíčové popisky: traefik.enable=true, traefik.docker.network=proxy a router s pravidlem hostitele pro danou subdoménu, které určuje zabezpečený vstupní bod websecure a služba se správným interním portem.
Mnoho tutoriálů by například ukázalo nasazení malé aplikace. FastAPI Oddělené: jsou přidány čtyři štítky, které zajišťují připojení k síti proxy v sekci networks del docker-compose.ymla poté, co to udělal docker compose up -d Aplikace se automaticky zobrazí na řídicím panelu Traefik s povoleným TLS. Automatické vyhledávání Traefiku znamená, že ani nemusíte upravovat jeho statická nastavení.
Aby vše proběhlo hladce, je důležité věnovat pozornost několika detailům: Nepoužívejte opakovaně stejný identifikátor routeru. V různých aplikacích zkontrolujte, zda je ke každému routeru přiřazena pouze jedna služba (abyste se vyhnuli chybě „příliš mnoho služeb“), používejte konzistentní názvy sítí (například proxy na všech hromádkách, které chcete zveřejnit), a pokud používáte Let's Encrypt, ujistěte se, že acme.json Má oprávnění 600 a nakonfigurovaný e-mail je platný.
V prostředích Swarm také zkontrolujte, zda konfigurace Traefiku zahrnuje poskytovatele Docker. swarmMode=true y watch=truea že omezení služeb (například node.role == manager (pro Portainer) nekolidují s místem, kde je nasazen Traefik. Ladicí protokoly jsou velmi podrobné, ale jsou klíčové pro lokalizaci problémů se směrováním nebo TLS.
Kombinací Dockeru, Traefiku a Portaineru můžete na jednom serveru nastavit kompletní a lehké orchestrační prostředí s grafickými dashboardy, automatickými certifikáty a velmi rychlým procesem nasazení, kde se přidávání, aktualizace nebo odebírání služeb redukuje na úpravu několika řádků YAML a nechává Traefik dělat špinavou práci reverzního proxyingu a TLS.
