Не получается наладить связь между сервисами внутри Docker-контенейра (HTTP)

Проблема в следующем: я делаю проект используя Spring Boot и в моем проекте есть два модуля, которые должны функционировать отдельно друг от друга и общаться между собой через HTTP протокол. Данные модули уже написаны и готовы и теперь я пытаюсь запустить это всё в контейнере Docker и всё запускается — я могу полноценно пользоваться сервисом, но при попытке использовать функцию, которая отправляет HTTP-запрос второму модулю (через RestTemplate), получается, что модули друг друга не видят. Когда я разрабатывал приложение без Docker, то адреса были такими:

  1. Основной модуль на порту 8080 http://localhost:8080
  2. Второй модуль на порту 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 шт):

Автор решения: Roman Konoval

Когда запускаете локально, то сервис 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;
...
}
→ Ссылка