如果我收到“Socket failed to connect to host”docker-compose,会出现什么问题

问题描述 投票:0回答:1

我正在尝试使用空的 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}

这是我的application.properties

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
java spring-boot docker maven docker-compose
1个回答
0
投票

如何连接到数据库取决于您是从主机连接还是从另一个容器连接。

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

来自主持人

由于您在

mariadb
服务上公开了端口 3306,因此您可以使用 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 网络中的另一个容器执行此操作。

© www.soinside.com 2019 - 2024. All rights reserved.