Java.net.UnknownHostException: имя или служба неизвестны

Мой файл для создания докеров:

webapp:
    container_name: webapp
    hostname: webservice-server
    build:
      context: .
      dockerfile: ServerDockerfile // ServerDockerfile starts tomcat
    ports:
      - "8080:8080"

webservices_test_client:
    build:
      context: .
      dockerfile: TestsDockerfile
    depends_on:
      - webapp

Когда я пытаюсь отправить запрос на «http://webservice-server:8080/» через Apache HttpClient из тестов в контейнере webservices_test_client, я получаю UnknownHostException.

HttpGet httpGet = new HttpGet("http://webservice-server:8080/");
HttpResponse httpResponse = httpClient.execute(httpGet);

Что не так? Спасибо за ответы.

Ваш порт открыт для входящих подключений?

JAMSHAID 18.03.2022 11:01

@JAMSHAID да, порт открыт

Michael 18.03.2022 11:06

То, что вы здесь показываете, заключено в блок services: или это весь файл docker-compose.yml?

David Maze 18.03.2022 11:22

@DavidMaze это весь файл docker-compose.yml

Michael 18.03.2022 11:42
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
4
68
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Вы не указали сеть. С hostname: webservice-server вы просто устанавливаете имя хоста внутри контейнера webapp. У вас должна быть сеть, чтобы разные контейнеры могли видеть друг друга. Если вы не хотите создавать сеть для каждого контейнера, просто используйте networks: default aliases

Пожалуйста, вы можете мне объяснить? Я знаю, что docker-compose по умолчанию настраивает сеть для приложения. Контейнеры автоматически подключаются к этой сети. Если я прав, то мой вопрос звучит так: «Зачем нам явно создавать сеть, если у нас есть сеть, созданная по умолчанию?» Спасибо

Michael 18.03.2022 11:47

@Michael, потому что эта функция предназначена для более поздних версий docker-compose. В версии, которую вы используете (V1), вам нужно указать сеть.

Lrrr 18.03.2022 13:35
Ответ принят как подходящий

В вашем файле docker-compose.yml отсутствует строка version: и оболочка services:. Это делает его устаревшим версия 1 Создать файл, который не настраивает для вас сеть Docker. У самых современных инструментов возникнут проблемы с его запуском, потому что они будут интерпретировать файл как Составление спецификации четвертого поколения.

На верхнем уровне добавьте version: объявление, какую версию использовать (я предпочитаю использовать самую последнюю версию 3.8, не относящуюся к «спецификации»), и оберните объявления, которые у вас есть сейчас, в services::

version: '3.8'
services:
  webapp:
    build:
      context: .
      dockerfile: ServerDockerfile
    ports:
      - "8080:8080"

  webservices_test_client:
    build:
      context: .
      dockerfile: TestsDockerfile
    depends_on:
      - webapp

Вам не нужно объявлять networks:, container_name: или hostname:. В файле Compose версии 2 или 3 Compose настраивает эти вещи за вас, а имена службы Compose, такие как webapp, можно будет использовать в качестве имен хостов для вызова между контейнерами. Сеть в Compose в документации Docker содержит более подробную информацию.

Другие вопросы по теме