来自 docker 容器的 API 端点

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

我有两个 docker 容器

frontend
api
api
提供 Restful API,
frontend
是 Next.JS 应用程序

我需要一个适用于SSR和CSR的统一URL,当我将

uri
设置为apollo客户端时,我无法使用
https://api/graphql
,因为CSR会中断,我也无法使用
https://localhost:{PORT}/graphql
,因为SSR会中断。

如果我想有条件地设置端点那就太麻烦了。

修复它的标准和通用方法是什么(忽略阿波罗客户端,我需要一个适用于任何其他用例的解决方案)?

docker docker-networking docker-network
1个回答
0
投票

这不会对您当前的设置进行一对一的修复,但希望这能让您朝着正确的方向迈出一步

根据我的评论,我有一个类似的结构,它使用本地运行的 Traefik 实例,使用漂亮的 URL 将所有本地流量路由到底层服务容器。

我的 Traefik 版本有点过时,所以里程可能会有所不同。但要按照我的方式进行设置,请运行以下两个命令(需要打开端口 80、443 和 8080):

docker network create -d bridge traefik-network
docker run -d -p 80:80 -p 443:443 -p 8080:8080 \
    -v /var/run/docker.sock:/var/run/docker.sock \
    --name=traefik \
    --restart unless-stopped \
    --network=traefik-network \
    -l traefik.enable=false \
    traefik:2.4 \
    --providers.docker=true \
    --api.insecure=true \
    --entrypoints.web.address=:80 \
    --entrypoints.websecure.address=:443

以下是我在项目中使用的一些基准配置。我省略了许多可能与您无关的配置,因此请忽略

extends
指令,因为这些指令可能对您的设置没有帮助,但可以视为占位符,供您填写自己的配置详情:

docker-compose.yml

version: '3.8'

services:
  nginx:
    image: nginx:1.23-alpine
    restart: unless-stopped
    ports:
      - "80"
    environment:
      FPM_HOST: ${COMPOSE_PROJECT_NAME}_php
      NEXT_HOST: ${COMPOSE_PROJECT_NAME}_node
      NGINX_SERVER_NAME: ${NGINX_SERVER_NAME}
      NGINX_ROOT: ${NGINX_ROOT}
    volumes:
      - ../api:/var/www/html
      - ../logs:/var/log/nginx
      - ./nginx:/etc/nginx/templates
    networks:
      default:
        aliases:
          - ${COMPOSE_PROJECT_NAME}_nginx
          - ${NGINX_SERVER_NAME}
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.${COMPOSE_PROJECT_NAME}.rule=Host(`${NGINX_SERVER_NAME}`)"
      - "traefik.http.routers.${COMPOSE_PROJECT_NAME}.entrypoints=web"
    depends_on:
      - backend
      - frontend
  backend:
    extends:
      file: ./docker/services-common.yml
      service: php
    labels:
      - "traefik.enable=false"
    depends_on:
      - postgres
  frontend:
    extends:
      file: ./docker/services-common.yml
      service: node
    restart: unless-stopped
    labels:
      - "traefik.enable=false"
    command: [ "yarn", "run", "dev" ]
    depends_on:
      - backend
  postgres:
    extends:
      file: ./docker/services-common.yml
      service: postgres
    labels:
      - "traefik.enable=false"

volumes:
  postgres:

networks:
  default:
    name: traefik-network
    external: true

nginx/default.conf.template

upstream frontend {
    server ${NEXT_HOST}:3000;
}

server {
    listen 80 default_server;
    server_name ${NGINX_SERVER_NAME};
    root ${NGINX_ROOT};
    index index.php;

    location / {
        proxy_pass http://frontend;
    }

    location /api {
        alias ${NGINX_ROOT}/public/;
        try_files $uri /index.php?$args;
    }

    location ~ \.php$ {
        include fastcgi_params;
        fastcgi_buffers 16 16k;
        fastcgi_buffer_size 32k;
        fastcgi_intercept_errors on;
        fastcgi_pass ${FPM_HOST}:9000;
        fastcgi_param SCRIPT_FILENAME $document_root/public/$fastcgi_script_name;
        fastcgi_param NGINX_SERVER_NAME http://${NGINX_SERVER_NAME};
    }
}

.env

# Project
COMPOSE_PROJECT_NAME=my-project
PHP_VERSION=8.1

# NGINX
NGINX_PORT=80
NGINX_SERVER_NAME=project.docker.localhost
NGINX_ROOT=/var/www/html

# Node JS
DEV_PORT=3000

# .... Project specific settings

这样本地就可以访问API了:

http://project.docker.localhost/api

前端位于:

http://project.docker.localhost

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