Search code examples
dockerdocker-composetraefik

TraefikV2 : access container with custom network


I'm using this config (simplified)

version: '3.8'

services:
  mysql:
    container_name: mysql
    image: mysql:8.0
    restart: always
    command: --default-authentication-plugin=mysql_native_password
    environment:
      MYSQL_ROOT_PASSWORD: root
      MYSQL_DATABASE: test
      MYSQL_USER: symfony
      MYSQL_PASSWORD: symfony
      MYSQL_ALLOW_EMPTY_PASSWORD: 'yes'
    ports:
      - 3306:3306
    volumes:
      - db-data:/var/lib/mysql
    networks:
        - dev
    labels:
      traefik.enable: true
      traefik.http.routers.mysql.rule: Host(`mysql.vws.dev`)
      traefik.http.services.mysql.loadbalancer.server.port: 3306

  phpmyadmin:
    image: phpmyadmin
    container_name: phpmyadmin
    restart: always
    depends_on:
        - mysql
    ports:
        - 8090:80
    links:
      - mysql
    environment:
      PMA_HOST: mysql
      PMA_PORT: 3306
    networks:
        - dev
    labels:
      traefik.enable: true
      traefik.http.routers.phpmyadmin.rule: Host(`phpmyadmin.vws.dev`)
      traefik.http.services.phpmyadmin.loadbalancer.server.port: 80

  reverse-proxy:
    container_name: traefik
    image: traefik:v2.5
    command: --api.insecure=true --providers.docker

    ports:
      - "80:80"
      - "8080:8080"
    volumes:
      - "/var/run/docker.sock:/var/run/docker.sock:ro"

volumes:
  db-data:

networks:
  dev:

So the mysql & phpmyadmin containers can communicate together well, but when I try to access phpmyadmin in browser via http://phpmyadmin.vws.dev/ I have a Gateway Timeout.

NOTE : I can acess phpmyadmin just fine when I remove the Network: dev from the phpmyadmin spec, but then when I try to log in it just can't access the mysql db


Solution

  • Turns out everything works fine if I put all services in ONE network.

    version: '3.8'
    
    services:
      mysql:
        container_name: mysql
        image: mysql:8.0
        restart: always
        command: --default-authentication-plugin=mysql_native_password
        environment:
          MYSQL_ROOT_PASSWORD: root
          MYSQL_DATABASE: test
          MYSQL_USER: symfony
          MYSQL_PASSWORD: symfony
          MYSQL_ALLOW_EMPTY_PASSWORD: 'yes'
        ports:
          - 3306:3306
        volumes:
          - db-data:/var/lib/mysql
        networks:
            - dev
        labels:
          traefik.enable: true
          traefik.http.routers.mysql.rule: Host(`mysql.vws.dev`)
          traefik.http.services.mysql.loadbalancer.server.port: 3306
    
      phpmyadmin:
        image: phpmyadmin
        container_name: phpmyadmin
        restart: always
        depends_on:
            - mysql
        ports:
            - 8090:80
        links:
          - mysql
        environment:
          PMA_HOST: mysql
          PMA_PORT: 3306
        networks:
            - dev
        labels:
          traefik.enable: true
          traefik.http.routers.phpmyadmin.rule: Host(`phpmyadmin.vws.dev`)
          traefik.http.services.phpmyadmin.loadbalancer.server.port: 80
    
      reverse-proxy:
        container_name: traefik
        image: traefik:v2.5
        command: --api.insecure=true --providers.docker
    
        ports:
          - "80:80"
          - "8080:8080"
        volumes:
          - "/var/run/docker.sock:/var/run/docker.sock:ro"
         networks: 
          - dev
    
    volumes:
      db-data:
    
    networks:
      dev:
    

    Be careful, if you declare more than one network for your phpmyadmin (let's say you connect it to a dev network to connect with bdd and traefik-public to connect it to Traekik), it won't work.

    Please be aware that I have no idea if this is good practice, as mysql has no reason to be in the same network as Traefik, however this will save my mental sanity for now. I will accept this answer if there's no better explanation until tomorrow.