Search code examples
dockerdocker-composetraefikminio

Traefik: Aggregate multiple docker services into a single logical backend


I'm running minio using its official docker-compose file which creates 4 services (containers): minio1,minio2,minio3,minio4. Traefik treats them as 4 unique services, but in reality, they should be treated as a single backend, that is, I want Traefik to generate 1 frontend an 1 backend (with 4 servers) for minio. I tried putting them into a single group(servicefabric.groupname) but to no avail. I have the following labels set for each minio service:

  labels:
    - "traefik.servicefabric.groupname=minio"
    - "traefik.basic.frontend.rule=Host:foo.bar.com"
    - "traefik.weight=10"  # 10,20,30,40 incremented per service
    - "traefik.frontend.rule=Host:traefik"
    - "traefik.port=9000"
  container_name: minio*

Is there any way to achieve this?


Solution

  • All minio services have to have the same frontend rule and the same backend name.

      labels:
      - "traefik.frontend.rule=Host:minio.${DOMAIN}"
      - "traefik.backend=minio"
      - "traefik.port=9000"
    

    Also I think you misunderstood the meaning of "backend". A backend is a server to which Traefik route traffic based on the frontend rules. Same as "upstream"/"location" in nginx.


    Edit

    As stated in the comment, this configuration creates multiple frontends all pointing to the same backend, although functional this looks ugly. A quick solution is to just have one service with ‘frontend’ but if that service goes down, the frontend will be gone too.

    A better way to do this is to set it in the config file, traefik.toml:

    [frontends]
      [frontends.frontend1]
      backend = "minio"
        [frontends.frontend1.minio]
        rule = "Host: minio.${DOMAIN}”