Docker создает связанные микросервисы, не обнаруживаемые - PullRequest
1 голос
/ 13 апреля 2019

При использовании docker compose я не могу получить две службы для связи друг с другом.Идея состоит в том, чтобы получить службу Node.JS для связи со службой Java / Spring.

Я пытался использовать «ссылки», помещая их в ту же «сеть», а затем отправляя запросы на * 1004.* и возвращается ERR_NAME_NOT_RESOLVED.

В службе Node.JS, которую я пытался использовать Axios и модуль http, ни одна из них не работает (ERR_NAME_NOT_RESOLVED).Я также попробовал 'localhost', который тоже не работает (ERR_CONNECTION_REFUSED).Сервис Spring - это буквально просто открытая конечная точка REST (что, как я знаю, работает, поскольку я могу получить к ней прямой доступ).

Я также пытался передать ссылку на сервис через переменные среды, например (внутри docker-compose.yml).

environment:
  - SERVICE_HOST=serviceB

Переменная env внутри проекта Node.JS не определена при вызове ниже

process.env.SERVICE_HOST

Я использую Windows с панелью инструментов Docker, но также пробовал тот же проектв виртуальной машине Ubuntu.

  serviceA:
    build: ./serviceA/
    ports: 
      - "8080:8080"
    networks:
      - my_network
  serviceB:
    build: ./serviceB/
    ports:
      - "9003:9003"
    networks:
      - my_network

networks:
  my_network:
    driver: bridge
axios.get("http://serviceB:9003/test")
  .then(function(res){
    console.log(res);
  })

Я ожидал, что оператор console.log в службе Node.JS ответит результатами вызова restB ServiceB вместо сообщений об ошибках.

Я новичок в использовании docker-compose, поэтому я ожидаю, что мне здесь не хватает чего-то очевидного, но я не смог найти ничего, что решило бы мою проблему в Интернете, ни в подобных вопросах на SO.

РЕДАКТИРОВАТЬ Добавлен весь файл yaml и ошибки для лучшего понимания.

version: '3'
services:

  # Consul
  consul:
    container_name: consul
    image: consul:latest
    ports:
      - "8500:8500"
      - "8300:8300"
    hostname: consul
    networks:
      - front_end
      - back_end

  # Actor Service   
  actor_service:
    build: ./actor_service/
    ports: 
      - "9001:8080"
    depends_on:
      - actor_service_db
      - consul
    networks:
      - back_end

  actor_service_db:
    image: postgres:9.4.5
    depends_on:
      - consul
    networks:
      - back_end
    environment:
      - POSTGRES_DB=actor
      - POSTGRES_USER=user
      - POSTGRES_PASSWORD=password
      - CONSUL_HTTP_ADDR=https://consul:8500

  # Movie Service   
  movie_service:
    build: ./movie_service/
    ports: 
      - "9002:8080"
    depends_on:
      - movie_service_db
      - consul
    networks:
      - back_end

  movie_service_db:
    image: postgres:9.4.5
    depends_on:
      - consul
    networks:
      - front_end
    environment:
      - POSTGRES_DB=movie
      - POSTGRES_USER=user
      - POSTGRES_PASSWORD=password
      - CONSUL_HTTP_ADDR=https://consul:8500

  # Movie Aggregate Service
  movie_aggregate_service:
    container_name: movie_aggregate_service
    build: 
      context: ./movie_aggregate_service/
    ports: 
      - "9003:8080"
    depends_on:
      - consul
      - movie_service
      - actor_service
    networks:
      - front_end
      - back_end
    hostname: movie_aggregate_service

  # Frontend
  front_end:
    build: ./front_end/
    ports: 
      - "8080:8080"
    networks:
      - front_end
    environment:
      - "CONSUL_HOST=consul"
    links:
      - consul
      - movie_aggregate_service

networks:
  front_end:
    driver: bridge
  back_end:
    driver: bridge

Ошибки консоли браузера и вывод

Ответы [ 2 ]

0 голосов
/ 14 апреля 2019

Возможно, вы захотите указать имя хоста для каждой службы, чтобы упростить доступ к конечным точкам, расположенным на них, и явно связать их.Ниже приведен пример файла Docker-compose.

version: "3"

services:
  ocelot.products:
    image: pogs/ocelot-products
    container_name: ocelot-products
    hostname: ocelot.products
    build:
      context: ./products
    ports:
      - "52790:3000"
    environment:
      "PUBLIC_PORT": "52790"
  ocelot.users:
    image: pogs/ocelot-users
    container_name: ocelot-users
    hostname: ocelot.users
    build:
      context: ./users
    ports:
      - "52791:3000"
    environment:
      "PUBLIC_PORT": "52791"
  ocelot.transactions:
    image: pogs/ocelot-transactions
    container_name: ocelot-transactions
    hostname: ocelot.transactions
    build:
      context: ./transactions
    ports:
      - "52792:3000"
    environment:
      "PUBLIC_PORT": "52792"
  ocelot.gateway:
    image: pogs/ocelot-gateway
    container_name: ocelot-gateway
    build:
      context: ./gateway/EShop
    ports:
      - "52793:80"
    links:
      - ocelot.products
      - ocelot.users
      - ocelot.transactions
    depends_on:
      - ocelot.products
      - ocelot.users
      - ocelot.transactions

Всего доступно репо здесь

0 голосов
/ 14 апреля 2019

Ваша компоновка выглядит неплохо - обнаружение службы зависит от DNS внутри контейнеров, я бы попытался (exec) добавить в serviceA и проверить, что с /etc/resolv.conf не произошло ничего странного, вы сможете пропинговать serviceB из оболочка exec.

...