devnik
devnik

Reputation: 421

multiple docker compose files with traefik (v2.1) and database networks

I would like to build a docker landscape. I use a container with a traefik (v2. 1) image and a mysql container for multiple databases.

traefik/docker-compose.yml

version: "3.3"

services:
  traefik:
    image: "traefik:v2.1"
    container_name: "traefik"
    restart: always
    command:
      - "--log.level=DEBUG"
      - "--api=true"
      - "--api.dashboard=true"
      - "--providers.docker=true"
      - "--providers.docker.exposedbydefault=false"
      - "--providers.docker.network=proxy"
      - "--entrypoints.web.address=:80"
      - "--entrypoints.websecure.address=:443"
      - "--entrypoints.traefik-dashboard.address=:8080"
      - "--certificatesresolvers.devnik-resolver.acme.httpchallenge=true"
      - "--certificatesresolvers.devnik-resolver.acme.httpchallenge.entrypoint=web"
      #- "--certificatesresolvers.devnik-resolver.acme.caserver=https://acme-staging-v02.api.letsencrypt.org/directory"
      - "--certificatesresolvers.devnik-resolver.acme.email=####"
      - "--certificatesresolvers.devnik-resolver.acme.storage=/letsencrypt/acme.json"
    ports:
      - "80:80"
      - "443:443"
      - "8080:8080"
    volumes:
      - "./letsencrypt:/letsencrypt"
      - "./data:/etc/traefik"
      - "/var/run/docker.sock:/var/run/docker.sock:ro"
    networks:
      - "proxy"
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.traefik.rule=Host(`devnik.dev`)"
      - "traefik.http.routers.traefik.entrypoints=traefik-dashboard"
      - "traefik.http.routers.traefik.tls.certresolver=devnik-resolver"
      #basic auth
      - "traefik.http.routers.traefik.service=api@internal"
      - "traefik.http.routers.traefik.middlewares=auth"
      - "traefik.http.middlewares.auth.basicauth.usersfile=/etc/traefik/.htpasswd"

#Docker Networks
networks:
  proxy:

database/docker-compose.yml

version: "3.3"

services:
  #MySQL Service
  mysql:
    image: mysql:5.7
    container_name: mysql
    restart: always
    ports:
      - "3306:3306"
    volumes:
      #persist data
      - ./mysqldata/:/var/lib/mysql/
      - ./init:/docker-entrypoint-initdb.d
    networks:
      - "mysql"
    environment:
      MYSQL_ROOT_PASSWORD: ####
      TZ: Europe/Berlin

#Docker Networks
networks:
  mysql:
    driver: bridge

For the structure I want to control all projects via multiple docker-compose files. These containers should run on the same network as the traefik container and some with the mysql container. This also works for the following case (but only sometimes)

dev-releases/docker-compose.yml

version: "3.3"

services:
  backend:
    image: "registry.gitlab.com/devnik/dev-releases-backend/master:latest"
    container_name: "dev-releases-backend"
    restart: always
    volumes:
      #laravel logs
      - "./logs/backend:/app/storage/logs"
      #cron logs
      - "./logs/backend/cron.log:/var/log/cron.log"
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.dev-releases-backend.rule=Host(`dev-releases.backend.devnik.dev`)"
      - "traefik.http.routers.dev-releases-backend.entrypoints=websecure"
      - "traefik.http.routers.dev-releases-backend.tls.certresolver=devnik-resolver"
    networks:
      - proxy
      - mysql
    environment:
      TZ: Europe/Berlin

#Docker Networks
networks:
  proxy:
    external:
      name: "traefik_proxy"
  mysql:
    external:
      name: "database_mysql"

As soon as I restart the containers in dev-releases/ via docker-compose up -d I get the typical error "Gateway timeout" when calling them in the browser. As soon as I comment the network networks: #- mysql and restart the docker-compose in dev-releases/ it works again.

My guess is that I have not configured the external networks correctly. Is it not possible to use 2 external networks? I'd like some container have access to the 'mysql' network but it should not be accessible for the whole traefik network.

Let me know if you need more information

EDIT (26.03.2020)

I make it running.

I put all my containers into one network "proxy". It seems mysql also have to be in the proxy network.

So I add following to database/docker-compose.yml

networks:
  proxy:
    external:
      name: "traefik_proxy"

And removed the database_mysql network out of dev-releases/docker-compose.yml

Upvotes: 4

Views: 11506

Answers (1)

Al-waleed Shihadeh
Al-waleed Shihadeh

Reputation: 2855

based on the names of the files, your mysql network should be mysql_mysql. you can verify this by executing

$> docker network ls

You are also missing a couple of labels for your services such as

traefik command line

- '--providers.docker.watch=true'
- '--providers.docker.swarmMode=true'

labels

- traefik.docker.network=proxy
- traefik.http.services.dev-releases-backend.loadbalancer.server.port=yourport
- traefik.http.routers.dev-releases-backend.service=mailcatcher

You can check this for more info

Upvotes: 0

Related Questions