Не получается наладить связь между сервисами внутри Docker-контенейра (HTTP)
Проблема в следующем: я делаю проект используя Spring Boot и в моем проекте есть два модуля, которые должны функционировать отдельно друг от друга и общаться между собой через HTTP протокол. Данные модули уже написаны и готовы и теперь я пытаюсь запустить это всё в контейнере Docker и всё запускается — я могу полноценно пользоваться сервисом, но при попытке использовать функцию, которая отправляет HTTP-запрос второму модулю (через RestTemplate), получается, что модули друг друга не видят. Когда я разрабатывал приложение без Docker, то адреса были такими:
- Основной модуль на порту 8080
http://localhost:8080 - Второй модуль на порту 8081 и обращался я к нему по адресу, передавая некоторые значения в body
http://localhost:8081/compile
Теперь, когда я запустил эти модули в Docker, связав через Docker Compose, при обращении к такому адресу я получаю ошибку, вот мой docker-compose.yml:
version: '3.7'
services:
app:
container_name: dexterity
build: .
ports:
- 8080:8080
command: java -jar --spring.profiles.active=dev dexterity.jar
environment:
SPRING_DATASOURCE_URL: jdbc:postgresql://db:5432/dexterity
SPRING_DATASOURCE_USERNAME: postgres
SPRING_DATASOURCE_PASSWORD: 1234
depends_on:
- db
- compileta
networks:
- compileta
compileta:
container_name: compileta
image: compileta
ports:
- 8081:8081
networks:
- compileta
db:
container_name: postgres
image: postgres:latest
ports:
- 5432:5432
volumes:
- ./pg_data:/var/lib/postgresql/data/pgdata
environment:
POSTGRES_USERNAME: postgres
POSTGRES_PASSWORD: 1234
POSTGRES_DB: dexterity
restart: always
networks:
- compileta
networks:
compileta:
driver: bridge
Как правильно настроить такую сеть в Docker? Много времени потратил на поиск, но так и не смог разобраться.
Если вдруг нужны ещё какие-то подробности, спрашивайте. Отвечу быстро, очень нужна помощь
P.S. Модуль app является основным, модуль compileta — вторым, то есть тем, с которым связывается app
Ответы (1 шт):
Когда запускаете локально, то сервис compileta доступен по имени хоста localhost. В docker-compose он будет доступен по имени compileta (т.е. совпадает с именем сервиса docker-compose).
То есть вам нужно добавить (если еще нет такого) параметр в основное приложение, который будет указывать по какому адресу соединяться с compileta.
И потом нужно его задать в конфигурации сервиса app в docker-compose. Лучше всего через переменную окружения, аналогично тому, как задается адрес БД. Если параметр будет называться compileta.url, то тогда конфигурация будет такой:
...
app:
container_name: dexterity
build: .
ports:
- 8080:8080
command: java -jar --spring.profiles.active=dev dexterity.jar
environment:
COMPILETA_URL: http://compileta:8081/compile
SPRING_DATASOURCE_URL: jdbc:postgresql://db:5432/dexterity
SPRING_DATASOURCE_USERNAME: postgres
...
А в главном сервисе в классе который обращается к compileta должно быть что-то типа:
class SomeService {
@Value("${compileta.url}")
String compiletaUrl;
...
}