Physical Address
304 North Cardinal St.
Dorchester Center, MA 02124
Physical Address
304 North Cardinal St.
Dorchester Center, MA 02124
Представете си следната ситуация: имате няколко уеб приложения, работещи в Docker контейнери. Всяко от тях се нуждае от собствен порт. Потребителите трябва да помнят различни портове за различни услуги. Звучи сложно, нали?
Ето тук идва решението – Traefik! 🎯
Traefik е модерен обратен прокси сървър, който автоматично открива вашите Docker контейнери. Той ви позволява да достъпвате множество приложения чрез едно домейн име. Вместо да помните порт 8080 за блога и порт 9000 за администрацията, просто отивате на blog.yourdomain.com и admin.yourdomain.com.
Конкретна полза: Намаляване на времето за конфигуриране с 80% чрез автоматично откриване на услуги. Специфично съдържание: Стъпка по стъпка ръководство с готови примери за конфигуриране. Измерима стойност: Управление на неограничен брой услуги с един конфигурационен файл.
Обратният прокси е като рецепционист в голяма сграда. Когато посетител дойде, рецепционистът решава към кой офис да го насочи.
По същия начин обратният прокси:
Това се различава от обикновения прокси, който работи от страната на клиента.
Traefik автоматично открива нови Docker контейнери. Няма нужда от ръчна конфигурация при всеки нов контейнер.
Автоматично генериране и обновяване на SSL сертификати. Забравете за изтекли сертификати!
Конфигурирането става чрез етикети на Docker контейнерите. Интуитивно и ясно.
Вграден dashboard за наблюдение на трафика и състоянието на услугите.
traefik-setup/
├── docker-compose.yml
├── traefik/
│ ├── traefik.yml
│ └── dynamic/
│ └── tls.yml
└── apps/
├── blog/
└── admin/
Първо създаваме изолирана мрежа за Traefik:
docker network create traefik-network
Тази мрежа позволява на Traefik да комуникира с другите контейнери безопасно.
Създайте файл traefik/traefik.yml
:
# API и Dashboard
api:
dashboard: true
insecure: false
# Входни точки
entryPoints:
web:
address: ":80"
http:
redirections:
entrypoint:
to: websecure
scheme: https
websecure:
address: ":443"
# Доставчици
providers:
docker:
endpoint: "unix:///var/run/docker.sock"
exposedByDefault: false
network: traefik-network
file:
directory: /dynamic
watch: true
# Let's Encrypt сертификати
certificatesResolvers:
letsencrypt:
acme:
email: your-email@example.com
storage: /acme.json
httpChallenge:
entryPoint: web
Създайте docker-compose.yml
:
version: '3.8'
services:
traefik:
image: traefik:v3.0
container_name: traefik
restart: unless-stopped
security_opt:
- no-new-privileges:true
networks:
- traefik-network
ports:
- "80:80"
- "443:443"
environment:
- CF_API_EMAIL=${CF_API_EMAIL}
- CF_DNS_API_TOKEN=${CF_DNS_API_TOKEN}
volumes:
- /etc/localtime:/etc/localtime:ro
- /var/run/docker.sock:/var/run/docker.sock:ro
- ./traefik/traefik.yml:/traefik.yml:ro
- ./traefik/dynamic:/dynamic:ro
- ./traefik/acme.json:/acme.json
labels:
- "traefik.enable=true"
- "traefik.http.routers.traefik.rule=Host(`traefik.yourdomain.com`)"
- "traefik.http.routers.traefik.entrypoints=websecure"
- "traefik.http.routers.traefik.tls.certresolver=letsencrypt"
- "traefik.http.routers.traefik.service=api@internal"
- "traefik.http.routers.traefik.middlewares=auth"
- "traefik.http.middlewares.auth.basicauth.users=admin:$$2y$$10$$..."
networks:
traefik-network:
external: true
Генерирайте парола за dashboard-а:
echo $(htpasswd -nb admin your-password) | sed -e s/\\$/\\$\\$/g
Резултатът замества $$2y$$10$$...
в docker-compose.yml файла.
# Създаване на acme.json файл
touch traefik/acme.json
chmod 600 traefik/acme.json
# Стартиране на Traefik
docker-compose up -d
Проверете състоянието:
docker-compose logs -f traefik
Създайте нов docker-compose.yml
за тестово приложение:
version: '3.8'
services:
blog:
image: nginx:alpine
container_name: blog-app
restart: unless-stopped
networks:
- traefik-network
volumes:
- ./blog-content:/usr/share/nginx/html:ro
labels:
- "traefik.enable=true"
- "traefik.http.routers.blog.rule=Host(`blog.yourdomain.com`)"
- "traefik.http.routers.blog.entrypoints=websecure"
- "traefik.http.routers.blog.tls.certresolver=letsencrypt"
- "traefik.http.services.blog.loadbalancer.server.port=80"
networks:
traefik-network:
external: true
traefik.enable=true
– Активира Traefik за контейнераtraefik.http.routers.[name].rule
– Правило за маршрутизиранеtraefik.http.routers.[name].entrypoints
– Входна точкаtraefik.http.services.[name].loadbalancer.server.port
– Порт на услугатаlabels:
# Пренасочване от www
- "traefik.http.routers.blog-www.rule=Host(`www.blog.yourdomain.com`)"
- "traefik.http.routers.blog-www.middlewares=www-redirect"
- "traefik.http.middlewares.www-redirect.redirectregex.regex=^https://www\\.(.+)"
- "traefik.http.middlewares.www-redirect.redirectregex.replacement=https://$${1}"
# CORS настройки
- "traefik.http.routers.blog.middlewares=cors"
- "traefik.http.middlewares.cors.headers.accesscontrolallowmethods=GET,OPTIONS,PUT,POST,DELETE"
- "traefik.http.middlewares.cors.headers.accesscontrolalloworigin=*"
# Rate limiting
- "traefik.http.middlewares.rate-limit.ratelimit.average=100"
- "traefik.http.middlewares.rate-limit.ratelimit.burst=50"
labels:
- "traefik.http.services.app.loadbalancer.server.port=3000"
- "traefik.http.routers.app-api.rule=Host(`api.yourdomain.com`)"
- "traefik.http.routers.app-web.rule=Host(`app.yourdomain.com`)"
labels:
- "traefik.http.services.app.loadbalancer.sticky.cookie=true"
- "traefik.http.services.app.loadbalancer.sticky.cookie.name=traefik-app"
labels:
- "traefik.http.services.app.loadbalancer.healthcheck.path=/health"
- "traefik.http.services.app.loadbalancer.healthcheck.interval=30s"
След успешна конфигурация, посетете: https://traefik.yourdomain.com
Dashboard-ът показва:
# Преглед на логовете
docker-compose logs traefik
# Проверка на мрежата
docker network inspect traefik-network
# Статус на контейнерите
docker ps --format "table {{.Names}}\t{{.Status}}\t{{.Ports}}"
# Тестване на connectivity
docker exec traefik nslookup blog-app
volumes:
- /var/run/docker.sock:/var/run/docker.sock:ro
environment:
- CF_DNS_API_TOKEN_FILE=/run/secrets/cf_token
secrets:
cf_token:
file: ./secrets/cf_token.txt
# Затваряне на директен достъп до портовете на приложенията
ufw deny 8080
ufw deny 9000
ufw allow 80
ufw allow 443
# Обновяване на Traefik образа
docker-compose pull traefik
docker-compose up -d --no-deps traefik
Решение: Проверете email адреса и правата на acme.json файла:
chmod 600 traefik/acme.json
chown root:root traefik/acme.json
Решение: Проверете дали контейнерът е в правилната мрежа:
docker network connect traefik-network your-container
Решение: Проверете правилата за маршрутизиране и DNS записите.
labels:
- "traefik.http.middlewares.cache.headers.customrequestheaders.Cache-Control=max-age=3600"
labels:
- "traefik.http.middlewares.compress.compress=true"
- "traefik.http.routers.app.middlewares=compress"
services:
app1:
image: myapp:latest
labels:
- "traefik.http.services.myapp.loadbalancer.server.port=3000"
app2:
image: myapp:latest
labels:
- "traefik.http.services.myapp.loadbalancer.server.port=3000"
Traefik революционизира начина, по който управляваме обратни прокси сървъри в Docker среда. С автоматичното откриване на услуги, интегрираните SSL сертификати и интуитивната конфигурация, той е идеалният избор за модерни DevOps практики.
Ключови предимства:
Започнете с простата конфигурация от това ръководство и постепенно добавяйте advanced функционалности според нуждите си. Traefik ще нарасне заедно с вашите проекти!
Статията е тествана с Traefik v3.0 и Docker Compose v2.0+ към юни 2025 г.
Благодарим ви за прочитането на статията! Ако намерихте информацията за полезна, можете да дарите посредством бутоните по-долу:
Donate ☕️ Дарете с PayPalDonate 💳 Дарете с Revolut