假设我想将通用 API 分为 2 个部分(2 个容器,2 个服务) - 第一部分负责用户登录,另一个负责发送消息。我想使用 FastAPI 框架来实现这一点。如何使这两个服务在同一端口上运行?也就是说,当使用两个服务时我不必使用不同的端口?附注我正在使用 Docker 容器。
这样做真的值得吗,还是在不同端口上运行 API 是正常的吗?
这是一个示例本地开发 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。