В чем была бы проблема, если бы я получил сообщение «Не удалось подключиться к хосту» docker-compose

Я пытаюсь подключиться к своему контейнеру с помощью моего пустого проекта Java Maven. Но я получил ошибку Socket fail to connect to host:address=(host=studentdb)(port=3306)(type=primary). studentdb

В чем будет проблема с моим docker-compose.yml?

version: '3.8'

services:
  mariadb:
    build:
      context: .
    container_name: studentdb
    networks:
      - default
    ports:
      - "3306:3306"
    expose:
      - "3306"
    volumes:
      - ./data:/var/lib/mysql
    environment:
      MYSQL_ROOT_PASSWORD: ${DB_ROOT_PASSWORD}
      MYSQL_DATABASE: ${DB_NAME}
      MYSQL_USER: ${DB_APPLICATION_USER}
      MYSQL_PASSWORD: ${DB_APPLICATION_PASSWORD}

И это мое приложение.свойства:

spring.application.name=student
spring.datasource.url=jdbc:mariadb://studentdb:3306/student
spring.jpa.hibernate.ddl-auto=none
spring.jpa.database-platform=org.hibernate.dialect.MariaDBDialect
spring.datasource.driver-class-name=org.mariadb.jdbc.Driver
spring.jpa.properties.javax.persistence.validation.mode=none
server.error.whitelabel.enabled=false

Вы запускаете проект maven в другом контейнере в той же сети? Вы не увидите имя хоста studentdb, если вы не находитесь в одной сети докера. Однако вы открыли порт 3306, поэтому, если вы работаете вне докера, вы сможете подключиться, изменив хост на localhost в файле application.properties.

Bernie 12.04.2024 01:54

@Bernie Я перешел со StudentDB на localhost, и ошибка та же.

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

Ответы 2

Ответ принят как подходящий

Способ подключения к базе данных будет зависеть от того, подключаетесь ли вы с хоста или из другого контейнера.

version: '3.8'

services:
  mariadb:
    image: mariadb:latest
    container_name: studentdb
    ports:
      - "3306:3306"
    environment:
      MYSQL_ROOT_PASSWORD: ${DB_ROOT_PASSWORD}
      MYSQL_DATABASE: ${DB_NAME}
      MYSQL_USER: ${DB_APPLICATION_USER}
      MYSQL_PASSWORD: ${DB_APPLICATION_PASSWORD}

Я предполагаю, что у вас есть файл .env с переменными, указанными в вашем файле docker-compose.yml.

DB_ROOT_PASSWORD=secret
DB_NAME=test
DB_APPLICATION_USER=user
DB_APPLICATION_PASSWORD=password

От хоста

Поскольку вы открываете порт 3306 в службе mariadb, вы можете подключиться к нему напрямую с хоста, используя 127.0.0.1 в качестве IP-адреса базы данных.

MYSQL_PWD=password mysql -h 127.0.0.1 -u user

Примечание. Я использую имя пользователя и пароль от .env.

Из другого контейнера

Если вы подключаетесь к базе данных из другого контейнера (в той же сети Docker), вам следует использовать либо имя службы (mariadb), либо имя контейнера (studentdb), а не IP-адрес.

Например, добавив еще один сервис в стек Docker Compose, указанный выше.

  client:
    image: mariadb:latest
    command: "bash -c 'sleep 5; MYSQL_PWD=${DB_APPLICATION_PASSWORD} mariadb -h mariadb -u ${DB_APPLICATION_USER}'"

Команда ждет 5 секунд (грубый способ убедиться, что база данных готова), а затем подключается, используя учетные данные, определенные в .env и mariadb в качестве имени хоста базы данных.

🚨 Если вы хотите использовать имя службы или контейнера для ссылки на хост базы данных, вам следует сделать это из другого контейнера в той же сети Docker.

При локальном запуске проекта Maven с помощью MariaDB, развернутой в Docker, вам следует подключиться к MariaDB, используя localhost, если MariaDB также работает локально. Однако если MariaDB развертывается удаленно, вам следует использовать IP-адрес удаленного хоста вместо локального хоста.

Docker Compose автоматически создает сеть, которая позволяет контейнерам в одном проекте Docker Compose взаимодействовать, используя имена служб в качестве имен хостов. Однако это работает только в том случае, если и приложение Maven, и MariaDB работают как службы в одной и той же конфигурации Docker Compose. Если ваш проект Maven не работает внутри контейнера Docker, управляемого тем же Docker Compose, который управляет вашим контейнером MariaDB, вы не сможете использовать имя службы напрямую. Вместо этого вам нужно будет использовать localhost для подключения к MariaDB при локальном развертывании или общедоступный IP-адрес сервера при удаленном развертывании.

Помните, что при использовании Docker Compose созданная сеть по умолчанию изолирует ваши сервисы от внешнего доступа, но все сервисы в одном файле Compose могут обращаться друг к другу по соответствующим именам сервисов. Если ваша настройка не позволяет использовать имена служб (например, Maven работает на вашем хост-компьютере вне Docker), то конечную точку соединения необходимо настроить, как описано выше.

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