【问题标题】:Is it possible to add locations dinamically on ngninx reverse proxy docker?是否可以在 nginx 反向代理 docker 中动态添加位置?
【发布时间】:2020-11-09 01:56:40
【问题描述】:

基础设施

我想创建一个具有以下结构的 docker: 我打算有一个docker-compose,里面有3个主图像(一个数据库,一个端口8080上的api和一个端口443上的前端)。除此之外,我还有几个额外的 docker-compose 代表其他服务。

功能

我正在寻找的功能是能够从 nginx 反向代理(主 docker-compose)内部创建辅助 docker-compose 文件的容器实例,并将该端口映射到唯一的子目录(能够创建同一个 docker-compose 的多个实例)。

我发现了什么

要完成其余功能,已经找到了一些资源:

【问题讨论】:

    标签: nginx docker-compose reverse-proxy


    【解决方案1】:

    使用 traefik 解决了这个问题,它允许我在不修改构建配置的情况下将子目录的路由添加到容器中。

    docker-compose.yml 是这样的:

    version: '3.7'
    services:
      traefik:
        image: traefik:v2.2.0
        ports:
          - "${FRONT_HTTP_PORT:-80}:80"
          - "${TRAEFIK_PORT:-8080}:8080"
        environment: 
          - TRAEFIK_LOG_LEVEL=DEBUG
          - TRAEFIK_PROVIDERS_DOCKER_EXPOSEDBYDEFAULT=false
          - TRAEFIK_PROVIDERS_DOCKER=true
          - TRAEFIK_PROVIDERS_DOCKER_NETWORK=traefik01
          - TRAEFIK_API_INSECURE=true
          - TRAEFIK_ENTRYPOINTS_FRONT=true
          - TRAEFIK_ENTRYPOINTS_FRONT_ADDRESS=:${FRONT_HTTP_PORT:-80}
        volumes:
          - /var/run/docker.sock:/var/run/docker.sock:ro
        security_opt:
          - label:type:docker_t
    
      frontend:
        build: ./frontend
        expose:
          - 80
        labels:
          - "traefik.enable=true"
          - "traefik.http.routers.frontend.entrypoints=front"
          - "traefik.http.routers.frontend.rule=PathPrefix(`/frontend{regex:$$|/.*}`)"
          - "traefik.http.routers.frontend.middlewares=frontend-stripprefix"
          - "traefik.http.middlewares.frontend-stripprefix.stripprefix.prefixes=/frontend"
          - "traefik.http.routers.frontend.priority=2"
          # - "traefik.http.routers.frontend.priority=1"
          # - "traefik.frontend.rule=Host:ctf.itasahobby.com"
        stdin_open: true
    
      api:
        build: ./api
        expose: 
          - 80
        links:
          - database
        labels:
          - "traefik.enable=true"
          - "traefik.http.routers.api.entrypoints=front"
          - "traefik.http.routers.api.rule=PathPrefix(`/api{regex:$$|/.*}`)"
          - "traefik.http.routers.api.middlewares=api-stripprefix"
          - "traefik.http.middlewares.api-stripprefix.stripprefix.prefixes=/api"
          - "traefik.http.routers.api.priority=2"
    
      database:
        build: ./database
        restart: always
    networks:
      default:
        external:
          name: testnetwork
    

    然后要添加一个新容器,它必须包含相同的网络接口和标签才能设置路由,例如:

    version: '3.7'
    services:
      app2:
        image: httpd:2.4.41-alpine
        expose:
          - 80
        labels:
          - "traefik.enable=true"
          - "traefik.http.routers.app2.entrypoints=front"
          - "traefik.http.routers.app2.rule=PathPrefix(`/app2{regex:$$|/.*}`)"
          - "traefik.http.routers.app2.middlewares=app2-stripprefix"
          - "traefik.http.middlewares.app2-stripprefix.stripprefix.prefixes=/app2"
    networks:
      default:
        external:
          name: testnetwork
    
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-22
      • 2018-10-10
      • 1970-01-01
      • 1970-01-01
      • 2021-11-13
      • 2020-12-18
      相关资源
      最近更新 更多