Traefik не может направить трафик на настройку Docker Compose

Вопрос или проблема

У меня возникли проблемы с настройкой Traefik для маршрутизации трафика к моему контейнеру wallet-service в Docker Compose. Хотя я могу получить доступ к сервису напрямую через curl http://localhost:3000 на хост-машине, Traefik не может подключиться, пытаясь достучаться до внутреннего Docker IP (192.168.64.4:3000), вместо того чтобы использовать сопоставленный порт хоста.

Что я уже пробовал

  1. Настроил Traefik с правильными метками:

    • Указал внутренние порты в метках Traefik.
    • Убедился, что сервисы подключены к одной и той же Docker-сети.
  2. Проверил доступность сервиса:

    • Прямые запросы curl к localhost:3000 возвращают правильный ответ.
    • Подтвердил, что wallet-service слушает на всех интерфейсах (0.0.0.0).
  3. Проверил логи Traefik:

    • Включил отладку и журналы доступа в Traefik.
    • Наблюдал, как Traefik пытается подключиться к 192.168.64.4:3000.

Несмотря на эти настройки, Traefik не может маршрутизировать трафик к моему wallet-service.

Конфигурация Docker Compose

version: '3.8'

services:
  wallet-service:
    ports:
      - '3000:3000'
    labels:
      - 'traefik.enable=true'
      - 'traefik.http.routers.wallet-service.rule=Host(`${DOMAIN}`)'
      - 'traefik.http.routers.wallet-service.entrypoints=websecure'
      - 'traefik.http.routers.wallet-service.tls.certresolver=myresolver'
      - 'traefik.http.services.wallet-service.loadbalancer.server.port=3000'
    networks:
      - internal-network
      - traefik-public

  caller-service:
    ports:
      - '3001:3001'
    labels:
      - 'traefik.enable=true'
      - 'traefik.http.routers.caller-service.rule=Host(`caller.${DOMAIN}`)'
      - 'traefik.http.routers.caller-service.entrypoints=websecure'
      - 'traefik.http.routers.caller-service.tls.certresolver=myresolver'
    networks:
      - internal-network
      - traefik-public

  postgres:
    image: postgres:13
    ports:
      - '5432:5432'
    networks:
      - internal-network

  rabbitmq:
    image: rabbitmq:3-management
    ports:
      - '5672:5672'
      - '15672:15672'
    labels:
      - 'traefik.enable=true'
      - 'traefik.http.routers.rabbitmq.rule=Host(`rabbitmq.${DOMAIN}`)'
      - 'traefik.http.routers.rabbitmq.entrypoints=websecure'
      - 'traefik.http.routers.rabbitmq.tls.certresolver=myresolver'
    networks:
      - internal-network
      - traefik-public

volumes:
  postgres-data:
    name: wallet-postgres-data

networks:
  internal-network:
    driver: bridge
  traefik-public:
    external: true

Конфигурация Traefik

services:
  traefik:
    image: traefik:v2.9
    command:
      - "--api=true"
      - "--providers.docker=true"
      - "--entrypoints.web.address=:80"
      - "--entrypoints.websecure.address=:443"
      - "--certificatesresolvers.myresolver.acme.tlschallenge=true"
      - "[email protected]"
      - "--certificatesresolvers.myresolver.acme.storage=/letsencrypt/acme.json"
      - "--log.level=DEBUG" # Увеличить уровень детализации логов
      - "--accesslog=true" # Включить журналы доступа
      - "--accesslog.filepath=/var/log/traefik/access.log"
      - "--log.filepath=/var/log/traefik/traefik.log"
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - "/var/run/docker.sock:/var/run/docker.sock:ro"
      - "./letsencrypt:/letsencrypt"
      - "./logs:/var/log/traefik" # Подключить том для логов
    networks:
      - traefik-public

networks:
  traefik-public:
    external: true
    name: traefik-public

Соответствующие логи

При посещении публичного домена Traefik пытается подключиться к 192.168.64.4:3000, что не соответствует сопоставлению порта хоста. Тем не менее, доступ к http://localhost:3000 напрямую на хосте возвращает ожидаемый ответ:

curl http://localhost:3000
Сервис работает!

Ответ или решение

Проблема с маршрутизацией в Traefik для Docker Compose

Здравствуйте! Похоже, вы сталкиваетесь с проблемой настройки маршрутизации трафика в Traefik для вашего контейнера wallet-service, используя Docker Compose. Ниже представлены основные шаги по устранению этой проблемы, а также рекомендации по улучшению конфигурации.

Описание проблемы

Вы можете успешно получить доступ к вашему wallet-service, используя команду curl http://localhost:3000, но при попытке доступа через Traefik, он обращается к IP-адресу 192.168.64.4:3000, что вызывает проблему, так как этот адрес не соответствует вашему локальному порту.

Возможные причины и способы решения

  1. Проверка конфигурации сети

    • Убедитесь, что ваш wallet-service и Traefik подключены к одной и той же сети Docker. В вашем случае traefik-public является внешней сетью, и стоит проверить, корректно ли настроены обе службы в этой сети.
  2. Правильное использование меток (labels)

    • Обратите внимание, что метка traefik.http.services.wallet-service.loadbalancer.server.port=3000 указывает на внутренний порт контейнера. Это может быть верно, но если Traefik пытается подключиться к 192.168.64.4:3000, возможно, есть проблема со способом, которым Traefik разрешает адреса ваших контейнеров.
  3. Правильности конфигурации маршрутов (routers)

    • Проверьте, правильно ли описаны правила маршрутизации. Убедитесь, что правило traefik.http.routers.wallet-service.rule=Host(${DOMAIN}) корректно интерпретируется. Если переменная ${DOMAIN} не определена, это может вызывать проблемы при маршрутизации трафика.
  4. Проверка конфигурации Traefik

    • Убедитесь, что Traefik правильно настраивается для работы с Docker. В вашем конфигурационном файле Traefik необходимо указать, что он должен использовать провайдер Docker. Вы уже это сделали, но убедитесь, что ваш Traefik правильно подключается к сокету Docker.
    • Обратите внимание на уровень логирования, который вы указали. Вам нужно смотреть в файлы логов, чтобы лучше понять, почему Traefik использует IP-адрес 192.168.64.4.
  5. Проверка доступа через доменное имя

    • Убедитесь, что доменное имя, связанное с вашей конфигурацией, правильно настроено и может корректно разрешаться в IP-адрес вашего сервера.

Рекомендации по исправлению конфигурации

Вот пример, как можно улучшить вашу конфигурацию Docker Compose:

version: '3.8'

services:
  wallet-service:
    image: ваше_имя_изображения
    ports:
      - '3000:3000'
    labels:
      - 'traefik.enable=true'
      - 'traefik.http.routers.wallet-service.rule=Host(`wallet.${DOMAIN}`)' 
      - 'traefik.http.routers.wallet-service.entrypoints=websecure'
      - 'traefik.http.routers.wallet-service.tls.certresolver=myresolver'
      - 'traefik.http.services.wallet-service.loadbalancer.server.port=3000'
    networks:
      - internal-network
      - traefik-public

# Остальные сервисы ...

networks:
  internal-network:
    driver: bridge
  traefik-public:
    external: true

Обратите внимание на следующее:

  • Убедитесь, что DOMAIN корректно задан и имеет корректное значение.
  • Проверьте, действительно ли все службы из конфигурации Docker Compose видны Traefik.

Заключение

Если вы все еще сталкиваетесь с проблемами после выполнения этих шагов, попробуйте удалить и пересоздать сети и контейнеры, чтобы убедиться в том, что изменения конфигурации применены. Также стоит проверить, как свойства вашего окружения влияют на VPC или другие сетевые настройки, в зависимости от вашего хостинга.

Если у вас остались вопросы или вам нужна помощь, не стесняйтесь обратиться снова. Удачи в настройке сервиса!

Оцените материал
Добавить комментарий

Капча загружается...