Вопрос или проблема
У меня возникли проблемы с настройкой Traefik для маршрутизации трафика к моему контейнеру wallet-service
в Docker Compose. Хотя я могу получить доступ к сервису напрямую через curl http://localhost:3000
на хост-машине, Traefik не может подключиться, пытаясь достучаться до внутреннего Docker IP (192.168.64.4:3000
), вместо того чтобы использовать сопоставленный порт хоста.
Что я уже пробовал
-
Настроил Traefik с правильными метками:
- Указал внутренние порты в метках Traefik.
- Убедился, что сервисы подключены к одной и той же Docker-сети.
-
Проверил доступность сервиса:
- Прямые запросы
curl
кlocalhost:3000
возвращают правильный ответ. - Подтвердил, что
wallet-service
слушает на всех интерфейсах (0.0.0.0
).
- Прямые запросы
-
Проверил логи 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
, что вызывает проблему, так как этот адрес не соответствует вашему локальному порту.
Возможные причины и способы решения
-
Проверка конфигурации сети
- Убедитесь, что ваш
wallet-service
и Traefik подключены к одной и той же сети Docker. В вашем случаеtraefik-public
является внешней сетью, и стоит проверить, корректно ли настроены обе службы в этой сети.
- Убедитесь, что ваш
-
Правильное использование меток (labels)
- Обратите внимание, что метка
traefik.http.services.wallet-service.loadbalancer.server.port=3000
указывает на внутренний порт контейнера. Это может быть верно, но если Traefik пытается подключиться к192.168.64.4:3000
, возможно, есть проблема со способом, которым Traefik разрешает адреса ваших контейнеров.
- Обратите внимание, что метка
-
Правильности конфигурации маршрутов (routers)
- Проверьте, правильно ли описаны правила маршрутизации. Убедитесь, что правило
traefik.http.routers.wallet-service.rule=Host(${DOMAIN})
корректно интерпретируется. Если переменная${DOMAIN}
не определена, это может вызывать проблемы при маршрутизации трафика.
- Проверьте, правильно ли описаны правила маршрутизации. Убедитесь, что правило
-
Проверка конфигурации Traefik
- Убедитесь, что Traefik правильно настраивается для работы с Docker. В вашем конфигурационном файле Traefik необходимо указать, что он должен использовать провайдер Docker. Вы уже это сделали, но убедитесь, что ваш Traefik правильно подключается к сокету Docker.
- Обратите внимание на уровень логирования, который вы указали. Вам нужно смотреть в файлы логов, чтобы лучше понять, почему Traefik использует IP-адрес
192.168.64.4
.
-
Проверка доступа через доменное имя
- Убедитесь, что доменное имя, связанное с вашей конфигурацией, правильно настроено и может корректно разрешаться в 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 или другие сетевые настройки, в зависимости от вашего хостинга.
Если у вас остались вопросы или вам нужна помощь, не стесняйтесь обратиться снова. Удачи в настройке сервиса!