Traefik container router

Submitted by Erik Wegner on Sun, 03/20/2022 - 16:55
Body

My development system runs multiple containers for several web based apps. Traffic should be routed by rules through one single entry point. Here is a possible configuration with traefik as router.

Setup

Several web applications are run as docker-compose stacks. To enable sharing, one docker network connects the traefik container with all frontend app containers.

To create the common network, use this command:

docker network create --driver=bridge --attachable --internal=false traefik

Run traefik

To run traefik, use this docker-compose file:

version: '3'

services:
  reverse-proxy:
    # The official v2 Traefik docker image
    image: traefik:v2.6
    # Enables the web UI and tells Traefik to listen to docker
    command: --api.insecure=true --providers.docker --providers.docker.network=traefik
    container_name: "traefik80"
    restart: "always"
    labels:
      - "traefik.enabled=false"
    ports:
      # The HTTP port
      - "80:80"
      # The Web UI (enabled by --api.insecure=true)
      - "8080:8080"
    volumes:
      # So that Traefik can listen to the Docker events
      - /var/run/docker.sock:/var/run/docker.sock
    networks:
      - default

networks:
  default:
    external:
      name: traefik

Then start the instance: docker-compose up -d

The traefik dashboard provides information about enabled routes and is available at http://127.0.0.1:8080/.

Simple example application

version: '3'

services:
  adminer:
    image: adminer:4.8.1
    networks:
      - traefik
    labels:
      - traefik.http.routers.adminer.rule=Host(`adminer.localhost`)

The adminer application is now available at http://adminer.localhost/.

Complex example

version: '3'

services:
  adminer:
    image: adminer:4.8.1
    networks:
      - default
      - traefik
    labels:
      - traefik.http.routers.adminer.rule=Host(`adminer.localhost`)

  maildev:
    image: maildev/maildev
    labels:
      - traefik.http.routers.maildev.rule=Host(`maildev.localhost`)
      - traefik.http.services.maildev.loadbalancer.server.port=80
    networks:
      - default
      - traefik

  database:
    image: mysql:8.0
    environment:
      - MYSQL_ROOT_PASSWORD=admin1234
      - MYSQL_PASSWORD=app123
      - MYSQL_DATABASE=app
      - MYSQL_USER=appuser
    labels:
      - "traefik.enable=false"
    volumes:
      - db:/var/lib/mysql
    networks:
      - default

networks:
  traefik:
    external: true

volumes:
  db: null

The database container is not connected to the traefik network.