我需要使用 docker-compose 在带有 mysql 数据库的 Spring Boot 上运行我的应用程序。为什么通过这样的服务配置,应用程序(app)无法连接到mysql(db)?
Dockerfile:
FROM openjdk:23-slim
ARG JAR_FILE=target/*.jar
COPY ${JAR_FILE} app.jar
EXPOSE 8080
ENTRYPOINT ["java", "-jar", "app.jar"]
docker-compose.yml:
version: "3"
services:
db:
image: mysql:5.7
restart: unless-stopped
environment:
- MYSQL_ROOT_PASSWORD=123
- MYSQL_DATABASE=catalogue
ports:
- "3306:3306"
expose:
- 3306
volumes:
- db:/var/lib/mysql
networks:
- net
app:
depends_on:
- db
build:
context: .
dockerfile: Dockerfile
restart: on-failure
ports:
- "8080:8080"
networks:
- net
volumes:
db:
networks:
net:
driver: bridge
Java应用程序配置:
spring:
datasource:
url: jdbc:mysql://localhost:3306/catalogue
username: root
password: 123
driver-class-name=com: com.mysql.jdbc.Driver
jpa:
hibernate:
ddl-auto: update
database-platform: org.hibernate.dialect.MySQL8Dialect
defer-datasource-initialization: true
sql:
init:
mode: always
错误是这样的:The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server.
您尝试通过本地主机从服务连接到数据库,但这是不可能的,因为每个容器都提供一个隔离的环境,您可以连接到它们的端口,因为您已将它们的端口映射到本地主机。但在每个容器内部,每个容器都有自己的本地主机,并且没有这样的映射。Docker Compose 独立为容器创建一个地址空间;默认情况下,每个容器的地址与其名称相对应。您需要在服务中将其替换
url: jdbc:mysql://localhost:3306/catalogue为url: jdbc:mysql://db:3306/catalogue