Как да интегрираме Docker, Traefik и Portainer като пълен стек

Последна актуализация: 7 март 2026
Автор: TecnoDigital
  • Traefik действа като динамичен обратен прокси и обработва TLS сертификати, докато Portainer предлага графичен интерфейс за управление на Docker и Swarm.
  • Комбинацията от traefik.yml, dynamic.yml и docker-compose.yml ви позволява да дефинирате входни точки, мидълуер за сигурност и HTTP/HTTPS маршрутизация, базирана на етикети.
  • В самостоятелни сценарии на Docker или Swarm, просто присъединете услугите към прокси мрежата и ги маркирайте, така че Traefik да може да ги открива и излага сигурно.
  • Използването на Let's Encrypt, специализирани мрежи и основно удостоверяване на таблото за управление консолидира стабилна среда за разполагане на множество приложения на един сървър.

Докер Портейнър Траефик

Настройването на модерен стек с Docker, Traefik и Portainer в момента е един от най-лесните начини за управление на контейнери на един сървър и предоставяне на множество услуги с HTTPS, без да се затруднявате с конфигурация. Хубавото е, че Traefik действа като динамичен обратен прокси, докато Portainer предоставя много опростен уеб интерфейс за управление на Docker и, ако желаете, Swarm.

В тази статия ще видите как напасване на Traefik като обратен прокси пред Portainer Както в „класически“ Docker (самостоятелен) сценарий, така и в Docker Swarm клъстер, как да се интегрира TLS (самозаписан или Let's Encrypt) и какви конфигурационни файлове са включени (traefik.yml, dynamic.yml y docker-compose.yml) и някои често срещани трикове с междинен софтуер, мрежи и типични проблеми с маркирането в Traefik.

Какви роли имат Docker, Traefik и Portainer в архитектурата?

В този тип настройка, Docker е базовият слой, където работят контейнерите, Traefik действа като обратен прокси и балансьор на натоварването , който получава всички HTTP/HTTPS заявки на портове 80 и 443 и ги изпраща до съответния контейнер, а Portainer предоставя графичен интерфейс за управление на изображения, контейнери, томове, мрежи и Docker или Swarm стекове.

Идеята е да има един хост с Docker, където Траефик се намира на „портала“слушайте на входните точки web (80) и websecure (443), разрешава TLS сертификати (обикновено с Let's Encrypt) и, благодарение на интеграцията с доставчика на Docker, автоматично открива услугите, които предоставяте, като добавя етикети към контейнерите.

От друга страна, Portainer работи като просто още един контейнер, но е изложен на например специфичен поддомейн portainer.tudominio.com, защитен от TLS и, ако е необходимо, зад допълнителен middleware за удостоверяване, освен собствените данни за вход на Portainer. Всичко това е оркестрирано с докер-ново съобщение която дефинира Traefik, Portainer и общата мрежа от тип proxy.

Ясно предимство на този подход е, че можете да внедрите нови услуги, просто като добавите етикети към вашите контейнери: Traefik открива промяната в Docker, създава рутери, услуги и middleware в движение и за секунди имате нов поддомейн или маршрут, работещ без ръчно да докосвате статични конфигурационни файлове.

Статична конфигурация на Traefik: traefik.yml

Статичната конфигурация на Traefik обикновено се съхранява във файл като traefik.ymlкойто е монтиран вътре в контейнера. Тук е дефиниран табло за управление, входни точки, доставчици и инструмент за разрешаване на сертификати Нека криптираме, наред с други неща.

Типичната YAML конфигурация започва с активиране на API и контролния панел с нещо подобно api: dashboard: trueТова позволява достъп до уеб интерфейса, където можете да видите рутери, услуги и междинен софтуер. Този панел не е удостоверен по подразбиране, така че ще видим по-късно как да го защитим с основно удостоверяване от динамичната конфигурация.

След това се дефинират входните точки. Обикновено има входна точка web на пристанище 80 и други websecure в 443, В web Автоматичното пренасочване обикновено е конфигурирано да websecureтака че всеки HTTP достъп да бъде пренасочен към HTTPS:

Типичният план би включвал раздел http.redirections.entryPoint.to: websecure да се наложи това пренасочване и да се централизира целият криптиран трафик в защитената входна точка.

за websecure Посочено е, че трябва да се използва TLS и е предоставена връзка. certResolver (например letsencrypt), който ще отговаря за автоматичното управление на сертификатите. Всичко това се поддържа от ACME, което е протоколът, който Let's Encrypt използва за издаване и подновяване на сертификати.

В блока доставчици Доставчикът на Docker е конфигуриран, сочейки към сокета unix:///var/run/docker.sockс една ключова опция: exposedByDefault: falseС това Traefik не публикува всички контейнери по подразбиране; само тези, които носят етикета traefik.enable=trueМожете също да конфигурирате доставчик на файлове (file) за зареждане на допълнителна динамична конфигурация от, например, /configurations/dynamic.yml.

Накрая, статичният файл обикновено включва секцията certificatesResolversкъдето е дефиниран ACME резолверът: регистрационен имейл, файл за съхранение (обикновено acme.json), тип ключ (например EC384) и методът за валидиране (например httpChallenge на входната точка webВажно е, че настройте истински имейл в този раздел, защото Let's Encrypt го използва за известия и подновявания; ако оставите фиктивна или неправилно форматирана стойност, може да срещнете грешки при стартиране на контейнера Traefik.

  Какво е Apache: Невидимият двигател, който захранва мрежата

В допълнение към тази YAML конфигурация, има внедрявания, които използват TOML формат (traefik.toml)Но логиката е същата: те разделят сертификатите на резолвера (например [certificatesResolvers.main.acme]), дефинирайте предизвикателства (като например dnsChallenge с provider = "route53") и добавете TLS опции по подразбиране, като например forzar minVersion = "VersionTLS13" или конфигурирайте списък с cipherSuites позволен.

Докер архитектура Traefik Portainer

Динамична конфигурация: мидълуер, TLS и сигурност

Динамичната част на Traefik обикновено се помещава във файл като dynamic.yml, зареден от доставчика на файлове. Тук дефинирате междинни софтуери и TLS опции което може да се променя без рестартиране на контейнера Traefik, което е много полезно за настройване на сигурността в движение.

Типичен случай е създаването на заглавен мидълуер, например secureHeadersкойто добавя правила, свързани с HSTS и задължителното използване на HTTPS. В YAML може да намерите параметри като sslRedirect: true, forceSTSHeader: true, stsIncludeSubdomains: true, stsPreload: true и stsSeconds високо (например, година в секунди). Това засилва сигурността на трафика от страна на браузъра.

Друг често срещан междинен софтуер е например такъв за основно удостоверяване user-auth от тип basicAuth, където е деклариран списък с потребители във формат usuario:hashХешът обикновено се генерира с htpasswd и е вграден във файла. Този междинен софтуер обикновено е свързан с рутера на таблото за управление на Traefik, така че освен HTTPS достъп, изисква потребителско име и парола.

В рамките на една и съща динамична конфигурация е обичайно да се види блок tls.options с профил по подразбиране (default) където са зададени поддържаните шифри и минималната версия на TLS, например VersionTLS12В някои внедрявания са дефинирани няколко опции (например профил, наречен tls12 и други default) за адаптиране на нивото на сигурност към различните услуги, ако е необходимо.

В среди, където е желателно да се използва TLS също вътрешно Между Traefik и backend услугите (като Portainer) може да възникне проблем, когато тези услуги нямат сертификат, разпознат от публичен CA. Тук влиза в действие опцията. insecureSkipVerify, който, конфигуриран под providers.http.tls или в съответните TLS опции, това позволява на Traefik да заобиколи валидирането на сертификати от backend. Това е полезно за лабораторни среди или вътрешни самоподписани сертификати, но трябва да се използва с повишено внимание, защото облекчава проверката.

Практичен детайл: файлът dynamic.yml Може да се редактира в движение.Traefik презарежда динамичната конфигурация, без да е необходимо рестартиране, така че можете да добавяте или премахвате мидълуер, да променяте заглавки за сигурност или да променяте основно удостоверяване, без да се засяга наличността на прокси сървъра.

docker-compose с Traefik и Portainer в самостоятелен Docker

В сценарий с гол Docker, без Swarm, най-често срещаното нещо, което трябва да се направи, е да се стартира Traefik и Portainer с единична docker-compose.yml което дефинира както услуги, така и споделена мрежа от тип мост, наречена например proxy.

Услугата Траефик Обикновено използва официалното изображение, например traefik:latest или конкретна версия като traefik:v3.4Портовете са картографирани. 80 и 443 за уеб трафик и, в някои примери, порт 8080 за вътрешно показване на контролния панел. Освен това е добавена опцията restart: unless-stopped и сигурността е подсилена с security_opt: - no-new-privileges:true за да се намали рискът от ескалация на привилегиите в контейнера.

Що се отнася до томовете, Traefik трябва да монтира Docker сокета само за четене (/var/run/docker.sock:/var/run/docker.sock:ro) за откриване на контейнери, статичният файл traefik.yml и директорията, където ще бъде запазена динамичната конфигурация (./traefik-data/configurations:/configurationsФайлът също е монтиран. acme.jsonТова е мястото, където Traefik съхранява сертификатите, издадени от Let's Encrypt. Този файл се създава на хоста и му се дават разрешения. 600 така че само подходящият потребител да може да го чете и пише; ако го оставите с 644, Traefik обикновено се оплаква.

Ключът към магията на Трафик е... етикети за услугиОсвен всичко друго, ще намерите: traefik.enable=true (така че доставчикът на Docker да изложи тази услуга), traefik.docker.network=proxy (показва коя мрежа Traefik трябва да използва за комуникация с контейнера) и рутер като traefik.http.routers.traefik-secure, с етикети, които определят входната му точка (websecure), правилото за хост (например Host(`traefik.tudominio.com`)), свързаната услуга (api@internal) и междинния софтуер за удостоверяване (user-auth@file).

  Пълно ръководство за оптимизация на Linux сървъри

Услугата Портейнер в същото docker-compose.yml обикновено използва portainer/portainer-ce:latest (или Enterprise изданието, ако имате лиценз). Монтирани са подобни томове: Docker сокетът, папката с данни (./portainer-data:/data) и често също така /etc/localtime така че да наследи часовата зона на хоста.

Етикетите на Portainer го регистрират в Traefik: traefik.enable=true, traefik.docker.network=proxyрутер от типа traefik.http.routers.portainer-secure с входна точка websecure и правило за хост като Host(`portainer.tudominio.com`)Освен това, услугата, която Traefik трябва да използва, е дефинирана, сочейки към вътрешния порт на Portainer, например с traefik.http.services.portainer.loadbalancer.server.port=9000.

С всичко това в ход, след стартирането docker compose up -d В директорията на стека, Traefik изтегля изображенията и създава мрежата. proxy Ако е деклариран като външен и показва и двата панела в конфигурираните поддомейни, с Автоматичен HTTPS благодарение на Let's EncryptОт този момент нататък, добавянето на нови услуги е въпрос на клониране на вашия проект, добавяне на няколко Traefik етикета и свързването му към мрежата. proxy.

Сценарий на Docker Swarm: Portainer и Traefik в клъстер

Когато активирате Docker Swarm, нещата се променят малко, защото услугите се разполагат като стекове, а мрежите обикновено са базирани на наслагване. Основната логика при Traefik и Portainer обаче е много сходна: Traefik продължава да действа като обратен прокси и динамичен откривател на услуги, а Portainer може да работи както в самостоятелен режим, така и в режим Portainer + агент, за да управлява отдалечени възли в клъстера.

При типично внедряване на Swarm, стекът се създава преди прилагането му. две наслагващи се мрежи който Traefik ще използва за маршрутизиране на трафика между възлите. Освен това се създава том за съхранение на данни от Portainer (например) portainer_data) и, ако имате нужда, един за acme.json или директорията, където Traefik съхранява сертификати и конфигурация.

El docker-compose.yml (което след това се разгръща с docker stack deploy използвайки, например, -c portainer.yml) обикновено определя две услуги: Агент за пренос на багаж, който работи в режим global на всички Linux възли и основната услуга Portainer (CE или EE), която обикновено остава в репликиран режим с ограничение да се изпълнява само на мениджъри.

Агентът Portainer монтира Docker сокета и директорията с томове (/var/lib/docker/volumes), за да може да инспектира ресурси. Той се свързва с мрежата на наслагване, която ще споделя с Traefik, например traefik_publicГлавната услуга Portainer може да бъде конфигурирана да комуникира с агента чрез TCP (tcp://tasks.agent:9001) и всъщност в някои примери тази команда е показана с --tlsskipverify коментира, за да пропуснете TLS проверката, ако е необходимо.

На същия стек или друг, Traefik стартира с Docker доставчика в режим Swarm (swarmMode = true в TOML или еквивалентната опция във флаговете), като се наблюдават маркираните услуги. Конфигурацията му включва certificatesResolvers.main.acme за Let's Encrypt, a dnsChallenge с доставчик като Път 53 Ако искате да валидирате сертификати чрез DNS и блок от tls.options където например е принудено minVersion = "VersionTLS13" за профила по подразбиране и е дефиниран изричен списък от cipherSuites за TLS 1.2 профил.

Етикетите на Portainer в Swarm следват същата философия: traefik.enable=trueрутер като traefik.http.routers.portainer с Host(`portainer.midominio.com`), traefik.http.routers.portainer.entrypoints=https (o websecure (според наименованието) и traefik.http.routers.portainer.tls=true за да активирате TLS на този рутер. Освен това можете да укажете сертификат за разрешаване на проблеми с traefik.http.routers.portainer.tls.certresolver=main и схемата на backend-а, ​​ако услугата използва HTTPS вътрешно с traefik.http.services.portainer.loadbalancer.server.scheme=https.

В лог файловете за отстраняване на грешки на Traefik в Swarm ще видите генерираната конфигурация: рутери като api y portainerоткрити услуги (например portainer en http://10.0.1.12:9000 и услуга traefik (сочещ към порт 8080 на таблото за управление) и, ако има проблем с лошо дефинирани етикети, съобщения като „Не можа да се определи името на услугата за рутера: твърде много услуги“които обикновено показват, че има конфликт или дублиране на услуги, свързани с рутер.

Минимален пример: whoami, маршрути и TLS с Traefik

Преди да включим Portainer в уравнението, е доста практично да изпробваме Traefik с много опростен бекенд, като изображението. traefik/whoamiкоето връща информация за заявката. Това ви помага да проверите дали Traefik е правилно конфигуриран и дали правилата за маршрутизиране работят.

Un docker-compose.yml основното може да включва услугата traefik с изображението traefik:v3.4, монтиране на Docker сокета и дефиниране на флаговете за зареждане като --providers.docker=true, --providers.docker.exposedbydefault=false, --providers.docker.network=proxy и входната точка --entryPoints.web.address=:80Портове 80 и 8080 се рекламират на хоста и се създава мрежа. proxy който също ще използва контейнера whoami.

Услугата whoami Започва в същата мрежа и е маркирано с traefik.enable=trueСлед това рутерът се дефинира с етикета traefik.http.routers.whoami.rule=Host(`whoami.docker.localhost`) и е посочено, че вашата входна точка е webАко направите заявка с curl -H "Host: whoami.docker.localhost" http://localhost/Ще видите отговор с име на хост, IP адреси, заглавки и т.н., което потвърждава, че Traefik маршрутизира правилно.

  Грешка 404 Не е намерена: Какво представлява, причини, влияние върху уебсайта ви и как да я поправите.

Оттам нататък е просто. добавете маршрутизиране по пътищаНапример, можете да създадете друга услуга. whoami-api със същото изображение, в същата мрежа и го маркирайте с правило от типа Host(`whoami.docker.localhost`) && PathPrefix(`/api`)По този начин, коренът / отидете на whoami оригинала и исканията към /api ще им служи whoami-apiМожете да проверите това, като направите заявки до / ти /api със същия домакин.

За да активирате TLS В тази локална среда, една от опциите е да се генерира самоподписан сертификат за домейна. *.docker.localhost с opensslСъздавате директория certs, генерирате local.key y local.crt, и след това добавяте динамичен файл (например dynamic/tls.yml) със секцията tls: и маршрутите certFile y keyFile сочейки към тези файлове.

След това актуализирате дефиницията на услугата Traefik в docker-compose.yml за монтиране на папката ./certs и папката ./dynamic вътре в контейнера активирате защитения API с --api.dashboard=true, вие създавате входната точка websecure (--entryPoints.websecure.address=:443) и активирайте TLS там с --entryPoints.websecure.http.tls=trueВие също така етикетирате рутера на таблото и рутерите на whoami за да използват websecure и имам tls=true.

След като е готов, ще имате достъп https://whoami.docker.localhost/ и към панела Traefik със самоподписан сертификат, приемайки предупреждението за сигурност на браузъра. Това преживяване е много подобно на това, което по-късно ще имате в продукцията с Let's Encrypt, но без да разчитате на публични DNS сървъри.

Най-добри практики, внедряване на приложения и решаване на типични проблеми

Един модел, който се повтаря във всички тези примери, е, че Traefik значително опростява внедряването на нови приложенияСлед като имате базовия си стек (Traefik + Portainer + мрежа) proxy (+ сертификати), добавянето на нова услуга обикновено се свежда до:

Клонирайте проекта или копирайте вашия docker-compose.yml към сървъра, насочете поддомейн към IP адреса на хоста, използвайки запис А във вашия DNS (например app.tudominio.com) и след това добавете ключовите етикети към услугата: traefik.enable=true, traefik.docker.network=proxy и рутер с правило за хост за този поддомейн, указващо защитената входна точка websecure и услуга с правилния вътрешен порт.

Много уроци биха показали например внедряването на малко приложение FastAPI Разделено: добавят се четири етикета, гарантиращи присъединяването към мрежата proxy в секцията networks дел docker-compose.ymlи след като направи docker compose up -d Приложението се показва автоматично в таблото за управление на Traefik с активиран TLS. Автоматичното откриване на Traefik означава, че дори не е необходимо да коригирате статичните му настройки.

За да се гарантира, че всичко ще протече гладко, е важно да се обърне внимание на няколко подробности: Не използвайте повторно един и същ идентификатор на рутера В различни приложения проверете дали има само една услуга, свързана с всеки рутер (избягвайки грешката „твърде много услуги“), използвайте последователни имена на мрежи (например, proxy на всички стекове, които искате да разкриете) и, ако използвате Let's Encrypt, уверете се, че acme.json Има разрешения 600 и конфигурираният имейл е валиден.

В Swarm среди проверете също дали конфигурацията на Traefik включва доставчика на Docker. swarmMode=true y watch=trueи че ограниченията на услугите (например node.role == manager (за Portainer) не конфликтират с мястото, където е разположен Traefik. Регистрационните файлове за отстраняване на грешки са много подробни, но са ключови за локализиране на проблеми с маршрутизацията или TLS.

Комбинирайки Docker, Traefik и Portainer, можете да настроите цялостна лека оркестрационна среда на един сървър, с графични табла за управление, автоматични сертификати и много бърз процес на внедряване, където добавянето, актуализирането или премахването на услуги се свежда до настройване на няколко реда YAML и оставяне на Traefik да върши мръсната работа на обратното проксиране и TLS.