英文:
Could not create connection to database server via Docker
问题
我已经创建了一个简单的Spring Boot应用程序,通过使用相同的网络与通过Docker运行的MYSQL进行通信。一旦我运行docker-compose up
命令,就会出现以下错误:
> employee-jdbc-container | java.sql.SQLNonTransientConnectionException:
> 无法创建与数据库服务器的连接。尝试重新连接3次后放弃。
>
> employee-jdbc-container | 原因是:
> com.mysql.cj.exceptions.UnableToConnectException: 不允许检索公钥
docker-compose.yml
version: "3"
services:
employee-mysql:
image: employee-jdbc
container_name: employee-jdbc-container
ports:
- "9090:9090"
networks:
- employee-mysql2
depends_on:
- mysqldb
mysqldb:
image: mysql:8
container_name: mysqldb
ports:
- "3306:3306"
networks:
- employee-mysql2
environment:
- MYSQL_USER=root
- MYSQL_ROOT_PASSWORD=root
- MYSQL_DATABASE=HR
networks:
employee-mysql2:
application.yml
server:
port: 9090
spring:
datasource:
url: "jdbc:mysql://mysqldb:3306/HR?createDatabaseIfNotExists=true&autoReconnect=true&useSSL=false"
username: root
password: root
platform: mysql
initialization-mode: always
driver-class-name: com.mysql.cj.jdbc.Driver
jpa:
database-platform: org.hibernate.dialect.MySQL8Dialect
我认为问题出在配置文件中,但不知道出了什么问题。
英文:
I have created a simple spring boot app to communicate with MYSQL via docker using the same network. Once I run docker-compose up
command then following errors have occurred
> employee-jdbc-container | java.sql.SQLNonTransientConnectionException:
> Could not create connection to database server. Attempted reconnect 3
> times. Giving up.
>
> employee-jdbc-container | Caused by:
> com.mysql.cj.exceptions.UnableToConnectException: Public Key Retrieval
> is not allowed
docker-compose.yml
version: "3"
services:
employee-mysql:
image: employee-jdbc
container_name: employee-jdbc-container
ports:
- "9090:9090"
networks:
- employee-mysql2
depends_on:
- mysqldb
mysqldb:
image: mysql:8
container_name: mysqldb
ports:
- "3306:3306"
networks:
- employee-mysql2
environment:
- MYSQL_USER=root
- MYSQL_ROOT_PASSWORD=root
- MYSQL_DATABASE=HR
networks:
employee-mysql2:
application.yml
server:
port: 9090
spring:
datasource:
url: "jdbc:mysql://mysqldb:3306/HR?createDatabaseIfNotExists=true&autoReconnect=true&useSSL=false"
username: root
password: root
platform: mysql
initialization-mode: always
driver-class-name: com.mysql.cj.jdbc.Driver
jpa:
database-platform: org.hibernate.dialect.MySQL8Dialect
I think the problem in the configuration file but have no idea what is wrong.
答案1
得分: 2
最终,我找到了另一种方式来运行这两个容器,没有任何问题。
**首先设置MySQL环境**
> docker pull mysql:8
然后将镜像作为容器运行
docker container run -d --name mysql-db -e MYSQL_ROOT_PASSWORD=<root_password> -e MYSQL_DATABASE=<database_name>
-e MYSQL_USER=<user> -e MYSQL_PASSWORD=<password> mysql:8(镜像名称及版本)
**其次设置Spring Boot环境**
*application.yml*
server:
port: 9090
spring:
datasource:
url: "jdbc:mysql://mysql-db/<database_name>?createDatabaseIfNotExists=true&autoReconnect=true&allowPublicKeyRetrieval=true&useSSL=false"
username: <username>
password: <password>
initialization-mode: always
driver-class-name: com.mysql.cj.jdbc.Driver
tomcat:
test-while-idle: true
validation-query: SELECT 1
jpa:
database-platform: org.hibernate.dialect.MySQL8Dialect
show-sql: true
hibernate:
ddl-auto: update
*Docker文件*
FROM openjdk:11
COPY ./target/employee-mysql.jar employee-mysql.jar
EXPOSE <port number>(应用程序运行的端口)
ENTRYPOINT ["java","-jar","employee-mysql.jar"]
为Spring Boot应用构建一个Docker镜像
> docker image build -t employee-jdbc .
将employee-jdbc镜像作为容器运行
docker container run -d --name employee-mysql -p 9090:9090 --link mysql-db:mysql(mysql是mysql-db容器的镜像)employee-jdbc(employee-jdbc是employee-mysql容器的镜像)
英文:
finally, I have found another way to run both containers without any issue.
first set MySQL environment
> docker pull mysql:8
then run the image as a container
docker container run -d --name mysql-db -e MYSQL_ROOT_PASSWORD=<root_password> -e MYSQL_DATABASE=<database_name>
-e MYSQL_USER=<user> -e MYSQL_PASSWORD=<password> mysql:8(image name with version)
second set spring boot environment
application.yml
server:
port: 9090
spring:
datasource:
url: "jdbc:mysql://mysql-db/<database_name>?createDatabaseIfNotExists=true&autoReconnect=true&allowPublicKeyRetrieval=true&useSSL=false"
username: <username>
password: <password>
initialization-mode: always
driver-class-name: com.mysql.cj.jdbc.Driver
tomcat:
test-while-idle: true
validation-query: SELECT 1
jpa:
database-platform: org.hibernate.dialect.MySQL8Dialect
show-sql: true
hibernate:
ddl-auto: update
Docker file
FROM openjdk:11
COPY ./target/employee-mysql.jar employee-mysql.jar
EXPOSE <port number> (where your application is running)
ENTRYPOINT ["java","-jar","employee-mysql.jar"]
build a docker image for spring boot app
> docker image build -t employee-jdbc .
run the employee-jdbc image as a container
docker container run -d --name employee-mysql -p 9090:9090 --link mysql-db:mysql(mysql is the image of mysql-db container) employee-jdbc(employee-jdbc is the image of employee-mysql container)
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论