Traefik, Docker — разные файлы docker-compose.yml

Мне нужно использовать Traefik для обратного прокси, для докера. Мой пользовательский случай требует запуска контейнеров из разных файлов docker-compose.yml. В идеале я хочу использовать файл docker-compose.yml для самого Traefik и разные файлы docker-compose.yml для других моих веб-сайтов. Наши веб-сайты взаимосвязаны, но происходят из разных потоков разработки (и из разных репозиториев). Это делается для того, чтобы разработчик мог сбрасывать сайты на свои локальные сайты, раскручивать каждый из них, разрабатывать код, а затем отправлять в соответствующий депозитарий. Я ищу примеры того, как правильно использовать метки для этого (если это правильный способ). Спасибо.

3 метода стилизации элементов HTML
3 метода стилизации элементов HTML
Когда дело доходит до применения какого-либо стиля к нашему HTML, существует три подхода: встроенный, внутренний и внешний. Предпочтительным обычно...
Формы c голосовым вводом в React с помощью Speechly
Формы c голосовым вводом в React с помощью Speechly
Пытались ли вы когда-нибудь заполнить веб-форму в области электронной коммерции, которая требует много кликов и выбора? Вас попросят заполнить дату,...
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Будучи разработчиком веб-приложений, легко впасть в заблуждение, считая, что приложение без JavaScript не имеет права на жизнь. Нам становится удобно...
Flatpickr: простой модуль календаря для вашего приложения на React
Flatpickr: простой модуль календаря для вашего приложения на React
Если вы ищете пакет для быстрой интеграции календаря с выбором даты в ваше приложения, то библиотека Flatpickr отлично справится с этой задачей....
В чем разница между Promise и Observable?
В чем разница между Promise и Observable?
Разберитесь в этом вопросе, и вы значительно повысите уровень своей компетенции.
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Клиент для URL-адресов, cURL, позволяет взаимодействовать с множеством различных серверов по множеству различных протоколов с синтаксисом URL.
0
0
69
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Использование Traefik и его меток для динамического развертывания, вероятно, является лучшим выбором, который вы можете сделать. Это упростит работу с маршрутизацией. Мы используем его внутри роя докеров, но это всего лишь компоновка с несколькими дополнительными шагами, чтобы вы могли повторно использовать нашу конфигурацию.

У вас должна быть 1 общая сеть для всех контейнеров и Traefik, чтобы разделить ее, чтобы он мог анализировать метки.

Для меток на стороне служб я использую:

  labels:
    # Traefik
    - "traefik.enable=true"
    - "traefik.docker.network=traefik-proxy" #that common network i was talking about

    # Routers
    - "traefik.http.routers.service-name.rule=Host(`$SWARM_HOST`) && PathPrefix(`/service-path`)"
    - "traefik.http.routers.service-name.service=service-name"
    - "traefik.http.routers.service-name.entrypoints=http" #configuration inside traefik stack
    - "traefik.http.routers.service-name.middlewares=strip-path-prefix" # we use this to strip the /service-path/... part off the request so all requests hit / inside our containers (no need to worry about that on the API side)

    # Services
    - "traefik.http.services.service-name.loadbalancer.server.port=${LISTEN_PORT}"

Для фактического сервиса Traefik я прикреплю всю конфигурацию компоновки, и вы можете вырезать только те части, которые вам нужны, и пропустить специфический материал роя:

    version: '3.9'

    services:
      traefik:
        # Use the latest v2.2.x Traefik image available
        image: traefik:v2.5.4
        healthcheck:
          test: ["CMD", "traefik", "healthcheck", "--ping"]
          interval: 10s
          timeout: 5s
          retries: 3
          start_period: 15s
        deploy:
          mode: global
          update_config:
            order: start-first
            failure_action: rollback
            parallelism: 1
            delay: 15s
            monitor: 30s
          restart_policy:
            condition: any
            delay: 10s
            max_attempts: 3
          labels:
            # Enable Traefik for this service, to make it available in the public network
            - "traefik.enable=true"
            # Use the traefik-public network (declared below)
            - "traefik.docker.network=traefik-proxy"
            # Uses the environment variable DOMAIN
            - "traefik.http.routers.dashboard.rule=Host(`swarm-traefik.company.org`)"
            - "traefik.http.routers.dashboard.entrypoints=http"
            # Use the special Traefik service api@internal with the web UI/Dashboard
            - "traefik.http.routers.dashboard.service=api@internal"
            # Enable HTTP Basic auth, using the middleware created above
            - "traefik.http.routers.dashboard.middlewares=admin-auth"
            # Define the port inside of the Docker service to use
            - "traefik.http.services.dashboard.loadbalancer.server.port=8080"

            # Middlewares
            - "traefik.http.middlewares.strip-path-prefix.replacepathregex.regex=^/[a-z,0-9,-]+/(.*)"
            - "traefik.http.middlewares.strip-path-prefix.replacepathregex.replacement=/$$1"
            # admin-auth middleware with HTTP Basic auth
            - "traefik.http.middlewares.admin-auth.basicauth.users=TODO_GENERATE_USER_BASIC_AUTH"
          placement:
            constraints:
              - "node.role==manager"
        volumes:
          # Add Docker as a mounted volume, so that Traefik can read the labels of other services
          - /var/run/docker.sock:/var/run/docker.sock:ro
        command:
          # Enable Docker in Traefik, so that it reads labels from Docker services
          - --providers.docker
          # Do not expose all Docker services, only the ones explicitly exposed
          - --providers.docker.exposedbydefault=false
          # Enable Docker Swarm mode
          - --providers.docker.swarmmode
          # Adds default network
          - --providers.docker.network=traefik-proxy
          # Create an entrypoint "http" listening on port 80
          - --entrypoints.http.address=:80
          # Enable the Traefik log, for configurations and errors
          - --log
          #- --log.level=INFO
          # Enable the Dashboard and API
          - --api
          # Enable Access log - in our case we dont need it because we have Nginx infront which has top level access logs
          # - --accesslog
          # Enable /ping healthcheck route
          - --ping=true
          # Enable zipkin tracing & configuration
          #- --tracing.zipkin=true
          #- --tracing.zipkin.httpEndpoint=https://misc-zipkin.company.org/api/v2/spans
        networks:
          # Use the public network created to be shared between Traefik and
          # any other service that needs to be publicly available with HTTPS
          - treafik-proxy

    networks:
      traefik-proxy:
        external: true

Спасибо. Просто решил это самостоятельно, но очень благодарен за ответ.

ArisK 24.04.2022 20:23

Другие вопросы по теме