【问题标题】:How to Access Node API within Docker Container如何在 Docker 容器中访问 Node API
【发布时间】:2019-05-12 18:30:36
【问题描述】:

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

当我使用docker-compose up 在本地运行应用程序时,它似乎启动得很好。但是,当我尝试使用 postman (localhost:3333) 访问 api 或尝试访问浏览器上的 Next 应用程序 (localhost:3000/) 时,我收到“无法获得任何响应”错误和“无法打开页面错误”。

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

这是我的 API 应用程序的 Dockerfile

# 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 应用程序的 Dockerfile

# 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”的响应。但是,我从邮递员那里收到“无法得到任何响应”错误。

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

【问题讨论】:

  • localhost 始终是“这个容器”。请使用 docker-compose.yml 文件中的其他容器名称(例如api)作为主机名。
  • 所以,你在我的浏览器/邮递员中说,我应该调用 api:3333 和 web:3000/ 而不是 localhost:3333 和 localhost:3000?

标签: node.js docker docker-compose adonis.js


【解决方案1】:

从您的机器:

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

从您的 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:3333 获取 api。

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

【讨论】:

    【解决方案2】:

    如果您想使用 localhost 访问,您应该与 docker 共享您的主机网络接口。否则,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"
    

    【讨论】:

      猜你喜欢
      • 2023-02-17
      • 1970-01-01
      • 2019-06-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-11
      • 2020-08-17
      相关资源
      最近更新 更多