Докер-контейнер переднего плана получает отказ в соединении с бэкэнд-контейнером

Я пытаюсь научиться писать файл для создания докеров и пытаюсь использовать его для развертывания полнофункционального приложения (бэкэнд и интерфейс, написанные на Java. с использованием образа Docker MySQL для базы данных). Мой бэкэнд может без проблем взаимодействовать с контейнером MySQL, но интерфейс не может связаться с конечной точкой, предоставляемой моим бэкэндом. Я получаю следующую ошибку:

2024-05-08 17:04:23 2024-05-08T15:04:23.710Z ERROR 1 --- [Frontend] [nio-8080-exec-4] o.a.c.c.C.[.[.[/].[dispatcherServlet]    : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed: org.springframework.web.client.ResourceAccessException: I/O error on GET request for "http://backend:1337/api/person": Connection refused] with root cause

Мой docker-compose.yaml выглядит следующим образом:

version: '1'
services:
  mysql:
    image: mysql
    environment:
      MYSQL_ROOT_PASSWORD: mysecret
    restart: always
    container_name: mysql-container
    volumes:
      - mysql-db:/var/lib/mysql
    ports:
      - 3306:3306
  backend:
    build: ./Backend/
    ports:
      - 1337:8080
    container_name: backend-container
    depends_on:
      - mysql
  frontend:
    build: ./Frontend/
    ports:
      - 1338:8080
    container_name: frontend-container
    depends_on:
      - backend
volumes:
  mysql-db:
    driver: local

```

If you need any more information please let me know. Thanks

Если ваш backend контейнер публикует порт 8080, то это должен быть порт, к которому подключается ваш frontend, т.е. http://backend:8080/api/person

DazWilkin 08.05.2024 17:20

Синтаксис ports связывает порты контейнера, например. 8080 к портам хоста (с Docker), например. 1338. Это позволяет вам подключиться, например. backend с хоста через порт 1338 но изнутри Compose ваши контейнеры используют общую сеть, и необходимо использовать порты контейнера.

DazWilkin 08.05.2024 17:23

Это сработало! @ДазВилкин. Но я немного в замешательстве. Я думал, что сопоставил 8080 с бэкэнда с 1337. Я сделал это неправильно в своем файле docker-compose? Не создаст ли это также конфликт, поскольку и внешний, и внутренний интерфейсы будут использовать порт 8080 внутри общей сети?

LowlyCoder 08.05.2024 17:25

Надеюсь, мой второй комментарий помог это объяснить. Например, 1337:8080 карты {host-port}:{container-port} и поэтому вы предоставляете backend на 8080 хосту как порт 1337 (извините, я перепутал 1337 и 1338 в своем предыдущем комментарии). Нет, один и тот же порт не конфликтует в общей сети, поскольку Docker использует имя службы frontend и backend в качестве имен DNS, и поэтому они различны backend:8080 и frontend:8080 в общей сети.

DazWilkin 08.05.2024 17:30

Это многое объясняет. Спасибо большое за быстрые ответы! Можете ли вы опубликовать приведенное выше сообщение в качестве ответа, чтобы я мог отметить эту тему как отвеченную?

LowlyCoder 08.05.2024 17:33
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
5
91
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Если ваш backend контейнер публикует порт 8080, то это должен быть порт, к которому подключается ваш frontend, т.е. http://backend:8080/api/person

Синтаксис ports связывает порты контейнера, например. 8080 к портам хоста (с Docker), например. 1337. Это позволяет вам подключиться, например. backend с хоста через порт 1337 но изнутри Compose ваши контейнеры используют общую сеть, и необходимо использовать порты контейнера.

Например, 1337:8080 карты {host-port}:{container-port} и поэтому вы предоставляете backend на 8080 хосту как порт 1337

Один и тот же порт (например, 8080) не конфликтует в общей сети, поскольку Docker использует имя службы frontend и backend в качестве имен DNS, и поэтому они различны backend:8080 и frontend:8080 в общей сети.

Другие вопросы по теме