Hi all.
I have multiple docker containers on my VM that all expose the same ports. Each docker container exposes 50+ TCP ports. My task is to be able to place a separate docker container on each subdomain, an example is below.
docker container 1 [prod]:
svc1.domain.com:5027
svc1.domain.com:5028
svc1.domain.com:5029
...
svc1.domain.com:5060
docker container 2 [stage]:
svc1-stage.domain.com:5027
svc1-stage.domain.com:5028
svc1-stage.domain.com:5029
...
svc1-stage.domain.com:5060
docker container 3 [dev]:
svc1-dev.domain.com:5027
svc1-dev.domain.com:5028
svc1-dev.domain.com:5029
...
svc1-dev.domain.com:5060
How can I do this with traefik? I saw a similar question on this link, but it didn't work for me.
I tried to implement this using docker provider and file provider, but it didn't work.
Traefik version: 2.7.0-rc2
Providers: Docker, File
traefik docker-compose.yml
version: "3.9"
volumes:
letsencrypt:
networks:
project_stage_network:
external: true
project_prod_network:
external: true
services:
traefik:
image: "traefik:v2.7"
container_name: "traefik"
restart: always
ports:
- 80:80
- 443:443
networks:
- project_stage_network
- project_prod_network
volumes:
- /var/run/docker.sock:/var/run/docker.sock:ro
- ./traefik.yml:/etc/traefik/traefik.yml
- ./dynamic_conf.yml:/etc/traefik/dynamic_conf.yml
- letsencrypt:/letsencrypt
labels:
- "traefik.enable=true"
- "traefik.http.routers.traefik.rule=Host(`${TRAEFIK_FQDN}`)"
- "traefik.http.routers.traefik.entrypoints=websecure"
- "traefik.http.routers.traefik.tls.certresolver=myresolver"
- "traefik.http.routers.traefik.service=api@internal"
- "traefik.http.services.traefik.loadbalancer.server.port=8080"
- "traefik.http.middlewares.traefik-compress.compress=true"
- "traefik.http.middlewares.auth.basicauth.users=${TRAEFIK_AUTH}"
- "traefik.http.routers.traefik.middlewares=traefik-compress,auth"
traefik.yaml
api:
insecure: true
dashboard: true
log:
level: info
format: json
providers:
docker:
exposedByDefault: false
file:
filename: /etc/traefik/dynamic_conf.yml
watch: true
entrypoints:
svc1_port1:
address: :5027
svc1_port2:
address: :5028
svc1_port3:
address: :5029
svc1_port4:
address: :5030
#...
certificatesresolvers:
myresolver:
acme:
email: admin@project.com
storage: "/letsencrypt/acme.json"
httpchallenge:
entrypoint: web
dynamic_conf.yml
tcp:
routers:
project:
rule: HostSNI(`svc1.domain.com`)
entryPoints:
- svc1_port1
- svc1_port2
- svc1_port3
- svc1_port4
# ...
service: project_svc1
services:
project_svc1:
weighted:
services:
- name: project_svc1_stage
weight: 1
project_svc1_stage:
loadBalancer:
servers:
- address: "some-service:5027"
- address: "some-service:5028"
- address: "some-service:5029"
- address: "some-service:5030"
# ...
project docker-compose.yml
version: "3.9"
networks:
network:
db_network:
external: true
services:
some-service:
image: private.svc.registry:latest
container_name: project_svc_old_${ENV}
restart: always
networks:
- network
- db_network
environment:
- NODE_ENV=production
- APP_HOST=0.0.0.0
ports:
- 5027
- 5028
- 5029
- 5030
# ...
labels:
- "traefik.enable=true"
- "traefik.docker.network=project_${ENV}_network"
- "traefik.tcp.routers.project_svc_old_${ENV}.rule=HostSNI(`svc1.domain.com`)"
#- "traefik.tcp.routers.project_svc_old_${ENV}.tls.certresolver=myresolver"
- "traefik.tcp.routers.project_svc_old_${ENV}.entrypoints=svc1_port1"
- "traefik.tcp.routers.project_svc_old_${ENV}.service=project_svc_old_${ENV}"
- "traefik.tcp.services.project_svc_old_${ENV}.loadbalancer.server.port=5027"
- "traefik.tcp.routers.project_svc_old_${ENV}.entrypoints=svc1_port2"
- "traefik.tcp.routers.project_svc_old_${ENV}.service=project_svc_old_${ENV}"
- "traefik.tcp.services.project_svc_old_${ENV}.loadbalancer.server.port=5028"
- "traefik.tcp.routers.project_svc_old_${ENV}.entrypoints=svc1_port3"
- "traefik.tcp.routers.project_svc_old_${ENV}.service=project_svc_old_${ENV}"
- "traefik.tcp.services.project_svc_old_${ENV}.loadbalancer.server.port=5029"
- "traefik.tcp.routers.project_svc_old_${ENV}.entrypoints=svc1_port4"
- "traefik.tcp.routers.project_svc_old_${ENV}.service=project_svc_old_${ENV}"
- "traefik.tcp.services.project_svc_old_${ENV}.loadbalancer.server.port=5030"
# ...
Thanks.