是否可以在ngninx反向代理docker上动态添加位置?

时间:2020-11-06 16:06:35

标签: nginx docker-compose reverse-proxy

基础设施

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

功能

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

我发现了什么

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

1 个答案:

答案 0 :(得分:0)

使用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

相关问题