- Traefik toimii dynaamisena käänteisenä välityspalvelimena ja ratkaisee TLS-varmenteet, kun taas Portainer tarjoaa graafisen käyttöliittymän Dockerin ja Swarmin hallintaan.
- traefik.yml-, dynamic.yml- ja docker-compose.yml-tiedostojen yhdistelmä mahdollistaa sisäänpääsypisteiden, tietoturvaohjelmistojen ja tunnistepohjaisen HTTP/HTTPS-reitityksen määrittämisen.
- Dockerin erilliskäyttötilanteissa tai Swarmissa voit yksinkertaisesti liittää palvelut välityspalvelinverkkoon ja merkitä ne, jotta Traefik voi löytää ja paljastaa ne turvallisesti.
- Let's Encryptin, dedikoitujen verkkojen ja perustunnistuksen käyttö kojelaudassa yhdistää vankan ympäristön useiden sovellusten käyttöönottoon yhdellä palvelimella.
Nykyaikaisen pinon asentaminen Dockerin, Traefik ja Portainer avulla on tällä hetkellä yksi helpoimmista tavoista hallita säilöjä yhdellä palvelimella ja paljastaa useita palveluita HTTPS:n kautta ilman, että tarvitsee jumiutua konfigurointiin. Sen kauneus piilee siinä, että Traefik toimii dynaamisena käänteisenä välityspalvelimena, kun taas Portainer tarjoaa erittäin yksinkertaisen web-käyttöliittymän Dockerin ja halutessasi myös Swarmin hallintaan.
Tässä artikkelissa näet, miten Traefikin sovittaminen käänteiseksi sijaispalvelimeksi Portainerin eteen Sekä "klassisessa" Docker-skenaariossa (erillisversio) että Docker Swarm -klusterissa, miten TLS (itse allekirjoitettu tai Let's Encrypt) integroidaan ja mitä määritystiedostoja käytetään (traefik.yml, dynamic.yml y docker-compose.yml) ja joitakin yleisiä temppuja väliohjelmistojen, verkkojen ja tyypillisten tagiongelmien kanssa Traefikissä.
Mitä rooleja Dockerilla, Traefikilla ja Portainerilla on arkkitehtuurissa?
Tällaisessa kokoonpanossa Docker on pohjakerros, jossa kontit suoritetaan, Traefik toimii käänteisenä välityspalvelimena ja kuormituksen tasaajana , joka vastaanottaa kaikki HTTP/HTTPS-pyynnöt porteissa 80 ja 443 ja lähettää ne asianmukaiseen konttiin, ja Portainer tarjoaa graafisen käyttöliittymän kuvien, konttien, levyasemien, verkkojen ja Docker- tai Swarm-pinojen hallintaan.
Ajatuksena on käyttää yhtä Docker-isäntää, jossa Traefik sijaitsee "portilla"kuuntele sisäänkäyntipisteissä web (80) y websecure (443), ratkaisee TLS-varmenteet (yleensä Let's Encryptin avulla) ja Docker-palveluntarjoajan integroinnin ansiosta tunnistaa automaattisesti paljastamasi palvelut lisäämällä säilöihin tunnisteita.
Toisaalta Portainer toimii kuin vain yksi säiliö muiden joukossa, mutta paljaana tietty aliverkkotunnus, esimerkiksi portainer.tudominio.com, TLS-salauksella suojattuna ja haluttaessa Portainerin oman kirjautumisen lisäksi käytettävän lisätodennusväliohjelmiston takana. Kaikki tämä on järjestetty docker-compose joka määrittelee Traefik, Portainerin ja yleisen tyyppiverkoston proxy.
Tämän lähestymistavan selkeä etu on, että voit ottaa käyttöön uusia palveluita yksinkertaisesti lisäämällä tunnisteita kontteihisi: Traefik havaitsee Dockerin muutokset, luo reitittimet, palvelut ja väliohjelmistot lennossa, ja muutamassa sekunnissa sinulla on uusi aliverkkotunnus tai reitti toiminnassa ilman, että sinun tarvitsee koskea manuaalisesti staattisiin määritystiedostoihin.
Traefik-staattinen konfigurointi: traefik.yml
Traefik'in staattinen kokoonpano tallennetaan yleensä tiedostoon, kuten traefik.ymljoka on asennettu säiliön sisään. Tässä se on määritelty kojelauta, aloituspisteet, palveluntarjoajat ja varmenteiden ratkaisija Käydään läpi muun muassa salaus.
Tyypillinen YAML-konfiguraatio alkaa aktivoimalla API ja ohjauspaneeli esimerkiksi näin: api: dashboard: trueTämä mahdollistaa pääsyn verkkokäyttöliittymään, jossa voit tarkastella reitittimiä, palveluita ja väliohjelmistoja. Tätä paneelia ei oletusarvoisesti todennettu, joten katsomme myöhemmin, miten se suojataan perus-todennuksella dynaamisesta määrityksestä.
Seuraavaksi määritellään lähtöpisteet. Normaalisti niitä on sisäänkäyntipiste web satamassa 80 ja muut websecure 443: ssä. Vuonna web Automaattinen uudelleenohjaus on yleensä määritetty niin, että websecureniin että kaikki HTTP-yhteydet ohjataan HTTPS-protokollaan:
Tyypillinen luonnos sisältäisi osion http.redirections.entryPoint.to: websecure pakottaakseen uudelleenohjauksen ja keskittääkseen kaiken salatun liikenteen suojattuun sisääntulopisteeseen.
että websecure On ilmoitettu, että TLS:ää tulisi käyttää, ja linkki siihen on annettu. sertifikaatinratkaisija (esimerkiksi letsencrypt), joka vastaa varmenteiden automaattisesta hallinnasta. Kaikkea tätä tukee ACME, joka on Let's Encryptin käyttämä protokolla varmenteiden myöntämiseen ja uusimiseen.
Lohkossa tarjoajat Docker-palveluntarjoaja on konfiguroitu ja osoittaa sokettiin unix:///var/run/docker.sockyhdellä avainvaihtoehdolla: exposedByDefault: falseTämän ansiosta Traefik ei julkaise oletuksena kaikkia säilöjä, vaan vain niitä, joissa on tunniste. traefik.enable=trueVoit myös määrittää tiedostopalvelun (file) ladataksesi lisädynaamisen kokoonpanon esimerkiksi osoitteesta /configurations/dynamic.yml.
Lopuksi staattinen tiedosto sisältää yleensä osan certificatesResolversjossa ACME-ratkaisija on määritelty: rekisteröintisähköposti, tallennustiedosto (yleensä acme.json), avaimen tyyppi (esimerkiksi EC384) ja validointimenetelmä (esimerkiksi httpChallenge sisäänkäyntikohdassa webOn tärkeää, että luo oikea sähköposti tässä osiossa, koska Let's Encrypt käyttää sitä ilmoituksiin ja uusimisiin. Jos jätät tyhjän tai väärin muotoillun arvon, saatat kohdata virheitä Traefik-säilön käynnistyksessä.
Tämän YAML-kokoonpanon lisäksi on olemassa käyttöönottoja, jotka käyttävät TOML-muoto (traefik.toml)Mutta logiikka on sama: ne osioivat ratkaisijan varmenteita (esimerkiksi [certificatesResolvers.main.acme]), määrittelevät haasteet (kuten dnsChallenge kanssa provider = "route53") ja lisää oletusarvoiset TLS-asetukset, kuten forzar minVersion = "VersionTLS13" tai määritä luettelo cipherSuites sallittu.
Dynaaminen konfigurointi: väliohjelmisto, TLS ja tietoturva
Traefik-ohjelman dynaaminen osa sijoitetaan yleensä tiedostoon, kuten dynamic.yml, tiedoston tarjoajan lataama. Tässä määrität väliohjelmistot ja TLS-asetukset jota voidaan muokata käynnistämättä Traefik-säiliötä uudelleen, mikä on erittäin hyödyllistä tietoturvan säätämisessä lennossa.
Tyypillinen tapaus on esimerkiksi otsikkoväliohjelmiston luominen secureHeadersjoka lisää HSTS:ään liittyviä käytäntöjä ja pakollisen HTTPS:n käytön. YAML:ssä saatat löytää parametreja, kuten sslRedirect: true, forceSTSHeader: true, stsIncludeSubdomains: true, stsPreload: true ja stsSeconds korkea (esimerkiksi vuosi sekunneissa). Tämä vahvistaa liikenteen turvallisuutta selaimen puolelta.
Toinen yleinen väliohjelmisto on esimerkiksi perustunnistukseen tarkoitettu user-auth tyyppiä basicAuth, jossa käyttäjäluettelo on ilmoitettu muodossa usuario:hashTiiviste generoidaan yleensä htpasswd ja se on upotettu tiedostoon. Tämä väliohjelmisto on yleensä liitetty Traefik-kojelaudan reitittimeen, joten se vaatii HTTPS-yhteyden lisäksi käyttäjätunnuksen ja salasanan.
Saman dynaamisen konfiguraation sisällä on yleistä nähdä lohko tls.options oletusprofiililla (default), jossa tuetut salausmenetelmät ja TLS:n vähimmäisversio on asetettu, esimerkiksi VersionTLS12Joissakin käyttöönottoissa on määritelty useita asetuksia (esimerkiksi profiili nimeltä tls12 ja muut default) mukauttaakseen suojaustasoa eri palveluihin tarvittaessa.
Ympäristöissä, joissa halutaan käyttää TLS myös sisäisesti Traefikin ja taustapalveluiden (kuten Portainerin) välillä voi ilmetä ongelma, jos näillä palveluilla ei ole julkisen varmenteen myöntäjän tunnustamaa varmennetta. Tässä kohtaa tämä vaihtoehto tulee esiin. insecureSkipVerify, joka on konfiguroitu kohdassa providers.http.tls tai asianmukaisissa TLS-asetuksissa se sallii Traefikille taustajärjestelmän varmenteiden validoinnin ohittamisen. Tämä on hyödyllistä laboratorioympäristöissä tai sisäisissä itse allekirjoitetuissa varmenteissa, mutta sitä tulisi käyttää varoen, koska se lieventää varmennusta.
Käytännön yksityiskohta: tiedosto dynamic.yml Sitä voi muokata lennossa.Traefik lataa dynaamisen kokoonpanon uudelleen ilman uudelleenkäynnistystä, joten voit lisätä tai poistaa väliohjelmistoja, muuttaa suojausotsikoita tai muokata perustodennusta vaikuttamatta välityspalvelimen saatavuuteen.
docker-compose Traefikilla ja Portainerilla Dockerin erillisessä versiossa
Paljaassa Docker-skenaariossa ilman Swarmia yleisin tehtävä on käynnistää Traefik ja Portainer yhdellä docker-compose.yml joka määrittelee sekä palvelut että jaetun siltatyyppisen verkon, jota kutsutaan esimerkiksi proxy.
Palvelu Traefik Yleensä käytetään virallista kuvaa, esim. traefik:latest tai jokin tietty versio, kuten traefik:v3.4Portit on kartoitettu. 80 ja 443 verkkoliikenteelle ja joissakin esimerkeissä portti 8080 ohjauspaneelin sisäistä käyttöä varten. Lisäksi vaihtoehto on lisätty restart: unless-stopped ja turvallisuutta vahvistetaan security_opt: - no-new-privileges:true vähentääkseen käyttöoikeuksien eskaloitumisen riskiä säilön sisällä.
Mitä tulee levyasemiin, Traefik tarvitsee liittää vain luku -tilassa olevan Docker-socketin (/var/run/docker.sock:/var/run/docker.sock:ro) löytääkseen säilöt, staattisen tiedoston traefik.yml ja hakemisto, johon dynaaminen kokoonpano tallennetaan (./traefik-data/configurations:/configurationsTiedosto on myös liitetty. acme.jsonTähän Traefik tallentaa Let's Encryptin myöntämät varmenteet. Tämä tiedosto luodaan isännälle ja sille annetaan käyttöoikeudet. 600 jotta vain oikea käyttäjä voi lukea ja kirjoittaa sen; jos jätät sen arvoon 644, Traefik yleensä valittaa.
Avain Traefikin taikojen toteuttamiseen on huoltotarratLöydät muun muassa: traefik.enable=true (jotta Docker-palveluntarjoaja paljastaa tämän palvelun), traefik.docker.network=proxy (osoittaa, mitä verkkoa Traefik käyttää kommunikoidakseen säilön kanssa) ja reitittimen, kuten traefik.http.routers.traefik-secure, ja sen aloituskohdan määrittävät merkinnät (websecure), isäntäsääntö (esimerkiksi Host(`traefik.tudominio.com`)), siihen liittyvä palvelu (api@internal) ja todennusväliohjelmisto (user-auth@file).
Palvelun Portiner samassa docker-compose.yml yleensä käyttää portainer/portainer-ce:latest (tai Enterprise-versio, jos sinulla on lisenssi). Samanlaisia taltioita liitetään: Docker-socket, datakansio (./portainer-data:/data) ja usein myös /etc/localtime niin että se perii isännän aikavyöhykkeen.
Portainerin etiketit rekisteröivät sen Traefikilla: traefik.enable=true, traefik.docker.network=proxytyyppinen reititin traefik.http.routers.portainer-secure aloituspisteellä websecure ja isäntäsääntö, kuten Host(`portainer.tudominio.com`)Lisäksi määritellään Traefik-palvelun käyttämä palvelu, joka osoittaa Portainerin sisäiseen porttiin, esimerkiksi seuraavasti: traefik.http.services.portainer.loadbalancer.server.port=9000.
Kaiken tämän ollessa käynnissä, lanseerauksen jälkeen docker compose up -d Traefik lataa kuvat pinohakemistoon ja luo verkon. proxy Jos se on ilmoitettu ulkoiseksi ja näyttää molemmat paneelit määritetyissä aliverkkotunnuksissa, Automaattinen HTTPS Let's Encryptin ansiostaSiitä eteenpäin uusien palveluiden lisääminen on projektin kloonaamista, muutaman Traefik-tunnisteen lisäämistä ja sen yhdistämistä verkkoon. proxy.
Docker Swarm -skenaario: Portainer ja Traefik klusterissa
Kun aktivoit Docker Swarmin, asiat muuttuvat hieman, koska palvelut otetaan käyttöön pinoina ja verkot ovat tyypillisesti päällekkäisrakenteisia. Traefikilla ja Portainerilla on kuitenkin hyvin samanlainen peruslogiikka: Traefik toimii edelleen käänteisenä välityspalvelimena ja dynaamisena palvelun etsintäpalvelimena, ja Portainer voi toimia sekä itsenäisessä tilassa että Portainer + agentti -tilassa hallitakseen klusterin etäsolmuja.
Tyypillisessä Swarm-käyttöönotossa pino luodaan ennen sen käyttöönottoa. kaksi päällekkäistä verkkoa jota Traefik käyttää liikenteen reitittämiseen solmujen välillä. Lisäksi luodaan taltio Portainer-datan säilyttämistä varten (esimerkiksi) portainer_data) ja jos tarvitset sitä, yksi acme.json tai hakemisto, johon Traefik tallentaa varmenteet ja kokoonpanon.
El docker-compose.yml (joka sitten avautuu docker stack deploy käyttämällä esimerkiksi -c portainer.yml) määrittelee yleensä kaksi palvelua: Kuljetusagentti, joka toimii tilassa global kaikissa Linux-solmuissa ja pääasiallisessa Portainer-palvelussa (CE tai EE), joka normaalisti pysyy replikoidussa tilassa ja jonka on rajoitus toimia vain hallintajärjestelmissä.
Portainer-agentti liittää Docker-socketin ja taltiohakemiston (/var/lib/docker/volumes) voidakseen tarkastaa resursseja. Se muodostaa yhteyden päällekkäisverkkoon, jonka se jakaa Traefik-palvelun kanssa, esimerkiksi traefik_publicPortainer-pääpalvelu voidaan konfiguroida kommunikoimaan agentin kanssa TCP:n kautta (tcp://tasks.agent:9001) ja itse asiassa joissakin esimerkeissä kyseinen komento näytetään muodossa --tlsskipverify kommentoi ohittaakseen TLS-vahvistuksen tarvittaessa.
Samassa tai toisessa pinossa Traefik käynnistyy Docker-palveluntarjoajan kanssa Swarm-tilassa (swarmMode = true TOML:ssä tai vastaavassa vaihtoehdossa lipuissa), tarkkailemalla merkittyjä palveluita. Sen kokoonpano sisältää certificatesResolvers.main.acme Let's Encryptille dnsChallenge toimittajan kanssa, kuten Route53 Jos haluat validoida varmenteet DNS:n avulla ja lohkon tls.options jossa se pakotetaan esimerkiksi minVersion = "VersionTLS13" oletusprofiilille ja eksplisiittinen luettelo on määritelty cipherSuites TLS 1.2 -profiilille.
Portainerin levy-yhtiöt Swarmilla noudattavat samaa filosofiaa: traefik.enable=truereititin, kuten traefik.http.routers.portainer kanssa Host(`portainer.midominio.com`), traefik.http.routers.portainer.entrypoints=https (o websecure (nimen mukaan) ja traefik.http.routers.portainer.tls=true ottaaksesi TLS:n käyttöön kyseisessä reitittimessä. Lisäksi voit määrittää certresolver kanssa traefik.http.routers.portainer.tls.certresolver=main ja taustajärjestelmän kaava, jos palvelu puhuu sisäisesti HTTPS:ää traefik.http.services.portainer.loadbalancer.server.scheme=https.
Swarmin Traefik-virheenkorjauslokeissa näet luodun kokoonpanon: reitittimet, kuten api y portainer, löydetyt palvelut (esimerkiksi portainer en http://10.0.1.12:9000 ja palvelu traefik (osoittaa kojelaudan porttiin 8080), ja jos huonosti määritellyissä otsikoissa on ongelma, viestit, kuten "Reitittimen palvelun nimeä ei voitu määrittää: liikaa palveluita"jotka yleensä osoittavat, että reitittimeen liittyy palveluiden ristiriita tai päällekkäisyys.
Minimalistinen esimerkki: whoami, reitit ja TLS Traefikilla
Ennen kuin Portaineria käytetään mukaan yhtälöön, on varsin käytännöllistä kokeilla Traefikiä hyvin yksinkertaisella taustajärjestelmällä, kuten kuvalla. traefik/whoamijoka palauttaa tietoja pyynnöstä. Tämä auttaa sinua varmistamaan, että Traefik on määritetty oikein ja että reitityssäännöt toimivat.
Un docker-compose.yml peruspalvelu voi sisältää traefik kuvan kanssa traefik:v3.4, Docker-pistorasian liittäminen ja käynnistyslippujen määrittäminen seuraavasti --providers.docker=true, --providers.docker.exposedbydefault=false, --providers.docker.network=proxy ja sisäänkäyntipiste --entryPoints.web.address=:80Portit 80 ja 8080 mainostetaan isännässä ja verkko luodaan. proxy joka myös käyttää säiliötä whoami.
Palvelu whoami Se alkaa samasta verkosta ja on merkitty symbolilla traefik.enable=trueSitten reititin määritellään nimellä traefik.http.routers.whoami.rule=Host(`whoami.docker.localhost`) ja on osoitettu, että aloituspisteesi on webJos teet pyynnön curl -H "Host: whoami.docker.localhost" http://localhost/Näet vastauksen, jossa on isäntänimi, IP-osoitteet, otsikot ja niin edelleen, mikä vahvistaa, että Traefik reitittää oikein.
Sieltä se on yksinkertaista. lisää reititys polkujen mukaanVoit esimerkiksi luoda toisen palvelun. whoami-api samalla kuvalla, samassa verkossa ja merkitse se tyypillä olevalla säännöllä Host(`whoami.docker.localhost`) && PathPrefix(`/api`)Näin ollen juuri / mene whoami alkuperäinen ja pyynnöt /api palvelee heitä whoami-apiVoit varmistaa tämän lähettämällä pyyntöjä / ya /api saman isännän kanssa.
Aktivoida TLS Tässä paikallisessa ympäristössä yksi vaihtoehto on luoda itse allekirjoitettu varmenne verkkotunnukselle. *.docker.localhost kanssa opensslLuot hakemiston certs, luot local.key y local.crtja sitten lisäät dynaamisen tiedoston (esimerkiksi dynamic/tls.yml) osion kanssa tls: ja reitit certFile y keyFile osoittaen noihin tiedostoihin.
Seuraavaksi päivität Traefik-palvelun määritelmän kohdassa docker-compose.yml kansion liittämiseksi ./certs ja kansio ./dynamic säilön sisällä aktivoit suojatun API:n --api.dashboard=true, luot aloituspisteen websecure (--entryPoints.websecure.address=:443) ja ota TLS käyttöön siellä --entryPoints.websecure.http.tls=trueMerkitset myös kojelaudan reitittimen ja reitittimet whoami heidän käytettäväksi websecure ja on tls=true.
Kun se on valmis, voit käyttää https://whoami.docker.localhost/ ja Traefik-paneeliin itse allekirjoitetulla varmenteella, joka hyväksyy selaimen tietoturvavaroituksen. Tämä kokemus on hyvin samanlainen kuin mitä sinulla on myöhemmin Let's Encryptin tuotannossa, mutta ilman julkisia DNS-palvelimia.
Parhaat käytännöt, sovellusten käyttöönotto ja tyypillisten ongelmien ratkaiseminen
Yksi kaava, joka toistuu kaikissa näissä esimerkeissä, on se, että Traefik yksinkertaistaa huomattavasti uusien sovellusten käyttöönottoaKun sinulla on peruspino (Traefik + Portainer + verkosto) proxy (+ varmenteet), uuden palvelun lisääminen yleensä tiivistyy seuraavasti:
Kloonaa projekti tai kopioi oma docker-compose.yml palvelimelle, ohjaa aliverkkotunnus isännän IP-osoitteeseen käyttämällä tietue A DNS-palvelimellasi (esimerkiksi app.tudominio.com) ja lisää sitten avainten otsikot palveluun: traefik.enable=true, traefik.docker.network=proxy ja reititin, jolla on isäntäsääntö kyseiselle aliverkkotunnukselle ja joka määrittää suojatun sisäänpääsypisteen websecure ja palvelu oikealla sisäisellä portilla.
Monissa tutoriaaleissa näytettäisiin esimerkiksi pienen sovelluksen käyttöönotto FastAPI Erillään: neljä tunnistetta lisätään varmistaen, että se liittyy verkkoon proxy osiossa networks ja docker-compose.ymlja tehtyään docker compose up -d Sovellus näkyy automaattisesti Traefik-hallintapaneelissa TLS käytössä. Traefikin automaattisen tunnistuksen ansiosta sinun ei tarvitse edes muuttaa sen staattisia asetuksia.
Jotta kaikki sujuisi ongelmitta, on tärkeää kiinnittää huomiota muutamiin yksityiskohtiin: Älä käytä samaa reitittimen tunnusta uudelleen Tarkista eri sovelluksissa, että kuhunkin reitittimeen on liitetty vain yksi palvelu (välttäen "liian monta palvelua" -virhettä) ja käytä yhdenmukaisia verkkonimiä (esimerkiksi proxy kaikissa pinoissa, jotka haluat paljastaa), ja jos käytät Let's Encryptiä, varmista, että acme.json Sillä on käyttöoikeudet 600 ja määritetty sähköpostiosoite on kelvollinen.
Swarm-ympäristöissä tarkista myös, että Traefik-kokoonpano sisältää Docker-toimittajan. swarmMode=true y watch=trueja että palvelujen rajoitukset (esim. node.role == manager (Portainerille) eivät ole ristiriidassa Traefik-asennuspaikan kanssa. Virheenjäljityslokit ovat hyvin yksityiskohtaisia, mutta ne ovat avainasemassa reititys- tai TLS-ongelmien paikantamisessa.
Yhdistämällä Dockerin, Traefikin ja Portainerin voit perustaa täydellisen kevyen orkestrointiympäristön yhdelle palvelimelle, jossa on graafiset kojelaudat, automaattiset sertifikaatit ja erittäin nopea käyttöönottoprosessi. Palveluiden lisääminen, päivittäminen tai poistaminen supistuu muutaman YAML-rivin säätämiseen ja Traefikin antamiseen tehdä käänteisen välityspalvelimen ja TLS:n likainen työ.
