【问题标题】:How to mae Traefik as reverse-proxy with docker-compose?如何使用 docker-compose 使 Traefik 成为反向代理?
【发布时间】:2020-03-17 19:58:13
【问题描述】:

我在 apache 上使用 symfony 构建 docker-compose,在 nginx 上使用 angular 构建。有可能可以运行更多的 docker-composition,所以现在我想使用 traefik 制作自己的 DNS - 我想设置每个应用程序的主机名,让 docker-compose up 并在准备好时使用主机名解析应用程序。

Traefik docker-compose:

version: '3.1'

networks:
  proxy:
    external: true
  internal:
    external: false

services:
  traefik:
    image: traefik:v2.1
    command: --api.insecure=true --providers.docker
    labels:
      - traefik.frontend.rule=Host:monitor.docker.localhost
      - traefik.port=8080
    networks:
      - proxy
    ports:
      - 80:80
      - 8080:8080
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock

应用 docker-compose:

# Run docker-compose build
# Run docker-compose up
# Live long and prosper

version: '3.1'
networks:
  proxy:
   external: true
  internal:
   external: false
services:
    apache:
        build: .docker/apache
        container_name: sf4_apache
        volumes:
          - .docker/config/vhosts:/etc/apache2/sites-enabled
          - ./backend:/home/wwwroot/sf4
        depends_on:
          - php
        labels:
          - traefik.http.routers.sf4_apache.rule=Host(`symfony.docker.localhost`)
          - traefik.http.services.apache.loadbalancer.server.port=80
        networks:
         - internal
         - proxy   

    php:
        build: .docker/php
        container_name: sf4_php
        volumes:
          - ./backend:/home/wwwroot/sf4
          - ./executor:/home/wwwroot/pipe
        networks:
         - internal
        labels:
         - traefik.enable=false  


    nginx:
      container_name: angular_nginx
      build: .docker/nginx
      volumes:
        - ./frontend/dist/frontend:/usr/share/nginx/html
      ports:
        - "81:80"
        - "443:443"
      labels:
        - traefik.http.routers.angular_nginx.rule=Host(`angular.docker.localhost`)
      networks:
        - internal
        - proxy     
    node:
        build: .docker/node
        container_name: angular_node
        ports:
            - 4200:4200
        volumes:
            - ./frontend:/home/node/app/frontend
        tty: true
        command:
            - /bin/sh
            - -c
            - |
                cd /home/node/app/frontend && npm start
        expose:
            - "4200"   
        networks:
         - internal
        labels:
         - traefik.enable=false     

无法使其工作:有时我在域 (symfony.docker.localhost) 中遇到错误网关,有时因为两台服务器使用一个端口而崩溃,所以请帮助我正确运行它

【问题讨论】:

    标签: docker docker-compose traefik


    【解决方案1】:

    首先,docker 前端和后端在 2.1 版本中已弃用,请查看 link

    这是一个在 traefik 2.1 中做同样事情的例子

    version: '3.7'
    
    networks:
      traefik:
        external: true
    
    volumes:
      db_data:
    
    services:
    
      proxy:
        image: traefik:v2.1
        command:
          - '--providers.docker=true'
          - '--entryPoints.web.address=:80'
          - '--providers.providersThrottleDuration=2s'
          - '--providers.docker.watch=true'
          - '--providers.docker.swarmMode=true'
          - '--providers.docker.swarmModeRefreshSeconds=15s'
          - '--providers.docker.exposedbydefault=false'
          - '--providers.docker.defaultRule=Host("local.me")'
          - '--accessLog.bufferingSize=0'
          - '--api=true'
          - '--api.dashboard=true'
          - '--api.insecure=true'
          - '--ping.entryPoint=web'
        volumes:
          - '/var/run/docker.sock:/var/run/docker.sock:ro'
        ports:
          - '80:80'
          - '8080:8080'
        deploy:
          restart_policy:
            condition: any
            delay: 5s
            max_attempts: 3
            window: 120s
          update_config:
            delay: 10s
            order: start-first
            parallelism: 1
          rollback_config:
            parallelism: 0
            order: stop-first
        logging:
          driver: json-file
          options:
            'max-size': '10m'
            'max-file': '5'
        networks:
          - traefik
    
      mysql:
        image: mysql:5.7
        command: mysqld --general-log=1 --general-log-file=/var/log/mysql/general-log.log
        deploy:
          restart_policy:
            condition: any
            delay: 5s
            max_attempts: 3
            window: 120s
          update_config:
            delay: 10s
            order: start-first
            parallelism: 1
          rollback_config:
            parallelism: 0
            order: stop-first
        logging:
          driver: json-file
          options:
            'max-size': '10m'
            'max-file': '5'
        networks:
          - traefik
        volumes:
          - db_data:/var/lib/mysql
        environment:
          MYSQL_ROOT_PASSWORD: dummy
          MYSQL_DATABASE: rails_blog_production
    
      rails_blog_web:
        image: wshihadeh/rails_blog:demo-v1
        command: 'web'
        deploy:
          labels:
            - traefik.enable=true
            - traefik.http.services.blog.loadbalancer.server.port=8080
            - traefik.http.routers.blog.rule=Host(`blog.local.me`)
            - traefik.http.routers.blog.service=blog
            - traefik.http.routers.blog.entrypoints=web
            - traefik.docker.network=traefik
          restart_policy:
            condition: any
            delay: 5s
            max_attempts: 3
            window: 120s
          update_config:
            delay: 10s
            order: start-first
            parallelism: 1
          rollback_config:
            parallelism: 0
            order: stop-first
        logging:
          driver: json-file
          options:
            'max-size': '10m'
            'max-file': '5'
        networks:
          - traefik
        depends_on:
          - mysql
        environment:
          DATABASE_URL: mysql2://root:dummy@mysql/rails_blog_production
          RAILS_SERVE_STATIC_FILES: 'true'
    

    更多信息可以查看blog post

    【讨论】:

    • 你只有 1 个 docker-compose,但我需要用几个 traefik。而且没有码头工人群
    • 您可以将其拆分为三个文件,每个服务在其自身中都不是问题。您只需要确保所有服务继续使用同一网络
    • 我的 nginx 和 apache 都在容器内使用 80 端口,这会导致问题吗?
    • 不,没关系,只要你不将同一个端口两次暴露给外部主机(你不需要暴露它)
    • 工作!非常感谢您的帮助
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-14
    • 2020-03-18
    • 1970-01-01
    • 2020-11-11
    • 2020-02-18
    相关资源
    最近更新 更多