- Traefik działa jako dynamiczny odwrotny serwer proxy i rozwiązuje certyfikaty TLS, natomiast Portainer oferuje graficzny interfejs do zarządzania Dockerem i Swarmem.
- Połączenie plików traefik.yml, dynamic.yml i docker-compose.yml umożliwia definiowanie punktów wejścia, oprogramowania pośredniczącego zabezpieczającego i routingu HTTP/HTTPS opartego na etykietach.
- W scenariuszach Docker Standalone lub Swarm wystarczy dołączyć usługi do sieci proxy i oznaczyć je, aby Traefik mógł je bezpiecznie wykryć i udostępnić.
- Wykorzystanie Let's Encrypt, dedykowanych sieci i podstawowego uwierzytelniania na pulpicie nawigacyjnym konsoliduje solidne środowisko do wdrażania wielu aplikacji na jednym serwerze.
Konfiguracja nowoczesnego stosu z Dockerem, Traefikiem i Portainerem to obecnie jeden z najłatwiejszych sposobów zarządzania kontenerami na jednym serwerze i udostępniania wielu usług za pomocą HTTPS bez konieczności przeładowywania się konfiguracją. Zaletą tego rozwiązania jest to, że Traefik działa jak dynamiczny odwrotny serwer proxy, podczas gdy Portainer zapewnia bardzo prosty interfejs webowy do zarządzania Dockerem, a opcjonalnie również Swarmem.
W tym artykule zobaczysz jak dopasowanie Traefika jako odwrotnego proxy przed Portainerem Zarówno w „klasycznym” scenariuszu Docker (samodzielnym), jak i w klastrze Docker Swarm, jak zintegrować protokół TLS (z podpisem własnym lub Let's Encrypt) i jakie pliki konfiguracyjne są w to zaangażowane (traefik.yml, dynamic.yml y docker-compose.yml) oraz kilka typowych sztuczek związanych z oprogramowaniem pośredniczącym, sieciami i typowymi problemami tagowania w Traefik.
Jaką rolę w architekturze odgrywają Docker, Traefik i Portainer?
W tym typie konfiguracji Docker stanowi warstwę bazową, na której uruchamiane są kontenery, Traefik działa jako odwrotny serwer proxy i moduł równoważenia obciążenia , który odbiera wszystkie żądania HTTP/HTTPS na portach 80 i 443 i wysyła je do odpowiedniego kontenera, a Portainer zapewnia graficzny interfejs do zarządzania obrazami, kontenerami, woluminami, sieciami oraz stosami Docker lub Swarm.
Pomysł polega na posiadaniu jednego hosta z Dockerem, gdzie Traefik znajduje się w „bramie”:słuchaj w punktach wejścia web (80) y websecure (443), rozwiązuje certyfikaty TLS (zwykle za pomocą Let's Encrypt) i dzięki integracji z dostawcą Docker automatycznie wykrywa udostępniane usługi, dodając etykiety do kontenerów.
Z drugiej strony Portainer działa jak zwykły kontener, ale jest wystawiony na działanie na przykład konkretna subdomena portainer.tudominio.com, chronione przez TLS i, w razie potrzeby, za dodatkowym oprogramowaniem pośredniczącym uwierzytelniania wykraczającym poza logowanie Portainera. Wszystko to jest obsługiwane przez dokować-komponować który definiuje Traefik, Portainer i wspólną sieć typu proxy.
Wyraźną zaletą tego podejścia jest to, że możesz wdrażać nowe usługi po prostu dodając etykiety do swoich kontenerów: Traefik wykrywa zmianę w Dockerze, tworzy routery, usługi i oprogramowanie pośredniczące w locie, a w ciągu kilku sekund masz nową subdomenę lub trasę uruchomioną bez konieczności ręcznej ingerencji w statyczne pliki konfiguracyjne.
Konfiguracja statyczna Traefik: traefik.yml
Statyczna konfiguracja Traefika jest zwykle przechowywana w pliku takim jak traefik.ymlktóry jest zamontowany wewnątrz kontenera. Tutaj jest zdefiniowany pulpit nawigacyjny, punkty wejścia, dostawcy i moduł rozpoznawania certyfikatów Let's Encrypt i wiele innych.
Typowa konfiguracja YAML zaczyna się od aktywacji interfejsu API i panelu sterowania za pomocą czegoś takiego api: dashboard: trueUmożliwia to dostęp do interfejsu webowego, w którym można przeglądać routery, usługi i oprogramowanie pośredniczące. Ten panel nie jest domyślnie uwierzytelniany, więc później zobaczymy, jak go zabezpieczyć za pomocą podstawowego uwierzytelniania z konfiguracji dynamicznej.
Następnie definiuje się punkty wejścia. Zwykle są to: punkt wejścia web w porcie 80 i inne websecure w 443, W web Automatyczne przekierowanie jest zazwyczaj skonfigurowane tak, aby websecuretak, aby każdy dostęp HTTP był przekierowywany do HTTPS:
Typowy konspekt zawierałby sekcję http.redirections.entryPoint.to: websecure aby wymusić przekierowanie i scentralizować cały szyfrowany ruch w bezpiecznym punkcie wejścia.
do websecure Wskazano, że należy używać protokołu TLS i podano link. certResolver (na przykład letsencrypt) który będzie odpowiedzialny za automatyczne zarządzanie certyfikatami. Wszystko to jest obsługiwane przez KULMINACJA, który jest protokołem używanym przez Let's Encrypt do wydawania i odnawiania certyfikatów.
W bloku dostawców Skonfigurowano dostawcę Dockera, wskazując na gniazdo unix:///var/run/docker.sockz jedną kluczową opcją: exposedByDefault: falseDzięki temu Traefik nie publikuje domyślnie wszystkich kontenerów, lecz tylko te, które mają etykietę traefik.enable=trueMożna również skonfigurować dostawcę plików (file) aby załadować dodatkową konfigurację dynamiczną, na przykład z /configurations/dynamic.yml.
Na koniec plik statyczny zwykle zawiera sekcję certificatesResolversgdzie zdefiniowano resolver ACME: e-mail rejestracyjny, plik pamięci masowej (zwykle acme.json), typ klucza (na przykład EC384) i metodę walidacji (na przykład httpChallenge na punkcie wejścia webWażne jest, że załóż prawdziwy adres e-mail w tej sekcji, ponieważ Let's Encrypt używa jej do powiadomień i odnowień; jeśli pozostawisz wartość fikcyjną lub nieprawidłową, mogą wystąpić błędy podczas uruchamiania kontenera Traefik.
Oprócz tej konfiguracji YAML istnieją wdrożenia wykorzystujące Format TOML (traefik.toml)Ale logika jest taka sama: sekcje certyfikatów resolver (na przykład [certificatesResolvers.main.acme]), zdefiniuj wyzwania (takie jak dnsChallenge z provider = "route53") i dodaj domyślne opcje TLS, takie jak forzar minVersion = "VersionTLS13" lub skonfiguruj listę cipherSuites dozwolony.
Konfiguracja dynamiczna: oprogramowanie pośredniczące, TLS i zabezpieczenia
Dynamiczna część Traefika zwykle znajduje się w pliku takim jak dynamic.yml, załadowane przez dostawcę pliku. Tutaj definiujesz oprogramowanie pośredniczące i opcje TLS które można modyfikować bez konieczności ponownego uruchamiania kontenera Traefik, co jest bardzo przydatne przy dostosowywaniu zabezpieczeń na bieżąco.
Typowym przypadkiem jest tworzenie oprogramowania pośredniczącego nagłówka, na przykład secureHeadersktóry dodaje zasady związane z HSTS i obowiązkowym używaniem protokołu HTTPS. W pliku YAML można znaleźć parametry takie jak: sslRedirect: true, forceSTSHeader: true, stsIncludeSubdomains: true, stsPreload: true oraz stsSeconds wysoki (np. rok w sekundach). Zwiększa to bezpieczeństwo ruchu po stronie przeglądarki.
Innym powszechnym oprogramowaniem pośredniczącym jest oprogramowanie do podstawowego uwierzytelniania, na przykład user-auth typ basicAuth, gdzie lista użytkowników jest deklarowana w formacie usuario:hashHasz jest zwykle generowany za pomocą htpasswd i jest osadzony w pliku. To oprogramowanie pośredniczące jest zazwyczaj powiązane z routerem Traefik, więc oprócz dostępu HTTPS wymaga podania nazwy użytkownika i hasła.
W ramach tej samej konfiguracji dynamicznej często można zobaczyć blok tls.options z domyślnym profilem (default) gdzie ustawiane są obsługiwane szyfry i minimalna wersja TLS, na przykład VersionTLS12W niektórych wdrożeniach zdefiniowano kilka opcji (na przykład profil o nazwie tls12 i inne default) w celu dostosowania poziomu bezpieczeństwa do różnych usług, jeśli zajdzie taka potrzeba.
W środowiskach, w których pożądane jest użycie TLS również wewnętrznie Pomiędzy Traefikiem a usługami zaplecza (takimi jak Portainer) może pojawić się problem, gdy te usługi nie mają certyfikatu uznawanego przez publiczny urząd certyfikacji. Tu właśnie pojawia się opcja. insecureSkipVerify, który skonfigurowany pod providers.http.tls lub w odpowiednich opcjach TLS, pozwala Traefikowi ominąć walidację certyfikatu zaplecza. Jest to przydatne w środowiskach laboratoryjnych lub w przypadku wewnętrznych certyfikatów z podpisem własnym, ale należy z tego korzystać ostrożnie, ponieważ ogranicza weryfikację.
Praktyczny szczegół: plik dynamic.yml Można go edytować na bieżąco.Traefik wczytuje ponownie dynamiczną konfigurację bez konieczności ponownego uruchamiania, dzięki czemu można dodawać lub usuwać oprogramowanie pośredniczące, zmieniać nagłówki zabezpieczeń lub modyfikować podstawowe uwierzytelnianie bez wpływu na dostępność serwera proxy.
docker-compose z Traefik i Portainer w samodzielnym Dockerze
W scenariuszu z gołym Dockerem, bez Swarm, najczęstszą czynnością jest uruchomienie Traefik i Portainer z jednym docker-compose.yml która definiuje zarówno usługi, jak i wspólną sieć typu mostu, zwaną na przykład proxy.
Usługa Traefik Zwykle wykorzystuje się w tym celu oficjalny obraz, np. traefik:latest lub konkretnej wersji, takiej jak traefik:v3.4Porty są zmapowane. 80 i 443 dla ruchu sieciowego i, w niektórych przykładach, portu 8080, aby udostępnić panel sterowania wewnętrznie. Dodatkowo dodano opcję restart: unless-stopped a bezpieczeństwo jest wzmocnione security_opt: - no-new-privileges:true aby ograniczyć ryzyko eskalacji uprawnień w kontenerze.
Jeśli chodzi o woluminy, Traefik musi zamontować gniazdo Docker przeznaczone tylko do odczytu (/var/run/docker.sock:/var/run/docker.sock:ro) do odkrywania kontenerów, plik statyczny traefik.yml i katalog, w którym zostanie zapisana konfiguracja dynamiczna (./traefik-data/configurations:/configurationsPlik jest również zamontowany. acme.jsonTo tutaj Traefik przechowuje certyfikaty wydane przez Let's Encrypt. Ten plik jest tworzony na hoście i otrzymuje uprawnienia. 600 tak, że tylko uprawniony użytkownik może go odczytać i zapisać; jeśli pozostawisz wartość 644, Traefik zwykle będzie narzekał.
Kluczem do magii Traefika jest etykiety serwisoweZnajdziesz tu między innymi: traefik.enable=true (aby dostawca Dockera udostępnił tę usługę), traefik.docker.network=proxy (wskazuje, z której sieci Traefik powinien korzystać do komunikacji z kontenerem) i routera takiego jak traefik.http.routers.traefik-secure, z etykietami definiującymi jego punkt wejścia (websecure), reguła gospodarza (na przykład Host(`traefik.tudominio.com`)), powiązana usługa (api@internal) i oprogramowanie pośredniczące uwierzytelniania (user-auth@file).
Obsługa Portier w tym samym docker-compose.yml ogólnie używa portainer/portainer-ce:latest (lub edycja Enterprise, jeśli posiadasz licencję). Montowane są podobne woluminy: gniazdo Docker, folder danych (./portainer-data:/data) i często także /etc/localtime tak aby odziedziczył strefę czasową hosta.
Etykiety Portainera rejestrują go w firmie Traefik: traefik.enable=true, traefik.docker.network=proxyrouter tego typu traefik.http.routers.portainer-secure z punktem wejścia websecure i reguła gospodarza taka jak Host(`portainer.tudominio.com`)Dodatkowo zdefiniowano usługę, z której powinien korzystać Traefik, wskazując na wewnętrzny port Portainera, np. za pomocą traefik.http.services.portainer.loadbalancer.server.port=9000.
Mając to wszystko w toku, po uruchomieniu docker compose up -d W katalogu stosu Traefik pobiera obrazy i tworzy sieć. proxy Jeżeli jest zadeklarowany jako zewnętrzny i udostępnia oba panele w skonfigurowanych subdomenach, z Automatyczny HTTPS dzięki Let's EncryptOd tego momentu dodawanie nowych usług sprowadza się do sklonowania projektu, dodania kilku etykiet Traefik i podłączenia go do sieci. proxy.
Scenariusz Docker Swarm: Portainer i Traefik w klastrze
Po aktywacji Docker Swarm sytuacja nieco się zmienia, ponieważ usługi są wdrażane jako stosy, a sieci zazwyczaj bazują na nakładkach. Jednak logika działania Traefika i Portainera jest bardzo podobna: Traefik nadal działa jako odwrotny serwer proxy i dynamiczny wykrywacz usług, a Portainer może działać zarówno w trybie autonomicznym, jak i w trybie Portainera z agentem, aby zarządzać zdalnymi węzłami w klastrze.
W przypadku typowego wdrożenia Swarm stos jest tworzony przed jego zastosowaniem. dwie sieci nakładkowe którego Traefik będzie używać do kierowania ruchem między węzłami. Dodatkowo tworzony jest wolumin do przechowywania danych Portainer (na przykład). portainer_data) i jeśli potrzebujesz, to jeden dla acme.json lub katalog, w którym Traefik przechowuje certyfikaty i konfigurację.
El docker-compose.yml (który następnie rozwija się wraz z docker stack deploy używając na przykład -c portainer.yml) zwykle definiuje dwie usługi: Agent Portainer, który działa w trybie global na wszystkich węzłach Linux oraz główna usługa Portainer (CE lub EE), która normalnie pozostaje w trybie replikowanym z ograniczeniem umożliwiającym jej uruchamianie wyłącznie na menedżerach.
Agent Portainer montuje gniazdo Docker i katalog woluminu (/var/lib/docker/volumes) aby móc przeglądać zasoby. Łączy się z siecią nakładkową, którą będzie współdzielił z Traefikiem, na przykład traefik_publicGłówną usługę Portainer można skonfigurować tak, aby komunikowała się z agentem za pomocą protokołu TCP (tcp://tasks.agent:9001) i faktycznie w niektórych przykładach polecenie to jest pokazane z --tlsskipverify skomentowano, aby pominąć weryfikację TLS, jeśli to konieczne.
Na tym samym stosie lub innym Traefik uruchamia się z dostawcą Docker w trybie Swarm (swarmMode = true w TOML lub równoważnej opcji w flagach), obserwując oznaczone usługi. Jego konfiguracja obejmuje certificatesResolvers.main.acme dla Let's Encrypt, dnsChallenge z dostawcą takim jak Trasa53 Jeśli chcesz zweryfikować certyfikaty za pomocą DNS i bloku tls.options gdzie na przykład jest to wymuszone minVersion = "VersionTLS13" dla profilu domyślnego i zdefiniowano wyraźną listę cipherSuites dla profilu TLS 1.2.
Etykiety Portainer w Swarm opierają się na tej samej filozofii: traefik.enable=truerouter taki jak traefik.http.routers.portainer z Host(`portainer.midominio.com`), traefik.http.routers.portainer.entrypoints=https (o websecure (zgodnie z nazewnictwem) i traefik.http.routers.portainer.tls=true aby włączyć TLS na tym routerze. Dodatkowo możesz określić certresolver z traefik.http.routers.portainer.tls.certresolver=main i schemat zaplecza, jeśli usługa wewnętrznie komunikuje się za pomocą protokołu HTTPS traefik.http.services.portainer.loadbalancer.server.scheme=https.
W dziennikach debugowania Traefik w Swarm zobaczysz wygenerowaną konfigurację: routery takie jak api y portainerodkryte usługi (na przykład portainer en http://10.0.1.12:9000 i usługa traefik (wskazując na port 8080 pulpitu nawigacyjnego) i jeśli występuje problem z nieprawidłowo zdefiniowanymi etykietami, komunikaty takie jak „Nie można zdefiniować nazwy usługi dla routera: zbyt wiele usług”co zwykle oznacza, że występuje konflikt lub duplikacja usług związanych z routerem.
Minimalny przykład: whoami, routes i TLS z Traefik
Zanim dodamy Portainera do równania, całkiem praktycznym rozwiązaniem będzie wypróbowanie Traefika z bardzo prostym zapleczem, takim jak na obrazku. traefik/whoamiktóry zwraca informacje o żądaniu. Pomaga to sprawdzić, czy Traefik jest poprawnie skonfigurowany i czy reguły routingu działają.
Un docker-compose.yml podstawowy może obejmować usługę traefik z obrazem traefik:v3.4, montując gniazdo Docker i definiując flagi rozruchowe jako --providers.docker=true, --providers.docker.exposedbydefault=false, --providers.docker.network=proxy i punkt wejścia --entryPoints.web.address=:80Porty 80 i 8080 są reklamowane na hoście, a sieć zostaje utworzona. proxy który również będzie korzystał z kontenera whoami.
Usługa whoami Zaczyna się w tej samej sieci i jest oznaczony traefik.enable=trueNastępnie definiowany jest router z etykietą traefik.http.routers.whoami.rule=Host(`whoami.docker.localhost`) i wskazano, że Twój punkt wejścia to webJeśli złożysz wniosek curl -H "Host: whoami.docker.localhost" http://localhost/Zobaczysz odpowiedź zawierającą nazwę hosta, adresy IP, nagłówki itd., która potwierdzi, że Traefik prawidłowo kieruje ruchem.
Od tego momentu jest już prosto. dodaj routing według ścieżekMożesz na przykład utworzyć inną usługę. whoami-api z tym samym obrazem, w tej samej sieci i oznacz go regułą tego typu Host(`whoami.docker.localhost`) && PathPrefix(`/api`)Tak więc korzeń / iść do whoami oryginał i prośby o /api będzie im służyć whoami-apiMożesz to sprawdzić, wysyłając prośby do / już /api z tym samym gospodarzem.
Aby aktywować TLS W tym lokalnym środowisku jedną z opcji jest wygenerowanie certyfikatu podpisanego przez siebie dla domeny *.docker.localhost z opensslTworzysz katalog certs, generujesz local.key y local.crt, a następnie dodajesz plik dynamiczny (na przykład dynamic/tls.yml) z sekcją tls: i trasy certFile y keyFile wskazując na te pliki.
Następnie należy zaktualizować definicję usługi Traefik w docker-compose.yml zamontować folder ./certs i folder ./dynamic w kontenerze aktywujesz bezpieczne API za pomocą --api.dashboard=true, tworzysz punkt wejścia websecure (--entryPoints.websecure.address=:443) i włącz tam TLS --entryPoints.websecure.http.tls=trueMożesz również oznaczyć router na pulpicie nawigacyjnym i routery whoami aby mogli z nich korzystać websecure i mieć tls=true.
Po uruchomieniu będziesz mieć dostęp https://whoami.docker.localhost/ oraz do panelu Traefik z certyfikatem podpisanym przez siebie, akceptując ostrzeżenie bezpieczeństwa przeglądarki. To doświadczenie jest bardzo podobne do tego, które później będzie dostępne w środowisku produkcyjnym Let's Encrypt, ale bez polegania na publicznych serwerach DNS.
Najlepsze praktyki, wdrażanie aplikacji i rozwiązywanie typowych problemów
Jeden ze schematów powtarzających się we wszystkich tych przykładach to: Traefik znacznie upraszcza wdrażanie nowych aplikacjiGdy już masz swój podstawowy stos (Traefik + Portainer + sieć) proxy (+ certyfikaty), dodanie nowej usługi zazwyczaj sprowadza się do:
Sklonuj projekt lub skopiuj swój docker-compose.yml do serwera, skieruj subdomenę do adresu IP hosta za pomocą rekord A w Twoim DNS (na przykład app.tudominio.com), a następnie dodaj etykiety kluczy do usługi: traefik.enable=true, traefik.docker.network=proxy i router z regułą hosta dla tej subdomeny, określającą bezpieczny punkt wejścia websecure i usługa z prawidłowym portem wewnętrznym.
Wiele samouczków pokazuje na przykład wdrożenie małej aplikacji FastAPI Oddzielone: dodano cztery etykiety, co zapewnia dołączenie do sieci proxy w dziale networks del docker-compose.ymli po zrobieniu docker compose up -d Aplikacja automatycznie pojawia się na pulpicie Traefik z włączonym protokołem TLS. Dzięki funkcji automatycznego wykrywania Traefik nie musisz nawet zmieniać jej ustawień statycznych.
Aby wszystko przebiegało sprawnie, należy zwrócić uwagę na kilka szczegółów: nie używaj ponownie tego samego identyfikatora routera W różnych aplikacjach sprawdź, czy z każdym routerem jest powiązana tylko jedna usługa (unikając w ten sposób błędu „zbyt wiele usług”), używaj spójnych nazw sieciowych (na przykład proxy na wszystkich stosach, które chcesz udostępnić), a jeśli używasz Let's Encrypt, upewnij się, że acme.json Ma uprawnienia 600, a skonfigurowany adres e-mail jest prawidłowy.
W środowiskach Swarm sprawdź również, czy konfiguracja Traefik obejmuje dostawcę Docker. swarmMode=true y watch=truei że ograniczenia usług (na przykład node.role == manager (dla Portainera) nie kolidują z miejscem wdrożenia Traefika. Dzienniki debugowania są bardzo szczegółowe, ale są kluczowe dla lokalizowania problemów z routingiem lub TLS.
Łącząc Dockera, Traefika i Portainera, można skonfigurować kompletne, lekkie środowisko orkiestracji na jednym serwerze z graficznymi pulpitami nawigacyjnymi, automatycznymi certyfikatami i bardzo szybkim procesem wdrażania, w którym dodawanie, aktualizowanie lub usuwanie usług sprowadza się do poprawienia kilku linijek kodu YAML i pozwolenia Traefikowi na wykonanie brudnej roboty związanej z odwrotnym proxy i protokołem TLS.
