Я пытаюсь научиться писать файл для создания докеров и пытаюсь использовать его для развертывания полнофункционального приложения (бэкэнд и интерфейс, написанные на 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
Синтаксис ports связывает порты контейнера, например. 8080 к портам хоста (с Docker), например. 1338. Это позволяет вам подключиться, например. backend с хоста через порт 1338 но изнутри Compose ваши контейнеры используют общую сеть, и необходимо использовать порты контейнера.
Это сработало! @ДазВилкин. Но я немного в замешательстве. Я думал, что сопоставил 8080 с бэкэнда с 1337. Я сделал это неправильно в своем файле docker-compose? Не создаст ли это также конфликт, поскольку и внешний, и внутренний интерфейсы будут использовать порт 8080 внутри общей сети?
Надеюсь, мой второй комментарий помог это объяснить. Например, 1337:8080 карты {host-port}:{container-port} и поэтому вы предоставляете backend на 8080 хосту как порт 1337 (извините, я перепутал 1337 и 1338 в своем предыдущем комментарии). Нет, один и тот же порт не конфликтует в общей сети, поскольку Docker использует имя службы frontend и backend в качестве имен DNS, и поэтому они различны backend:8080 и frontend:8080 в общей сети.
Это многое объясняет. Спасибо большое за быстрые ответы! Можете ли вы опубликовать приведенное выше сообщение в качестве ответа, чтобы я мог отметить эту тему как отвеченную?




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