Как получить доступ к API узла в Docker-контейнере - PullRequest
0 голосов
/ 12 мая 2019

У меня есть трехуровневое приложение на Docker tat, которое состоит из следующего: 1. Приложение Adonis на сервере в качестве API для приложения 2. База данных MongoDB 3. Приложение NuxtJS для клиентского приложения.

Когда я запускаю приложение локально с docker-compose up, кажется, что оно нормально запускается.Однако, когда я пытаюсь получить доступ к API с почтальоном (localhost: 3333) или пытаюсь получить доступ к следующему приложению в моем браузере (localhost: 3000 /), я получаю сообщение об ошибке «Не удалось получить ответ» и «Не удается открыть«ошибка страницы» соответственно.

Я попытался выставить порты в Dockerfile каждого компонента, в дополнение к указанию сопоставления портов в файле docker-compose.yml.

Вот мой Dockerfile для приложения API

# 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"]

Вот Dockerfile для приложения NuxtJS

# 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"

Когда я отправляю запрос GET на "localhost: 3333 /", я ожидаю получить ответ "test".Однако вместо этого я получаю сообщение об ошибке «Не удалось получить ответ».

Когда я захожу в "localhost: 3000 /" в браузере, я ожидаю получить страницу.Вместо этого он говорит, что не может подключиться к серверу.

Ответы [ 2 ]

1 голос
/ 13 мая 2019

С вашей машины:

Вы сможете использовать localhost:3333 с текущей настройкой.Вы можете дважды проверить, прослушивает ли программа порт 3333 (lsof -i:3333 в linux).

Внутри докера:

Настройте сети и используйте имена контейнеров для их вызова,пример

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.

Кстати, вам не нужен EXPOSES 3333 в Dockerfile, так как он ужесделано в файле docker-compose.

0 голосов
/ 13 мая 2019

Если вы хотите получить доступ с помощью localhost, вы должны поделиться своими сетевыми интерфейсами с докерами. В противном случае, если иное отличается. Определенно, попробуйте с этим 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"
...