我有一个在本地主机上运行的项目,使用 intellij 作为 Springboot 实例没有问题,使用 Xampp 的 SQL。这工作正常。但现在我想将所有这些都放在 docker 上。所以我在我的目录中制作了一个 dockerfile 和一个 docker-compose up 文件:
-Application
|
-Frontend (not in docker implemented yet)
-Backend (springAPI)
|
-dockerfile
-Python (flaskAPI) (not in docker implemented yet)
docker-compose.yml
docker-compose.yml 看起来像这样:
version: '3.9'
services:
db:
image: mysql:latest
restart: always
environment:
MYSQL_ROOT_PASSWORD: <pass>
MYSQL_DATABASE: mydb
MYSQL_USER: <user>
MYSQL_PASSWORD: <pass>
ports:
- "3306:3306"
volumes:
- ./data:/var/lib/mysql
phpmyadmin:
image: phpmyadmin/phpmyadmin:latest
restart: always
depends_on:
- db
ports:
- "8888:80"
environment:
PMA_HOST: db
MYSQL_ROOT_PASSWORD: example
spring-api:
image: spring-api:latest
ports:
- "8080:8080"
depends_on:
- db
volumes:
dbdata:
mysql-data:
springapi 的 dockerfile 如下所示:
# Use an official OpenJDK runtime as a parent image
FROM openjdk:17-jdk-slim
# Set the working directory to /app
WORKDIR /app
# Copy the application jar file to the container
COPY build/libs/backendAPI.jar backendAPI.jar
# Run the application
CMD ["java", "-jar", "backendAPI.jar"]
这可以由 docker 组成并运行容器。 java spring boot 如何抛出错误并关闭。错误是:
`2023-03-06T12:25:37.603Z INFO 1 --- [ main] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Starting...
2023-03-06T12:25:38.685Z ERROR 1 --- [ main] com.zaxxer.hikari.pool.HikariPool : HikariPool-1 - Exception during pool initialization.
com.mysql.cj.jdbc.exceptions.CommunicationsException: Communications link failure
The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server.`
我试着像这样重新配置我的 application.settings :
spring.datasource.url=jdbc:mysql://localhost:8888/mydb
spring.datasource.username=<theusername>
spring.datasource.password=<thepassword>
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
但无济于事。因为它不断抛出相同的错误。可以通过给定的 url 访问 SQL 服务器。所以运行良好(除了没有管理员特权,但这是一个不同的问题。)
这个设置对 application.settings 进行了一些调整,当我只使用 Xammp 和 intellij 时工作正常。但是现在我无法连接它。我在这里错过了什么?
在 docker compose 文件中给你的数据库服务一个容器名称
db:
image: mysql:latest
restart: always
**container_name: db-container**
然后在您的 jdbc url 中,您应该引用配置的数据库容器名称和数据库容器的实际配置端口。
所以你的 datasource.url 看起来像
spring.datasource.url=jdbc:mysql://db-container:3306/mydb