#spring-boot #docker #docker-compose #dockerfile
#пружинный ботинок #докер #докер-сочинение #докерфайл
Вопрос:
У меня есть служба приветствия и Всемирная служба. У службы Hello есть точка отдыха /hello/hw, которая внутренне вызывает конечную точку отдыха в мировой службе, чтобы вернуть строку «Hello World». Приложение работает нормально, как и ожидалось, если система не докеризована.
Однако проблема в том, когда я хочу докеризировать систему. Я использую docker-compose для контейнеризации обеих служб. Я определил пользовательскую сеть в файле компоновки docker (с именем custom_net).
Конечная точка rest /hello/hw доступна, но служба Hello не может вызвать конечную точку rest в Мировой службе.
application.properties в службе Hello имеет URL-адрес всемирной службы в виде http://localhost:8082/world
Я получаю исключение UnknownHostException, когда задаю URL-адрес как http://custom_net:8082/world или к http://custom_net:8092/world
Я получаю исключение отказа в подключении, когда я не изменяю URL-адрес в application.properties. В сообщении журнала говорится: «Сбой: отказано в подключении: localhost/127.0.0.1:8082;» Я не уверен, какие конфигурации необходимы для соединения двух служб
В списке команд docker network имя пользовательской сети отображается как «tempfolder_custom_net». Команда docker inspect показывает, что и hello, и всемирная служба зарегистрированы в этой сети
version: '3' services: hello_service: image: 'openjdk:8-jdk-alpine' restart: always container_name: hello_service volumes: - ./deploy:/root networks: - custom_net depends_on: - world_service command: sh -c "java -jar -Dspring.config.location=file:///root/hello/application.yml /root/hello/hello-0.0.1-SNAPSHOT.jar " ports: - 8091:8081 world_service: image: 'openjdk:8-jdk-alpine' restart: always container_name: world_service volumes: - ./deploy:/root command: sh -c "java -jar -Dspring.config.location=file:///root/world/application.yml /root/world/world-0.0.1-SNAPSHOT.jar " ports: - 8092:8082 networks: - custom_net networks: custom_net: driver: bridge
Приложение.yml службы приветствия …
server: port: 8081 services: world: url: http://localhost:8082/world
Комментарии:
1. попробуйте позвонить
http://world_service:8092/world
2. «http ://world_service:8092/world» выдает исключение отказа в подключении. «http ://world_service:8082/world» выдает ошибку 400 неверного запроса
3. как вы позвонили в службу word из службы hello ? как настроить вызов URL в коде ? кстати, проверьте
http://172.17.0.1:8092/world
4. В сервисе Hello я использую WebClient. Веб-клиент получает базовый URL-адрес из application.properties. Я не хочу жестко кодировать ip-адрес. Является ли это стандартной практикой в производственной среде для жесткого кодирования ip-адреса?
5. можете ли вы поделиться URL-адресом из файла application.properties и проверить
http://172.17.0.1:8092/world
?
Ответ №1:
Вы должны создать новую базу изображений на openjdk:8-jdk-alpine
основе изображения и добавить ТОЧКУ входа
Вам следует изменить это:
server: port: 8081 services: world: url: http://localhost:8082/world
Для :
server: port: 8081 services: world: url: http://world_service:8092/world
Убедитесь, что оба контейнера запущены.
Комментарии:
1. Это не решило проблему. Я получаю «Отказано в подключении: worldservice/172.18.0.2:8092»
2. Пожалуйста, объясните, почему необходимо использовать новую базу изображений. Моя существующая база изображений такая же. Также то, что нужно упомянуть в ENTRYPOINT. Разве этой команды недостаточно? Я могу получить доступ к сервису Hello и API World service независимо
3. Нугуен Ван URL — адрес должен быть worldservice:8082/world . Номер порта должен принадлежать приложению, а не открытому порту docker, а имя хоста должно быть worldservice (подчеркивание удалено).
4. работает ли он с новой конфигурацией ?
5. ДА. Разница лишь в том, что пользовательская сеть докеров не используется.
Ответ №2:
@Thanh Nuguyen Ван спасибо за полезные советы по устранению неполадок. Проблема была с именем хоста world_service. Похоже, подчеркивание не является допустимым URL-адресом. Ниже приведен мой обновленный файл docker compose. Мне даже не пришлось использовать пользовательскую сеть докеров. Я обновил URL-адрес в приложении.yml для http://worldservice:8082/world. Также обратите внимание, что порт 8082, а не 8092. Мы должны упомянуть порт приложения, а не открытый порт docker.
version: '3' services: helloservice: image: 'openjdk:8-jdk-alpine' restart: always container_name: helloservice volumes: - ./deploy:/root #networks: #- custom_net depends_on: - worldservice command: sh -c "java -Xdebug -jar -Dspring.config.location=file:///root/hello/application.yml /root/hello/hello-0.0.1-SNAPSHOT.jar " ports: - 8091:8081 worldservice: image: 'openjdk:8-jdk-alpine' restart: always container_name: worldservice volumes: - ./deploy:/root command: sh -c "java -Xdebug -jar -Dspring.config.location=file:///root/world/application.yml /root/world/world-0.0.1-SNAPSHOT.jar " ports: - 8092:8082 #networks: #- custom_net #networks: #custom_net: #driver: bridge