Hoe integreer je Docker, Traefik en Portainer tot een complete stack?

Laatste update: 7 maart 2026
  • Traefik fungeert als een dynamische reverse proxy en lost TLS-certificaten op, terwijl Portainer een grafische interface biedt voor het beheren van Docker en Swarm.
  • De combinatie van traefik.yml, dynamic.yml en docker-compose.yml stelt je in staat om entrypoints, security middleware en label-gebaseerde HTTP/HTTPS-routing te definiëren.
  • In Docker standalone- of Swarm-scenario's hoeft u alleen services aan het proxynetwerk toe te voegen en ze te taggen, zodat Traefik ze veilig kan vinden en beschikbaar maken.
  • Het gebruik van Let's Encrypt, dedicated netwerken en basisauthenticatie op het dashboard zorgt voor een robuuste omgeving voor het implementeren van meerdere applicaties op één server.

Docker Portainer Traefik

Het opzetten van een moderne stack met Docker, Traefik en Portainer is momenteel een van de eenvoudigste manieren om containers op één server te beheren en meerdere services via HTTPS beschikbaar te stellen zonder te verzanden in configuratie. Het mooie ervan is dat Traefik fungeert als een dynamische reverse proxy, terwijl Portainer een zeer eenvoudige webinterface biedt voor het beheren van Docker en, indien gewenst, ook Swarm.

In dit artikel leest u hoe Traefik configureren als reverse proxy voor Portainer Zowel in een "klassiek" Docker-scenario (standalone) als in een Docker Swarm-cluster, hoe integreer je TLS (zelfondertekend of Let's Encrypt) en welke configuratiebestanden spelen daarbij een rol?traefik.yml, dynamic.yml y docker-compose.yml) en enkele veelvoorkomende trucs met middleware, netwerken en typische tagproblemen in Traefik.

Welke rol spelen Docker, Traefik en Portainer in de architectuur?

In dit type configuratie vormt Docker de basislaag waarop de containers draaien, fungeert Traefik als reverse proxy en load balancer die alle HTTP/HTTPS-verzoeken op poorten 80 en 443 ontvangt en doorstuurt naar de juiste container, en biedt Portainer een grafische interface voor het beheren van images, containers, volumes, netwerken en Docker- of Swarm-stacks.

Het idee is om één host met Docker te hebben, waar Traefik bevindt zich bij de "toegangspoort".: luister bij de ingangspunten web (80) y websecure (443) lost TLS-certificaten op (meestal met Let's Encrypt) en ontdekt, dankzij de integratie met de Docker-provider, automatisch de services die u beschikbaar stelt door labels aan de containers toe te voegen.

Aan de andere kant werkt Portainer als een gewone container, maar dan met een zichtbaar oppervlak. een specifiek subdomein, bijvoorbeeld portainer.tudominio.com, beschermd door TLS en, indien gewenst, achter een extra authenticatiemiddleware naast de eigen login van Portainer. Dit alles wordt georkestreerd met een havenarbeider-compose dat Traefik, Portainer en het gemeenschappelijke netwerk van het type definieert proxy.

Een duidelijk voordeel van deze aanpak is dat je nieuwe services eenvoudig kunt implementeren door labels aan je containers toe te voegen: Traefik detecteert de wijziging in Docker, maakt routers, services en middleware direct aan, en binnen enkele seconden heb je een nieuw subdomein of een nieuwe route operationeel zonder handmatig statische configuratiebestanden aan te passen.

Statische Traefik-configuratie: traefik.yml

De statische configuratie van Traefik wordt meestal opgeslagen in een bestand zoals traefik.ymldie in de container is gemonteerd. Hier wordt het gedefinieerd. dashboard, toegangspunten, providers en certificaatresolver Let's Encrypt, onder andere.

Een typische YAML-configuratie begint met het activeren van de API en het configuratiescherm met iets als: api: dashboard: trueDit geeft toegang tot de webinterface waar u routers, services en middleware kunt bekijken. Dit paneel is standaard niet beveiligd met authenticatie, dus we zullen later zien hoe u het kunt beveiligen met basisauthenticatie via de dynamische configuratie.

Vervolgens worden de toegangspunten gedefinieerd. Normaal gesproken zijn er een toegangspunt web bij haven 80 en nog een websecure in de 443. In de web Een automatische omleiding is meestal geconfigureerd om websecurezodat alle HTTP-toegang wordt omgeleid naar HTTPS:

Een typisch schema zou een sectie bevatten http.redirections.entryPoint.to: websecure om die omleiding af te dwingen en al het versleutelde verkeer te centraliseren bij het beveiligde toegangspunt.

naar websecure Er wordt aangegeven dat TLS gebruikt moet worden en er wordt een link verstrekt. certResolver (bijvoorbeeld letsencrypt) die verantwoordelijk zal zijn voor het automatisch beheren van de certificaten. Dit alles wordt ondersteund door ACME, wat het protocol is dat Let's Encrypt gebruikt om certificaten uit te geven en te vernieuwen.

In het blok providers De Docker-provider is geconfigureerd en verwijst naar de socket. unix:///var/run/docker.sockmet één belangrijke optie: exposedByDefault: falseHierdoor publiceert Traefik niet standaard alle containers; alleen die containers die het label dragen. traefik.enable=trueU kunt ook een bestandsprovider configureren (file) om een ​​extra dynamische configuratie te laden vanuit bijvoorbeeld /configurations/dynamic.yml.

Tot slot bevat het statische bestand meestal de sectie certificatesResolverswaar de ACME-resolver is gedefinieerd: registratie-e-mailadres, opslagbestand (meestal acme.json), sleuteltype (bijvoorbeeld EC384) en de validatiemethode (bijvoorbeeld httpChallenge op het toegangspunt webHet is belangrijk dat een echt e-mailadres aanmaken In dit gedeelte wordt deze waarde gebruikt door Let's Encrypt voor meldingen en verlengingen; als u een lege of onjuiste waarde achterlaat, kunt u fouten tegenkomen bij het starten van de Traefik-container.

  Wat is Apache: de onzichtbare motor die het web aandrijft

Naast deze YAML-configuratie zijn er implementaties die gebruikmaken van TOML-formaat (traefik.toml)Maar de logica blijft hetzelfde: ze gebruiken sectie-resolvercertificaten (bijvoorbeeld [certificatesResolvers.main.acme]), uitdagingen definiëren (zoals dnsChallenge met provider = "route53") en voeg standaard TLS-opties toe, zoals forzar minVersion = "VersionTLS13" of configureer een lijst van cipherSuites toegestaan.

Docker-architectuur Traefik Portainer

Dynamische configuratie: middleware, TLS en beveiliging

Het dynamische gedeelte van Traefik wordt meestal in een bestand geplaatst zoals dynamic.yml, geladen door de bestandsaanbieder. Hier definieert u middlewares en TLS-opties Dit kan worden aangepast zonder de Traefik-container opnieuw op te starten, wat erg handig is om de beveiliging tijdens de werking aan te passen.

Een typisch voorbeeld is het creëren van header-middleware. secureHeadersDit voegt beleidsregels toe met betrekking tot HSTS en het verplichte gebruik van HTTPS. In YAML vind je mogelijk parameters zoals: sslRedirect: true, forceSTSHeader: true, stsIncludeSubdomains: true, stsPreload: true en een stsSeconds hoog (bijvoorbeeld een jaar in seconden). Dit versterkt de verkeersbeveiliging aan de browserzijde.

Een andere veelvoorkomende middleware is er een voor basisauthenticatie, bijvoorbeeld. user-auth type basicAuth, waarbij een lijst met gebruikers wordt opgegeven in het formaat usuario:hashDe hash wordt meestal gegenereerd met htpasswd en is ingebed in het bestand. Deze middleware is meestal gekoppeld aan de Traefik dashboard router, waardoor er naast HTTPS-toegang ook een gebruikersnaam en wachtwoord vereist zijn.

Binnen dezelfde dynamische configuratie is het gebruikelijk om een ​​blok te zien. tls.options met een standaardprofiel (default) waar de ondersteunde versleutelingsmethoden en de minimale TLS-versie zijn ingesteld, bijvoorbeeld VersionTLS12In sommige implementaties zijn meerdere opties gedefinieerd (bijvoorbeeld een profiel genaamd...). tls12 en nog een default) om het beveiligingsniveau indien nodig aan te passen aan verschillende diensten.

In omgevingen waar het gewenst is om gebruik te maken van TLS ook intern Tussen Traefik en backend-services (zoals Portainer) kan een probleem ontstaan ​​wanneer die services geen certificaat hebben dat erkend wordt door een openbare CA. Dat is waar deze optie van pas komt. insecureSkipVerify, die geconfigureerd is onder providers.http.tls Of, in de juiste TLS-opties, stelt dit Traefik in staat om de certificaatvalidatie aan de backend te omzeilen. Dit is handig voor testomgevingen of interne zelfondertekende certificaten, maar moet met voorzichtigheid worden gebruikt omdat het de verificatie versoepelt.

Een praktisch detail: het bestand dynamic.yml Het kan direct worden aangepast.Traefik herlaadt de dynamische configuratie zonder dat een herstart nodig is, zodat u middleware kunt toevoegen of verwijderen, beveiligingsheaders kunt wijzigen of basisauthenticatie kunt aanpassen zonder de beschikbaarheid van de proxy te beïnvloeden.

docker-compose met Traefik en Portainer in een zelfstandige Docker-installatie

In een kale Docker-omgeving, zonder Swarm, is het meest gebruikelijke om het volgende te starten: Traefik en Portainer met één docker-compose.yml die zowel diensten als een gedeeld bridge-achtig netwerk definieert, bijvoorbeeld genaamd proxy.

De service Traefik Het maakt doorgaans gebruik van de officiële afbeelding, bijvoorbeeld traefik:latest of een specifieke versie zoals traefik:v3.4De poorten zijn in kaart gebracht. 80 en 443 voor webverkeer en, in sommige gevallen, poort 8080 om het configuratiescherm intern beschikbaar te maken. Daarnaast wordt de optie toegevoegd. restart: unless-stopped en de beveiliging wordt versterkt met security_opt: - no-new-privileges:true om het risico op privilege-escalatie binnen de container te verkleinen.

Wat volumes betreft, moet Traefik de alleen-lezen Docker-socket mounten (/var/run/docker.sock:/var/run/docker.sock:ro) om containers te ontdekken, het statische bestand traefik.yml en de map waarin de dynamische configuratie wordt opgeslagen (./traefik-data/configurations:/configurationsHet bestand is ook gekoppeld. acme.jsonHier slaat Traefik de door Let's Encrypt uitgegeven certificaten op. Dit bestand wordt op de host aangemaakt en voorzien van de juiste machtigingen. 600 zodat alleen de juiste gebruiker het kan lezen en schrijven; als je het op 644 laat staan, geeft Traefik meestal een foutmelding.

De sleutel tot Traefiks magische prestaties is de servicelabelsJe vindt er onder andere: traefik.enable=true (zodat de Docker-provider deze service beschikbaar stelt), traefik.docker.network=proxy (geeft aan welk netwerk Traefik moet gebruiken om met de container te communiceren), en een router zoals traefik.http.routers.traefik-secure, met labels die het toegangspunt definiëren (websecure), de hostregel (bijvoorbeeld Host(`traefik.tudominio.com`)), de bijbehorende dienst (api@internal) en de authenticatiemiddleware (user-auth@file).

  Complete handleiding voor Linux-serveroptimalisatie

de service drager in hetzelfde docker-compose.yml gebruikt over het algemeen portainer/portainer-ce:latest (of de Enterprise-editie als u een licentie hebt). Vergelijkbare volumes worden gekoppeld: de Docker-socket, de datafolder (./portainer-data:/data) en vaak ook de /etc/localtime zodat het de tijdzone van de host overneemt.

De labels van Portainer worden geregistreerd bij Traefik: traefik.enable=true, traefik.docker.network=proxyeen router van het type traefik.http.routers.portainer-secure met ingangspunt websecure en een gastheerregel zoals Host(`portainer.tudominio.com`)Daarnaast wordt de service die Traefik moet gebruiken gedefinieerd, die verwijst naar de interne poort van Portainer, bijvoorbeeld met traefik.http.services.portainer.loadbalancer.server.port=9000.

Nu dit alles gaande is, na de lancering docker compose up -d In de stack-directory downloadt Traefik de images en creëert het netwerk. proxy Als het is gedeclareerd als extern en beide panelen in de geconfigureerde subdomeinen weergeeft, met Automatische HTTPS dankzij Let's Encrypt.Vanaf dat moment is het toevoegen van nieuwe services een kwestie van je project klonen, een paar Traefik-labels toevoegen en het verbinden met het netwerk. proxy.

Docker Swarm-scenario: Portainer en Traefik in een cluster

Wanneer je Docker Swarm activeert, verandert er wel iets, omdat services als stacks worden geïmplementeerd en netwerken doorgaans op overlays gebaseerd zijn. De onderliggende logica van Traefik en Portainer is echter zeer vergelijkbaar: Traefik blijft fungeren als reverse proxy en dynamische service discoverer, en Portainer kan zowel in standalone-modus als in Portainer + agent- modus werken om externe nodes binnen het cluster te beheren.

Bij een typische Swarm-implementatie wordt de stack aangemaakt voordat deze wordt toegepast. twee overlappende netwerken die Traefik zal gebruiken om verkeer tussen knooppunten te routeren. Daarnaast wordt er een volume aangemaakt om Portainer-gegevens (bijvoorbeeld) op te slaan. portainer_data) en, indien nodig, een voor acme.json of de map waar Traefik certificaten en configuratiebestanden opslaat.

El docker-compose.yml (wat zich vervolgens ontvouwt met docker stack deploy bijvoorbeeld door gebruik te maken van -c portainer.yml) definieert doorgaans twee diensten: Portainer-agent, die draait in modus global op alle Linux-nodes, en de belangrijkste Portainer-service (CE of EE), die normaal gesproken in gerepliceerde modus blijft met de beperking dat deze alleen op managers draait.

De Portainer-agent koppelt de Docker-socket en de volumedirectory (/var/lib/docker/volumes) om resources te kunnen inspecteren. Het maakt verbinding met het overlay-netwerk dat het bijvoorbeeld met Traefik zal delen. traefik_publicDe belangrijkste Portainer-service kan worden geconfigureerd om via TCP met de agent te communiceren (tcp://tasks.agent:9001) en in sommige voorbeelden wordt dat commando zelfs weergegeven met --tlsskipverify Er werd opgemerkt dat de TLS-verificatie indien nodig overgeslagen kan worden.

Op dezelfde of een andere stack start Traefik op met de Docker-provider in Swarm-modus (swarmMode = true (in TOML of de equivalente optie in flags), waarbij de getagde services worden geobserveerd. De configuratie omvat een certificatesResolvers.main.acme voor Let's Encrypt, een dnsChallenge met een leverancier zoals Route 53 Als u certificaten wilt valideren via DNS, en een blok van tls.options waar het bijvoorbeeld wordt afgedwongen minVersion = "VersionTLS13" voor het standaardprofiel en er wordt een expliciete lijst gedefinieerd van cipherSuites voor een TLS 1.2-profiel.

De etiketten van Portainer bij Swarm volgen dezelfde filosofie: traefik.enable=trueeen router zoals traefik.http.routers.portainer met Host(`portainer.midominio.com`), traefik.http.routers.portainer.entrypoints=https (o websecure (volgens de naamgeving), en traefik.http.routers.portainer.tls=true om TLS op die router in te schakelen. Daarnaast kunt u het volgende specificeren: certresolver met traefik.http.routers.portainer.tls.certresolver=main en het backend-schema als de service intern HTTPS gebruikt traefik.http.services.portainer.loadbalancer.server.scheme=https.

In de Traefik-debuglogs in Swarm ziet u de gegenereerde configuratie: routers zoals api y portainer, ontdekte services (bijvoorbeeld portainer en http://10.0.1.12:9000 en een dienst traefik (verwijzend naar poort 8080 van het dashboard), en, als er een probleem is met slecht gedefinieerde labels, berichten zoals "De servicenaam voor de router kon niet worden gedefinieerd: er zijn te veel services."Dit duidt er meestal op dat er een conflict of dubbele dienstverlening is gekoppeld aan een router.

Minimaal voorbeeld: whoami, routes en TLS met Traefik

Voordat je Portainer erbij betrekt, is het heel praktisch om Traefik te proberen met een zeer eenvoudige backend, zoals in de afbeelding. traefik/whoamiDit geeft informatie over het verzoek terug. Hiermee kunt u controleren of Traefik correct is geconfigureerd en of de routeringsregels werken.

Un docker-compose.yml De basisdienst kan de volgende diensten omvatten: traefik met de afbeelding traefik:v3.4waarbij de Docker-socket wordt gekoppeld en de opstartvlaggen worden gedefinieerd als --providers.docker=true, --providers.docker.exposedbydefault=false, --providers.docker.network=proxy en het toegangspunt --entryPoints.web.address=:80Poorten 80 en 8080 worden op de host geadverteerd en er wordt een netwerk gecreëerd. proxy die ook de container zal gebruiken whoami.

De service whoami Het begint op hetzelfde netwerk en is gemarkeerd met traefik.enable=trueVervolgens wordt een router gedefinieerd met het label. traefik.http.routers.whoami.rule=Host(`whoami.docker.localhost`) en er wordt aangegeven dat uw toegangspunt is webAls u een verzoek indient met curl -H "Host: whoami.docker.localhost" http://localhost/Je ontvangt een reactie met hostnaam, IP-adressen, headers enzovoort, wat bevestigt dat Traefik correct routeert.

  Fout 404 Niet gevonden: wat het is, wat de oorzaken zijn, wat de impact op uw website is en hoe u het kunt oplossen.

Vanaf daar is het eenvoudig. Voeg routering toe via padenJe kunt bijvoorbeeld een andere dienst aanmaken. whoami-api met dezelfde afbeelding, op hetzelfde netwerk, en tag deze met een regel van het type Host(`whoami.docker.localhost`) && PathPrefix(`/api`)De wortel is dus / ga naar whoami origineel en de verzoeken aan /api zal hen van dienst zijn whoami-apiU kunt dit verifiëren door verzoeken in te dienen bij / reeds /api met dezelfde host.

Activeren TLS In deze lokale omgeving is een van de opties het genereren van een zelfondertekend certificaat voor het domein. *.docker.localhost met opensslJe maakt een map aan. certs, je genereert local.key y local.crt, en vervolgens voeg je een dynamisch bestand toe (bijvoorbeeld dynamic/tls.yml) met de sectie tls: en de routes certFile y keyFile verwijzend naar die bestanden.

Vervolgens werk je de Traefik-servicedefinitie bij in docker-compose.yml om de map te koppelen ./certs en de map ./dynamic Binnen de container activeert u de beveiligde API met --api.dashboard=true, je creëert het toegangspunt websecure (--entryPoints.websecure.address=:443) en schakel daar TLS in met --entryPoints.websecure.http.tls=trueJe labelt ook de dashboardrouter en de routers van whoami zodat zij het kunnen gebruiken websecure en hebben tls=true.

Zodra het online is, heb je toegang tot https://whoami.docker.localhost/ en vervolgens naar het Traefik-paneel met een zelfondertekend certificaat, waarbij de beveiligingswaarschuwing van de browser wordt geaccepteerd. Deze ervaring is vergelijkbaar met wat je later in een productieomgeving met Let's Encrypt zult hebben, maar dan zonder afhankelijk te zijn van openbare DNS-servers.

Best practices, app-implementatie en het oplossen van veelvoorkomende problemen

Een patroon dat in al deze voorbeelden terugkomt, is dat Traefik vereenvoudigt de implementatie van nieuwe applicaties aanzienlijk.Zodra je je basisstack hebt (Traefik + Portainer + netwerk) proxy (+ certificaten), het toevoegen van een nieuwe dienst komt meestal neer op:

Kloon het project of kopieer uw docker-compose.yml naar de server, verwijs een subdomein naar het IP-adres van de host met behulp van een record A in uw DNS (bijvoorbeeld app.tudominio.com), en voeg vervolgens de sleutellabels toe aan de service: traefik.enable=true, traefik.docker.network=proxy en een router met een hostregel voor dat subdomein, waarin het beveiligde toegangspunt is gespecificeerd. websecure en service met de juiste interne poort.

Veel tutorials laten bijvoorbeeld zien hoe je een kleine app implementeert. FastAPI Gescheiden: er worden vier labels toegevoegd, zodat het zich bij het netwerk aansluit. proxy in de sectie networks del docker-compose.ymlen nadat ik dat gedaan heb docker compose up -d De app verschijnt automatisch op het Traefik-dashboard met TLS ingeschakeld. Dankzij de automatische detectie van Traefik hoeft u de statische instellingen niet eens aan te passen.

Om ervoor te zorgen dat alles soepel verloopt, is het belangrijk om op een paar details te letten: Gebruik niet dezelfde router-ID opnieuw. Controleer in verschillende apps of er slechts één service aan elke router is gekoppeld (om de foutmelding "te veel services" te voorkomen) en gebruik consistente netwerknamen (bijvoorbeeld, proxy op alle stacks die je wilt blootstellen), en als je Let's Encrypt gebruikt, zorg er dan voor dat de acme.json Het heeft machtigingen 600 en het geconfigureerde e-mailadres is geldig.

Controleer in Swarm-omgevingen ook of de Traefik-configuratie de Docker-provider bevat. swarmMode=true y watch=trueen dat de beperkingen van de diensten (bijvoorbeeld node.role == manager (Voor Portainer) conflicteren ze niet met de locatie waar Traefik is geïmplementeerd. De debuglogs zijn erg gedetailleerd, maar essentieel voor het opsporen van routerings- of TLS-problemen.

Door Docker, Traefik en Portainer te combineren , kunt u een complete, lichtgewicht orchestratieomgeving op één server opzetten, met grafische dashboards, automatische certificaten en een zeer snelle implementatiestroom. Het toevoegen, bijwerken of verwijderen van services is gereduceerd tot het aanpassen van een paar regels YAML, terwijl Traefik het vuile werk van reverse proxying en TLS voor u doet.