├── README.md ├── dashboard.png ├── docker-compose-01.yml ├── docker-compose-02.yml ├── docker-compose-03.yml ├── docker-compose-04.yml ├── docker-compose-05.yml ├── docker-compose-06.yml ├── docker-compose-07.yml └── docker-compose-08.yml /README.md: -------------------------------------------------------------------------------- 1 | # Traefik + Docker 2 | 3 | ## Prerequisites 4 | 5 | - Docker Engine 17.06.0+ 6 | 7 | ## Getting Started 8 | 9 | To run examples: 10 | 11 | ```bash 12 | docker-compose -f docker-compose-01.yml up 13 | ``` 14 | 15 | Cancel (Ctrl+C) to stop the stack. 16 | 17 | ### Index 18 | 19 | - [Intro](./docker-compose-01.yml) 20 | - [Let's Enable the Dashboard](./docker-compose-02.yml) 21 | - [Handle Requests Based on Host](./docker-compose-03.yml) 22 | - [Listen on a Specific Port](./docker-compose-04.yml) 23 | - [Basic Auth](./docker-compose-05.yml) 24 | - [HTTPS + Auto Certificate Generation](./docker-compose-06.yml) 25 | - [HTTPS Redirection](./docker-compose-07.yml) 26 | - [Everything](./docker-compose-08.yml) 27 | -------------------------------------------------------------------------------- /dashboard.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/traefik-tech-blog/traefik-docker101/4b75d98c8d37945d999ddd475d8f2e8c8c6fed5b/dashboard.png -------------------------------------------------------------------------------- /docker-compose-01.yml: -------------------------------------------------------------------------------- 1 | version: "3.3" 2 | 3 | services: 4 | traefik: 5 | image: "traefik:v2.6" 6 | command: 7 | - --entrypoints.web.address=:80 8 | - --providers.docker 9 | ports: 10 | - "80:80" 11 | volumes: 12 | - "/var/run/docker.sock:/var/run/docker.sock:ro" 13 | 14 | my-app: 15 | image: traefik/whoami:v1.7.1 16 | -------------------------------------------------------------------------------- /docker-compose-02.yml: -------------------------------------------------------------------------------- 1 | version: "3.3" 2 | 3 | services: 4 | traefik: 5 | image: "traefik:v2.6" 6 | command: 7 | - --entrypoints.web.address=:80 8 | - --providers.docker 9 | - --api.insecure 10 | ports: 11 | - "80:80" 12 | - "8080:8080" 13 | volumes: 14 | - "/var/run/docker.sock:/var/run/docker.sock:ro" 15 | 16 | my-app: 17 | image: traefik/whoami:v1.7.1 18 | 19 | # Dashboard (https://localhost:8080) 20 | -------------------------------------------------------------------------------- /docker-compose-03.yml: -------------------------------------------------------------------------------- 1 | version: "3.3" 2 | 3 | services: 4 | traefik: 5 | image: "traefik:v2.6" 6 | command: 7 | - --entrypoints.web.address=:80 8 | - --providers.docker 9 | - --api.insecure 10 | ports: 11 | - "80:80" 12 | - "8080:8080" 13 | volumes: 14 | - "/var/run/docker.sock:/var/run/docker.sock:ro" 15 | 16 | my-app: 17 | image: traefik/whoami:v1.7.1 18 | labels: 19 | - "traefik.http.routers.my-app.rule=Host(`whoami.docker.localhost`)" 20 | 21 | # Dashboard (https://localhost:8080) 22 | # Route (http://whoami.docker.localhost/) 23 | -------------------------------------------------------------------------------- /docker-compose-04.yml: -------------------------------------------------------------------------------- 1 | version: "3.3" 2 | 3 | services: 4 | traefik: 5 | image: "traefik:v2.6" 6 | command: 7 | - --entrypoints.web.address=:80 8 | - --providers.docker 9 | - --api.insecure 10 | ports: 11 | - "80:80" 12 | - "8080:8080" 13 | volumes: 14 | - "/var/run/docker.sock:/var/run/docker.sock:ro" 15 | 16 | my-app: 17 | image: traefik/whoami:v1.7.1 18 | command: 19 | # It tells whoami to start listening on 8082 instead of 80 20 | - --port=8082 21 | labels: 22 | - "traefik.http.routers.my-app.rule=Host(`whoami.docker.localhost`)" 23 | - "traefik.http.services.my-app.loadbalancer.server.port=8082" 24 | 25 | # Dashboard (https://localhost:8080) 26 | # Route (http://whoami.docker.localhost/) 27 | # Server port 28 | -------------------------------------------------------------------------------- /docker-compose-05.yml: -------------------------------------------------------------------------------- 1 | version: "3.3" 2 | 3 | services: 4 | traefik: 5 | image: "traefik:v2.6" 6 | command: 7 | - --entrypoints.web.address=:80 8 | - --providers.docker 9 | - --api.insecure 10 | ports: 11 | - "80:80" 12 | - "8080:8080" 13 | volumes: 14 | - "/var/run/docker.sock:/var/run/docker.sock:ro" 15 | 16 | my-app: 17 | image: traefik/whoami:v1.7.1 18 | labels: 19 | - "traefik.http.routers.my-app.rule=Host(`whoami.docker.localhost`)" 20 | - "traefik.http.routers.my-app.middlewares=auth" 21 | - "traefik.http.middlewares.auth.basicauth.users=user:$$apr1$$q8eZFHjF$$Fvmkk//V6Btlaf2i/ju5n/" # user/password 22 | 23 | # Dashboard (https://localhost:8080) 24 | # Route (http://whoami.docker.localhost/) 25 | # Basic auth (login: user | password: password) 26 | -------------------------------------------------------------------------------- /docker-compose-06.yml: -------------------------------------------------------------------------------- 1 | version: "3.3" 2 | 3 | services: 4 | traefik: 5 | image: "traefik:v2.6" 6 | command: 7 | - --entrypoints.web.address=:80 8 | - --entrypoints.websecure.address=:443 9 | - --providers.docker 10 | - --api.insecure 11 | - --certificatesresolvers.leresolver.acme.caserver=https://acme-staging-v02.api.letsencrypt.org/directory 12 | - --certificatesresolvers.leresolver.acme.email=your@email.com 13 | - --certificatesresolvers.leresolver.acme.storage=/acme.json 14 | - --certificatesresolvers.leresolver.acme.tlschallenge=true 15 | ports: 16 | - "80:80" 17 | - "443:443" 18 | - "8080:8080" 19 | volumes: 20 | - "/var/run/docker.sock:/var/run/docker.sock:ro" 21 | - "./acme.json:/acme.json" 22 | 23 | my-app: 24 | image: traefik/whoami:v1.7.1 25 | labels: 26 | - "traefik.http.routers.my-app.rule=Host(`whoami.docker.localhost`)" 27 | - "traefik.http.routers.my-app.middlewares=auth" 28 | - "traefik.http.routers.my-app.entrypoints=websecure" 29 | - "traefik.http.routers.my-app.tls.certresolver=leresolver" 30 | - "traefik.http.middlewares.auth.basicauth.users=user:$$apr1$$q8eZFHjF$$Fvmkk//V6Btlaf2i/ju5n/" # user/password 31 | 32 | # Dashboard (https://localhost:8080) 33 | # Route 34 | # Basic auth (login: user | password: password) 35 | # Let's Encrypt (https://whoami.docker.localhost/) 36 | 37 | # touch acme.json; chmod 600 acme.json 38 | -------------------------------------------------------------------------------- /docker-compose-07.yml: -------------------------------------------------------------------------------- 1 | version: "3.3" 2 | 3 | services: 4 | traefik: 5 | image: "traefik:v2.6" 6 | command: 7 | - --entrypoints.web.address=:80 8 | - --entrypoints.websecure.address=:443 9 | - --providers.docker 10 | - --api 11 | - --certificatesresolvers.leresolver.acme.caserver=https://acme-staging-v02.api.letsencrypt.org/directory 12 | - --certificatesresolvers.leresolver.acme.email=your@email.com 13 | - --certificatesresolvers.leresolver.acme.storage=/acme.json 14 | - --certificatesresolvers.leresolver.acme.tlschallenge=true 15 | ports: 16 | - "80:80" 17 | - "443:443" 18 | - "8080:8080" 19 | volumes: 20 | - "/var/run/docker.sock:/var/run/docker.sock:ro" 21 | - "./acme.json:/acme.json" 22 | labels: 23 | # global redirect to https 24 | - "traefik.http.routers.http-catchall.rule=hostregexp(`{host:.+}`)" 25 | - "traefik.http.routers.http-catchall.entrypoints=web" 26 | - "traefik.http.routers.http-catchall.middlewares=redirect-to-https" 27 | 28 | # middleware redirect 29 | - "traefik.http.middlewares.redirect-to-https.redirectscheme.scheme=https" 30 | 31 | my-app: 32 | image: traefik/whoami:v1.7.1 33 | labels: 34 | - "traefik.http.routers.my-app.rule=Host(`whoami.docker.localhost`)" 35 | - "traefik.http.routers.my-app.middlewares=auth" 36 | - "traefik.http.routers.my-app.entrypoints=websecure" 37 | - "traefik.http.routers.my-app.tls=true" 38 | - "traefik.http.routers.my-app.tls.certresolver=leresolver" 39 | - "traefik.http.middlewares.auth.basicauth.users=user:$$apr1$$q8eZFHjF$$Fvmkk//V6Btlaf2i/ju5n/" # user/password 40 | 41 | # Dashboard (https://localhost:8080) 42 | # Route 43 | # Basic auth (login: user | password: password) 44 | # Let's Encrypt (https://whoami.docker.localhost/) 45 | # Global HTTP to HTTPS redirection (http://whoami.docker.localhost/) 46 | 47 | # touch acme.json; chmod 600 acme.json 48 | -------------------------------------------------------------------------------- /docker-compose-08.yml: -------------------------------------------------------------------------------- 1 | version: "3.3" 2 | 3 | services: 4 | traefik: 5 | image: "traefik:v2.6" 6 | command: 7 | - --entrypoints.web.address=:80 8 | - --entrypoints.websecure.address=:443 9 | - --providers.docker 10 | - --api 11 | - --certificatesresolvers.leresolver.acme.caserver=https://acme-staging-v02.api.letsencrypt.org/directory 12 | - --certificatesresolvers.leresolver.acme.email=your@email.com 13 | - --certificatesresolvers.leresolver.acme.storage=/acme.json 14 | - --certificatesresolvers.leresolver.acme.tlschallenge=true 15 | ports: 16 | - "80:80" 17 | - "443:443" 18 | volumes: 19 | - "/var/run/docker.sock:/var/run/docker.sock:ro" 20 | - "./acme.json:/acme.json" 21 | labels: 22 | # Dashboard 23 | - "traefik.http.routers.traefik.rule=Host(`traefik.docker.localhost`)" 24 | - "traefik.http.routers.traefik.service=api@internal" 25 | - "traefik.http.routers.traefik.tls.certresolver=leresolver" 26 | - "traefik.http.routers.traefik.entrypoints=websecure" 27 | - "traefik.http.routers.traefik.middlewares=authtraefik" 28 | - "traefik.http.middlewares.authtraefik.basicauth.users=user:$$apr1$$q8eZFHjF$$Fvmkk//V6Btlaf2i/ju5n/" # user/password 29 | 30 | # global redirect to https 31 | - "traefik.http.routers.http-catchall.rule=hostregexp(`{host:.+}`)" 32 | - "traefik.http.routers.http-catchall.entrypoints=web" 33 | - "traefik.http.routers.http-catchall.middlewares=redirect-to-https" 34 | 35 | # middleware redirect 36 | - "traefik.http.middlewares.redirect-to-https.redirectscheme.scheme=https" 37 | 38 | my-app: 39 | image: traefik/whoami:v1.7.1 40 | labels: 41 | - "traefik.http.routers.my-app.rule=Host(`whoami.docker.localhost`)" 42 | - "traefik.http.routers.my-app.middlewares=auth" 43 | - "traefik.http.routers.my-app.entrypoints=websecure" 44 | - "traefik.http.routers.my-app.tls=true" 45 | - "traefik.http.routers.my-app.tls.certresolver=leresolver" 46 | - "traefik.http.middlewares.auth.basicauth.users=user:$$apr1$$q8eZFHjF$$Fvmkk//V6Btlaf2i/ju5n/" # user/password 47 | 48 | # Dashboard (https://localhost:8080) 49 | # Route 50 | # Basic auth (login: user | password: password) 51 | # Let's Encrypt (https://whoami.docker.localhost/) 52 | # Global HTTP to HTTPS redirection (http://whoami.docker.localhost/) 53 | # Dashboard [api@internal] 54 | # Dashboard [api@internal] + Basic auth (login: user | password: password) 55 | # Dashboard [api@internal] + TLS (https://traefik.docker.localhost/) 56 | 57 | # touch acme.json; chmod 600 acme.json 58 | --------------------------------------------------------------------------------