如何访问 Docker 容器中的节点 API

How to Access Node API within Docker Container

我在 Docker 上有一个三层应用程序,它包含以下内容: 1. Adonis 应用程序作为应用程序的 api 服务器 2. MongoDB 数据库 3. 用于客户端应用程序的 NuxtJS 应用程序。

当我 运行 在本地使用 docker-compose up 应用程序时,它似乎启动得很好。但是,当我尝试使用邮递员 (localhost:3333) 访问 api 或尝试在我的浏览器 (localhost:3000/) 上访问 Next 应用程序时,我收到 "Could not get any response" 错误和 "Cannot open the page error" 分别.

除了在 docker-compose.yml 文件中指定端口映射外,我还尝试在每个组件的 Docker 文件中公开端口。

这是我的 DockerAPI 应用程序文件

# The API application

FROM node:alpine
WORKDIR home/api

COPY ./server-api/package.json .
RUN npm install
COPY  ./server-api .

EXPOSE 3333

CMD ["npm", "start"]

这是 NuxtJS 应用程序的Docker文件

# The Web application

FROM node:latest
WORKDIR home/app

COPY ./web-client/package.json .
RUN npm install
COPY ./web-client .

EXPOSE 3000

CMD ["npm", "start"]

这是我的 docker-compose.yml 文件

version: '3'

services:

  api:
    build: ./server
    restart: always
    ports:
      - "3333:3333"

  mongodb:
    image: 'mongo'
    restart: always
    environment:
      MONGO_INITDB_ROOT_USERNAME: root
      MONGO_INITDB_ROOT_PASSWORD: NoneOfYourBusiness

  web:
    build: ./web
    restart: always
    ports:
      - "3000:3000"

当我向 "localhost:3333/" 发送 GET 请求时,我希望得到 "test" 的响应。但是,我从 Postman 收到 "Could not get any response" 错误。

当我通过浏览器访问 "localhost:3000/" 时,我希望得到一个页面。相反,它说它无法连接到服务器。

如果您想使用本地主机访问,您应该与码头工人共享您的主机网络接口。否则,lo iface 是不同的。 毫无疑问,试试这个 docker-compose:

version: '3'

services:

  api:
    build: ./server
    restart: always
    network_mode: "host"
    ports:
      - "3333:3333"

  mongodb:
    image: 'mongo'
    restart: always
    network_mode: "host"
    environment:
      MONGO_INITDB_ROOT_USERNAME: root
      MONGO_INITDB_ROOT_PASSWORD: NoneOfYourBusiness

  web:
    build: ./web
    restart: always
    network_mode: "host"
    ports:
      - "3000:3000"

来自您的机器:

您应该可以使用 localhost:3333 当前的设置。您可以仔细检查程序是否正在侦听端口 3333(lsof -i:3333 on linux)。

从你的内部 docker:

设置网络并使用容器名称调用它们,示例

version: '3'

networks:
    back:

services:

  api:
    build: ./server
    restart: always
    ports:
      - "3333:3333"
    networks:
      - back
  mongodb:
    image: 'mongo'
    restart: always
    environment:
      MONGO_INITDB_ROOT_USERNAME: root
      MONGO_INITDB_ROOT_PASSWORD: NoneOfYourBusiness
    networks:
      - back
  web:
    build: ./web
    restart: always
    ports:
      - "3000:3000"
    networks:
      - back

web 容器中,您可以为 api 调用 api:3333

顺便说一句,您不需要 Dockerfile 中的 EXPOSES 3333,因为它已经在 docker-compose 文件中完成。