Связь с помощью HTTP между двумя контейнерами докеров (от Vue.js до Node.js).

У меня есть три контейнера:

  • спереди (вуэйс)
  • сервер (узлы)
  • монго (монгодб)

Связь между сервером ‹-> mongo в порядке, но связь между front -> server не работает (фронтальный http-вызов на сервер не может быть достигнут).

Вот мой докер-композитор:

version: "3.3"

services:
  server:
    build:
      context: ../server
    command: nodemon ../server/bin/www
    volumes:
      - ../server:/server
    ports:
      - "3000:3000"
    networks:
      - frontend
      - backend
    depends_on:
      - mongo
  front:
    build:
      context: ../front
    command: npm run dev
    volumes:
      - ../front:/app
    ports:
      - "8081:8081"
    networks:
      - frontend
    depends_on:
      - server
  mongo:
    image: mongo:3.6.5
    ports:
      - "27017:27017"
    networks:
      - backend
    environment:
      MONGO_INITDB_DATABASE: mongo-dev
      MONGO_INITDB_ROOT_USERNAME: admin
      MONGO_INITDB_ROOT_PASSWORD: password
    command: mongod

networks:
  frontend:
  backend:

Запуск docker-compose up в порядке: Mongo создан + сервер работает + фронт работает.

Я могу получить к ним доступ из своего браузера (http://localhost:3000 для сервера + http://localhost:8081 для фронта), но мой фронт не может получить простой http GET на мой сервер с помощью

http://сервер:3000/myGetRoute

Примечание: этот маршрут доступен из моего браузера с помощью

http://localhost:3000/myGetRoute

и сервер ping из моего переднего контейнера в порядке.

Связь с фронта -> сервер невозможна. Есть идеи ?

РЕДАКТИРОВАТЬ: моя передняя служба работает на: http://0.0.0.0:8081)


person Chris    schedule 31.05.2018    source источник
comment
конечно, вы находитесь вне сети докеров. вы должны использовать локальный хост, а не сервер. server — это просто имя для докера, но ваш локальный хост понятия не имеет, что такое сервер.   -  person ius    schedule 31.05.2018
comment
server:3000/myGetRoute — это маршрут, используемый моим фронтальным приложением. Мое переднее приложение должно знать «сервер», потому что это имя службы, определенное в моем docker-compose, а сервер находится в той же сети, что и переднее. Нет ?   -  person Chris    schedule 31.05.2018
comment
на самом деле нет, ваш процесс узла работает в докере, но клиент vue находится на вашем локальном хосте (в вашем браузере), а не в докере. Вы пытались получить доступ к серверу из своего браузера с сервером: 3000/myGetRoute? я не думаю, что это сработает. Это именно то, что пытается сделать ваш клиент vue. Вы должны использовать в своем клиенте localhost:3000/myGetRoute. Думаю, так должно работать.   -  person ius    schedule 31.05.2018
comment
ты прав! с моим фронтом, который вызывает «localhost», он работает. Спасибо ! Но мой фронт работает в контейнере, а не на моей локальной машине: 'front_1 | I Ваше приложение запущено здесь: 0.0.0.0:8081' =› Я действительно не понимаю. Мне нужен доступ из моего браузера к фронту в контейнере, чтобы имитировать реальные условия производства.   -  person Chris    schedule 31.05.2018
comment
Если вы хотите получить к нему доступ, вам нужно использовать localhost:3000. Один из вариантов, который вы можете сделать, — создать контейнер nginx, который работает как прокси. Он должен решить, когда запросы должны обрабатываться вашим клиентом или сервером. Таким образом, оба контейнера будут инкапсулированы в один порт. Затем скажите nginx, что все под «api» — это ваш сервер, а все остальное — ваш клиент. Затем Vue сможет вызывать ваш API так же, как /api/myGetRoute, без необходимости использования полного URL-адреса. Это имеет то преимущество, что вам не придется беспокоиться о CORS (важно, если вы хотите делать вызовы POST/PUT/DELETE).   -  person ius    schedule 31.05.2018


Ответы (1)


Возможно, вы захотите попробовать ссылки вместо depends_on . Также см. Разницу между ссылками и depend_on в docker_compose.yml для дальнейшей разработки.

person Markus Schneider    schedule 31.05.2018
comment
ссылка устарела и заменена на depend_on - person Chris; 31.05.2018