Связь сервисов в docker-compose
Я новичок в docker. У меня есть 2 спринг бут сервиса: 1 admin-server приложение на основе спринг админ. Порт 9003 2 client-service простое спринг бут приложение с парой эндпойнтов. Порт 8080
Я создал в каждом проекте dockerfile. Листинг:
1.Админ application.properties:
server.port = 9003
Админ докерфайл:
FROM amazoncorretto:11-alpine3.12
COPY build/libs/admin-server-0.0.1-SNAPSHOT.jar admin-server.jar
ENTRYPOINT ["java","-jar","/admin-server.jar"]
EXPOSE 9003
2.Клиент application.properties:
spring.profiles.active=dev
management.endpoints.web.exposure.include=*
spring.boot.admin.client.url=http://admin-server:9003
spring.boot.admin.api-path=/instances
info.application.name=client-service
info.application.description=spring boot client-service application
info.application.version=0.0.1-SNAPSHOT
Клиент докерфайл:
FROM amazoncorretto:11-alpine3.12
COPY build/libs/client-service-0.0.1-SNAPSHOT.jar client-server.jar
ENTRYPOINT ["java","-jar","/client-server.jar"]
EXPOSE 8080
И собственно docker-compose:
version: "3.8"
services:
admin-server:
image: amerta90/admin-server
container_name: admin-server
restart: on-failure
ports:
- 9003:9003
client-service:
image: amerta90/client-service
container_name: client-service
restart: on-failure
depends_on:
- admin-server
ports:
- 8080:8080
Все хорошо поднимается, даже работает) Но проблема в том, что админ не видит клиентское приложение. Вот такой варнинг возвращает:
client-service | 2022-05-05 09:29:49.205 WARN 1 --- [gistrationTask1] d.c.b.a.c.r.ApplicationRegistrator : Failed to register application as Application(name=spring-boot-application, managementUrl=http://1159d8a4d93f:8080/
actuator, healthUrl=http://1159d8a4d93f:8080/actuator/health, serviceUrl=http://1159d8a4d93f:8080/) at spring-boot-admin ([http://localhost:9003/instances]): I/O error on POST request for "http://localhost:9003/instances": Connectio
n refused (Connection refused); nested exception is java.net.ConnectException: Connection refused (Connection refused). Further attempts are logged on DEBUG level
Как быть?
Ответы (1 шт):
localhost внутри контейнера и на хосте (в данном случае на ПК) - это разные адреса (What does localhost means inside a Docker container?).
Варианты решения:
- Создать сеть и подключить в нее оба контейнера. Networking overview.
- Обратиться из контейнера к localhost ПК и через него ко второму контейнеру. I want to connect from a container to a service on the host.
- Прокинуть link между контейнерами. Эта возможность помечена как deprecated. Links.
Первый вариант предпочтительный. Пример:
version: "3.8"
services:
admin-server:
image: amerta90/admin-server
container_name: admin-server
restart: on-failure
ports:
- 9003:9003
networks:
- my-network
client-service:
image: amerta90/client-service
container_name: client-service
restart: on-failure
depends_on:
- admin-server
ports:
- 8080:8080
networks:
- my-network
networks:
my-network:
driver: "bridge"
Здесь мы создаем сеть с именем my-network и подключаем в нее контейнеры. После этого внутри сети можно обращаться к контейнеру по его имени. Соответственно, вместо localhost нужно использовать admin-server.