Обратен прокси сървър на Docker, използващ Traefik

Обратен прокси сървър на Docker, използващ Traefik

Съдържание

📖 Въведение

Представете си следната ситуация: имате няколко уеб приложения, работещи в Docker контейнери. Всяко от тях се нуждае от собствен порт. Потребителите трябва да помнят различни портове за различни услуги. Звучи сложно, нали?

Ето тук идва решението – Traefik! 🎯

Traefik е модерен обратен прокси сървър, който автоматично открива вашите Docker контейнери. Той ви позволява да достъпвате множество приложения чрез едно домейн име. Вместо да помните порт 8080 за блога и порт 9000 за администрацията, просто отивате на blog.yourdomain.com и admin.yourdomain.com.

Конкретна полза: Намаляване на времето за конфигуриране с 80% чрез автоматично откриване на услуги. Специфично съдържание: Стъпка по стъпка ръководство с готови примери за конфигуриране. Измерима стойност: Управление на неограничен брой услуги с един конфигурационен файл.

🤔 Какво е обратен прокси сървър?

Обратният прокси е като рецепционист в голяма сграда. Когато посетител дойде, рецепционистът решава към кой офис да го насочи.

По същия начин обратният прокси:

  • Получава заявки от клиенти
  • Решава към кой сървър да ги препрати
  • Връща отговора обратно на клиента

Това се различава от обикновения прокси, който работи от страната на клиента.

🐳 Защо Traefik + Docker е перфектната комбинация?

1. Автоматично откриване 🔍

Traefik автоматично открива нови Docker контейнери. Няма нужда от ръчна конфигурация при всеки нов контейнер.

2. Интеграция с Let’s Encrypt 🔒

Автоматично генериране и обновяване на SSL сертификати. Забравете за изтекли сертификати!

3. Лесна конфигурация ⚙️

Конфигурирането става чрез етикети на Docker контейнерите. Интуитивно и ясно.

4. Мониторинг в реално време 📊

Вграден dashboard за наблюдение на трафика и състоянието на услугите.

🛠️ Подготовка на средата

Системни изисквания

  • Docker версия 20.10+
  • Docker Compose версия 2.0+
  • Базови познания по командния ред
  • Домейн име (за SSL сертификати)

Структура на проекта

traefik-setup/
├── docker-compose.yml
├── traefik/
│   ├── traefik.yml
│   └── dynamic/
│       └── tls.yml
└── apps/
    ├── blog/
    └── admin/

📋 Стъпка 1: Създаване на Docker мрежа

Първо създаваме изолирана мрежа за Traefik:

docker network create traefik-network

Тази мрежа позволява на Traefik да комуникира с другите контейнери безопасно.

🎛️ Стъпка 2: Конфигуриране на 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

🐋 Стъпка 3: Docker Compose конфигурация

Създайте 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

🔐 Стъпка 4: Настройка на основна автентификация

Генерирайте парола за dashboard-а:

echo $(htpasswd -nb admin your-password) | sed -e s/\\$/\\$\\$/g

Резултатът замества $$2y$$10$$... в docker-compose.yml файла.

🚀 Стъпка 5: Стартиране на Traefik

# Създаване на acme.json файл
touch traefik/acme.json
chmod 600 traefik/acme.json

# Стартиране на Traefik
docker-compose up -d

Проверете състоянието:

docker-compose logs -f traefik

📱 Стъпка 6: Добавяне на първо приложение

Създайте нов 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 етикетите

Основни етикети:

  • 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"

🔧 Advanced конфигурации

Мултиплексиране на портове

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`)"

Sticky sessions

labels:
  - "traefik.http.services.app.loadbalancer.sticky.cookie=true"
  - "traefik.http.services.app.loadbalancer.sticky.cookie.name=traefik-app"

Health checks

labels:
  - "traefik.http.services.app.loadbalancer.healthcheck.path=/health"
  - "traefik.http.services.app.loadbalancer.healthcheck.interval=30s"

📊 Мониторинг и диагностика

Dashboard достъп

След успешна конфигурация, посетете: https://traefik.yourdomain.com

Dashboard-ът показва:

  • Активни маршрути
  • Състояние на услугите
  • Трафик статистики
  • SSL сертификати

Полезни команди за диагностика

# Преглед на логовете
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

🛡️ Безопасност и best practices

1. Ограничаване на достъпа до Docker socket

volumes:
- /var/run/docker.sock:/var/run/docker.sock:ro

2. Използване на secrets за чувствителни данни

environment:
  - CF_DNS_API_TOKEN_FILE=/run/secrets/cf_token
secrets:
  cf_token:
    file: ./secrets/cf_token.txt

3. Firewall конфигурация

# Затваряне на директен достъп до портовете на приложенията
ufw deny 8080
ufw deny 9000
ufw allow 80
ufw allow 443

4. Регулярно обновяване

# Обновяване на 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

Проблем: 404 грешка

Решение: Проверете правилата за маршрутизиране и 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"

Load balancing между множество instances

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 практики.

Ключови предимства:

  • ⚡ 80% по-малко време за конфигуриране
  • 🔒 Автоматични SSL сертификати
  • 📊 Real-time мониторинг
  • 🚀 Zero-downtime deployments
  • 🛡️ Вградени security middleware

Започнете с простата конфигурация от това ръководство и постепенно добавяйте advanced функционалности според нуждите си. Traefik ще нарасне заедно с вашите проекти!

📚 Допълнителни ресурси


Статията е тествана с Traefik v3.0 и Docker Compose v2.0+ към юни 2025 г.

Федя Серафиев

Федя Серафиев

Федя Серафиев e собственик на уебсайта urocibg.eu. Той намира удовлетворение в това да помага на хората да решават и най-сложните технически проблеми. Сегашната му цел е да пише лесни за следване статии, така че подобни проблеми изобщо да не възникват.

Благодарим ви за прочитането на статията! Ако намерихте информацията за полезна, можете да дарите посредством бутоните по-долу: