traefik 不遵守前端规则

traefik not respecting frontend rule

我正在尝试在我的 docker 主机上部署多个应用程序,并让 traefik 根据主机名将流量路由到不同的应用程序

我正在为我所有的 docker 容器使用 docker-compose

这是我的 traeffik.yaml 文件

version: '3.5'

services:
  traefik:
    image: traefik
    container_name: traefik
    command: --api --docker
    networks:
      - traefik_network
    ports:
      - "80:80"
      - "8080:8080"
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock

networks:
  traefik_network:
     name: traefik_network

这是我的 wpapp1.yaml 文件

version: '3.5'

services:
   mysql:
     image: mysql:5.7
     volumes:
       - wpapp1_mysql:/var/lib/mysql
     restart: always
     container_name: wpapp1_mysql
     networks:
       - traefik_network
     environment:
       MYSQL_ROOT_PASSWORD: wpapp1
       MYSQL_DATABASE: wpapp1
       MYSQL_USER: wpapp1
       MYSQL_PASSWORD: wpapp1
   wordpress:
     depends_on:
       - mysql
     image: wordpress:latest
     volumes:
       - wpapp1_wordpress:/var/www/html
     restart: always
     container_name: wpapp1_wordpress
     networks:
       - traefik_network
     labels:
      - "traefik.frontend.rule=Host:wpapp1.example.com"
      - "traefik.port=80"
      - "traefik.docker.network=traefik_network"
     environment:
       WORDPRESS_DB_HOST: mysql:3306
       WORDPRESS_DB_USER: wpapp1
       WORDPRESS_DB_PASSWORD: wpapp1
volumes:
    wpapp1_mysql:
      name: wpapp1_mysql
    wpapp1_wordpress:
      name: wpapp1_wordpress
networks:
    traefik_network:
      external:
         name: traefik_network

这是我的 wpapp2.yaml 文件

version: '3.5'

services:
   mysql:
     image: mysql:5.7
     volumes:
       - wpapp2_mysql:/var/lib/mysql
     restart: always
     container_name: wpapp2_mysql
     networks:
       - traefik_network
     environment:
       MYSQL_ROOT_PASSWORD: wpapp2
       MYSQL_DATABASE: wpapp2
       MYSQL_USER: wpapp2
       MYSQL_PASSWORD: wpapp2
   wordpress:
     depends_on:
       - mysql
     image: wordpress:latest
     volumes:
       - wpapp2_wordpress:/var/www/html
     restart: always
     container_name: wpapp2_wordpress
     networks:
       - traefik_network
     labels:
      - "traefik.frontend.rule=Host:wpapp2.example.com"
      - "traefik.port=80"
      - "traefik.docker.network=traefik_network"
     environment:
       WORDPRESS_DB_HOST: mysql:3306
       WORDPRESS_DB_USER: wpapp2
       WORDPRESS_DB_PASSWORD: wpapp2
volumes:
    wpapp2_mysql:
      name: wpapp2_mysql
    wpapp2_wordpress:
      name: wpapp2_wordpress
networks:
    traefik_network:
      external:
         name: traefik_network

所以现在我希望 traefik 基于主机名 wpapp1.example.comwpapp2.example.com 进行路由,但是 traefik 正在负载均衡流量!!!

所以当我转到 http:/wpapp1.example.com 时,traefik 正在两个应用程序之间对其进行负载平衡,其他主机名也是如此。现在确定这里发生了什么,因为我专门添加了 traefik.frontend.rule

我的意思是这到底是怎么回事? 我花了几个小时来弄清楚发生了什么,在我发疯之前,我决定到这里来寻求一些帮助来了解这里发生的事情。

将您的数据库放在不同的网络上。否则 WordPress 将对同一 docker 网络中的两个 mysql 实例进行 RR 负载平衡(当您在同一网络上有两个具有相同别名的容器时,这是预期的行为)。您可以使用默认网络执行此操作:

version: '3.5'

services:
   mysql:
     image: mysql:5.7
     volumes:
       - mysql:/var/lib/mysql
     restart: unless-stopped
     networks:
       - db
     environment:
       MYSQL_ROOT_PASSWORD: wpapp
       MYSQL_DATABASE: wpapp
       MYSQL_USER: wpapp
       MYSQL_PASSWORD: wpapp
   wordpress:
     depends_on:
       - mysql
     image: wordpress:latest
     volumes:
       - wordpress:/var/www/html
     restart: unless-stopped
     networks:
       - traefik
       - db
     labels:
      - "traefik.frontend.rule=Host:wpapp1.example.com"
      - "traefik.port=80"
      - "traefik.docker.network=traefik_network"
     environment:
       WORDPRESS_DB_HOST: mysql:3306
       WORDPRESS_DB_USER: wpapp
       WORDPRESS_DB_PASSWORD: wpapp
volumes:
    mysql:
    wordpress:
networks:
    db:
    traefik:
      external:
         name: traefik_network