Для вызова API со стороны сервера требуется имя службы в качестве хоста API, но на клиенте оно недоступно - PullRequest
1 голос
/ 06 июня 2019

Я настраиваю интерфейс Laravel API и Nuxt с помощью docker-compose. У меня есть два отдельных проекта (и два docker-compose.yml), и я подключаю их через сеть. Проблема в том, что когда я делаю какой-то вызов API на стороне сервера Nuxt, имя хоста API - это сервис Laravel, но на стороне клиента сервис недоступен.

API отображается из порта 80 в контейнере на 8080 на моем хосте. На стороне клиента я могу получить доступ к API, вызвав http://localhost:8080/api/, но я также делаю некоторые вызовы на стороне сервера Nuxt, у которого нет доступа к хосту из контейнера, поэтому он должен вызывать API на http://app -dev / апи

#backend.yml
version: '3.5'
services:
  database:
    image: mariadb:10.3
    networks:
    - my-network
    #...

  app-dev:
    depends_on:
      - "database"
    ports:
    - 8080:80
    networks:
    - my-network
    #...

networks:
  my-network:
    name: my-network
#------------------------
#frontend.yml
version: '3.5'
services:
  front-app-dev:
    ports:
      - ${FRONTEND_SERVER_PORT}:${FRONTEND_SERVER_PORT}
    networks:
      - my-network
    #...

networks:
  my-network:
    external: true

Как я могу объединить API вызовов на стороне сервера и на стороне клиента? Могу ли я легко настроить сервер узлов на прокси-вызовы от клиента к app-dev (например, прокси-вызов на http://localhost:{FRONTEND_SERVER_PORT}/api на http://app -dev / api )? Или есть какой-нибудь способ сделать порт 8080 хоста доступным в front-app-dev, чтобы серверная сторона могла совершать там звонки?

1 Ответ

0 голосов
/ 10 июня 2019

Мне удалось сделать это с traefik.Я добавил службу:

traefik:
  image: traefik:alpine
  ports:
    - 8000:80
  volumes:
    - ./docker/traefik:/etc/traefik
    - /var/run/docker.sock:/var/run/docker.sock
  networks:
    - my-network
  restart: always

Мой ./docker/traefik.toml:

defaultEntryPoints = ["http"]

[entryPoints]
  [entryPoints.http]
    address = ":80"

[docker]
watch = true
endpoint = "unix:///var/run/docker.sock"
exposedByDefault = false
debug = true

Я изменил контейнер app-dev, поэтому apache обслуживает API на порту 8000. В compose, ядобавили следующие строки в app-dev:

labels:
  - "traefik.enable=true"
  - "traefik.docker.network=my-network"
  - "traefik.port=8000"
  - "traefik.frontend.rule=Host:app-dev"

Я также добавил app-dev в / etc / hosts, он указывает на 127.0.0.1.Поэтому, когда я ввожу app-dev: 8000 в своем браузере (или когда клиент вызывает его), traefik перенаправляет меня на порт 8000 в контейнере app-dev.Когда я вызываю API на сервере, он также вызывает app-dev: 8000 и указывает непосредственно на контейнер, как и раньше.Таким образом, и клиент, и сервер используют один и тот же адрес.

...