我正在尝试使用空的 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
如何连接到数据库取决于您是从主机连接还是从另一个容器连接。
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 网络中的另一个容器执行此操作。