如何使用 Docker 容器在一个端口上运行两个 FastAPI 实例?

问题描述 投票:0回答:1

假设我想将通用 API 分为 2 个部分(2 个容器,2 个服务) - 第一部分负责用户登录,另一个负责发送消息。我想使用 FastAPI 框架来实现这一点。如何使这两个服务在同一端口上运行?也就是说,当使用两个服务时我不必使用不同的端口?附注我正在使用 Docker 容器。

这样做真的值得吗,还是在不同端口上运行 API 是正常的吗?

python docker docker-compose containers fastapi
1个回答
0
投票

这是一个示例本地开发 docker compose 文件,用于在两个单独的 api 前面运行 traefik,但请注意它们每个都在特定的不同路径上运行:

version: "3"

services:

  traefik:
    image: "traefik:v2.6"
    container_name: "traefik"
    command:
      - "--api.insecure=true"
      - "--providers.docker=true"
      - "--providers.docker.exposedbydefault=false"
      - "--entrypoints.web.address=:5000"
    ports:
      - "5000:5000"
    volumes:
      - "/var/run/docker.sock:/var/run/docker.sock:ro"

  api_1:
    container_name: api_1
    build:
      dockerfile: api-1.dockerfile
    expose:
      - "80"
    ports:
      - "8005:80"
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.api1.rule=Host(`localhost`) && PathPrefix(`/api-1/`)"
      - "traefik.http.routers.api1.entrypoints=web"

  api_2:
    container_name: api_2
    build:
      dockerfile: api-2.dockerfile
    expose:
      - "80"
    ports:
      - "8006:80"
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.api2.rule=Host(`localhost`) && PathPrefix(`/api-2/`)"
      - "traefik.http.routers.api2.entrypoints=web"

在此示例中,API 本身都在端口 80 上运行,但如果您想直接访问它们,也可以通过其他端口名称访问它们。最后,在

localhost:5000
,您可以通过单个本地开发端口访问任一 api。

© www.soinside.com 2019 - 2024. All rights reserved.