Как подключить фронтенд к бэкенду через Docker-compose сети - PullRequest
0 голосов
/ 04 июля 2019

Я пытаюсь докернизировать мое приложение angular + express.У меня есть файл docker-compose, который создает два контейнера, и я могу поразить контейнеры с моего хост-компьютера (используя мой браузер), но я просто получаю «ERR_NAME_NOT_RESOLVED» всякий раз, когда я пытаюсь получить доступ к бэкэнду из httpзапросы, сделанные моим веб-интерфейсом.

Я рассмотрел проблему, и кажется, что большинство из них предполагают, что имени службы и порта контейнера должно быть достаточно, чтобы попасть в другой контейнер, когда они находятся в одной сети.Я пытался нажать "http://express:8000/user?user=030f0e70-9a8f-11e9-b5d1-f5cb6c0f3616"", что, по-моему, должно работать, учитывая то, что я видел в других местах, но независимо от этого я получаю ту же ошибку.

Мой файл docker-compose выглядит так

version: '3' # specify docker-compose version

# Define the services/containers to be run
services:
  angular: # name of the first service
    build: ./ # specify the directory of the Dockerfile
    ports:
      - "4200:80" # specify port forewarding
    links:
      - "express"
    depends_on:
      - "express"

  express: #name of the second service
    build:  # specify the directory of the Dockerfile
      context: ./
      dockerfile: dockerfile.be
    ports:
      - "8000:8000" #specify ports forewarding
    expose:
      - "8000"

В идеале, я бы хотел, чтобы мой интерфейс мог поразить другой контейнер с заданной конечной точкой, чтобы я мог развернуть приложение с минимальными изменениями. Буду признателен за любые советы. Я чувствую, чтоЯ упускаю что-то действительно простое, но после нескольких часов работы я все еще не уловил это.

Спасибо!

Ответы [ 3 ]

1 голос
/ 04 июля 2019

На самом деле ваш трафик выглядит следующим образом:

  1. Страница запроса браузера пользователя из angular container, тогда все страницы будут отображаться в браузере пользователя.

  2. Код переднего javascript, использующий angular HttpClient для извлечения данных из express contaner.

    В то время, хотя docker-compose настроил для вас настроенную сеть, которая позволяет auto-dns разрешать angular & express, но этот dns работает только среди контейнеров, а не для хоста.

    Но ваш augular HttpClient, который вызвал http://express, произошел в браузере пользователя, а не в контейнере, поэтому auto-dns определенно не работает для вас, чтобы разрешить имя express.

Для вас, если вы просто хотите открыть браузер с вашего хоста докера, вы можете использовать localhost, но если вы также хотите, чтобы пользователь с другого компьютера посещал ваш веб, вам нужно было использовать ip вашего dockerhost.

Затем в angular HttpClient вам нужно использовать что-то вроде http://your_dockerhost_ip:8000, чтобы посетить экспресс-контейнер.

Если интересно, вы можете посетить это , чтобы увидеть User-defined bridges provide automatic DNS resolution between containers.

0 голосов
/ 04 июля 2019
    **sample docker-compose.yaml**
      version: '3.5'
      services:     
        angular:
          image: "angular-alpine:0.0.1"
          container_name: angular 
          tty: true
          stdin_open: true
          networks:
            app_net:
            ipv4_address: 172.16.238.05
          depends_on:
            - express

       express:
         image: "express:0.0.1"
         container_name: express
         tty: true
         stdin_open: true
         networks:
           app_net:
           ipv4_address: 172.16.238.10

      networks:
        app_net:
          driver: bridge
        ipam:
        driver: default
        config:
          - subnet: 172.16.238.0/24

> "1. Angular будет работать 172.16.238.05:4200, а экспресс - 172.16.238.10:some-port. 2. измените ваш config.ts или parameter.ts или любой файл, в котором вы настраиваете экспресс-URL, на 172.16.238.10:some-port. Теперь ваш угловой соединится с экспрессом. "

0 голосов
/ 04 июля 2019

Несколько вещей:

  1. Используя expose , вы делаете опубликованные порты контейнера доступными только для связанных / сетевых служб.Это одна из причин, по которой вы не можете получить к ней доступ локально.
  2. Вместо нажатия http://express:8000/ вы должны попытаться нажать http://localhost:8000. Служба публикуется в вашей локальной системе и являетсяпо умолчанию ничего не обслуживается (например, IIS, NGINX).
  3. Добавьте пользовательскую сеть в ваш файл компоновки вместо использования ссылок.Теперь это основной способ сетевых контейнеров вместе :

    version: '3' # specify docker-compose version
    
    services:
      angular: # name of the first service
        build: ./ # specify the directory of the Dockerfile
        ports:
          - "4200:80" # maps port 4200 on localhost to 80 in container
        network:
          - mynetwork
        depends_on:
          - "express"
    
      express: # name of the second service
        build:  # specify the directory of the Dockerfile
          context: ./
          dockerfile: dockerfile.be
        ports:
          - "8000:8000" # maps port 8000 on localhost to 8000 in container
        networks:
          - mynetwork
    
    networks:
      mynetwork:

    2 : https://docs.docker.com/compose/compose-file/#expose

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...