【问题标题】:Make an API call from one container to another从一个容器到另一个容器进行 API 调用
【发布时间】:2021-09-10 01:08:50
【问题描述】:

我有一个节点应用程序,一个用于前端的 next.js 应用程序,Redis 和 Postgres 作为数据库。我在不同的容器中对 Next.js 和 node.js 进行了 dockerized。 docker-compose.yaml 如下

version: '3'
services: 
  redis-server:
    image: 'redis'
    restart: always
  postgres-server:
    image: 'postgres:latest'
    environment:
      - POSTGRES_USER=postgres
      - POSTGRES_PASSWORD=postgres
      - POSTGRES_DB=postgres
    ports: 
      - "5433:5432"
    volumes:
        - ./docker/postgres/data/data/pg_hba.conf:/var/lib/postgresql/app_data/pg_hba.conf
        - ./src/db/sql/CREATE_TABLES.sql:/docker-entrypoint-initdb.d/CREATE_TABLES.sql
        - ./src/db/sql/INSERT_TO_TABLES.sql:/docker-entrypoint-initdb.d/INSERT_TO_TABLES.sql
        - ./src/db/sql/CREATE_FUNCTIONS.sql:/docker-entrypoint-initdb.d/CREATE_FUNCTIONS.sql
  node-app:
    build: .
    ports: 
      - "4200:4200" 
  client:
    build:
      context: ./client
      dockerfile: Dockerfile
    container_name: client
    restart: always
    volumes:
      - ./:/app
      - /app/node_modules
      - /app/.next
    ports:
      - 3000:3000

使用 SSR 时,我无法向 localhost:4200 发出请求。现在,我知道这是因为它们位于不同的容器中,如果请求不是来自客户端,则正在检查客户端容器的服务器端口 4200。现在,我不知道如何简单地使用容器名称或其他东西来引用容器来对 SSR 数据发出 API 请求(如 fetch('node-app/users')

【问题讨论】:

    标签: docker-compose next.js server-side-rendering docker-networking


    【解决方案1】:

    docker-compose 为 compose 文件中的所有服务设置网络。要访问网络中的另一个容器,您可以使用该容器的名称作为主机名,它会解析到正确的 ip。

    所以在你的情况下,fetch('http://node-app:4200/users') 应该可以解决问题。

    【讨论】:

    • 是的,成功了。不敢相信我花了几个小时才让它工作,但没有尝试过。
    猜你喜欢
    • 2016-06-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多