无法通过 Docker 创建与数据库服务器的连接

Posted

技术标签:

【中文标题】无法通过 Docker 创建与数据库服务器的连接【英文标题】:Could not create connection to database server via Docker 【发布时间】:2020-12-19 08:59:58 【问题描述】:

我创建了一个简单的 Spring Boot 应用程序,以使用同一网络通过 docker 与 mysql 进行通信。一旦我运行docker-compose up 命令,就会发生以下错误

员工-jdbc-容器| java.sql.SQLNonTransientConnectionException: 无法创建与数据库服务器的连接。尝试重新连接 3 次。放弃。

员工-jdbc-容器|造成的: 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

我认为是配置文件的问题,但不知道哪里出了问题。

【问题讨论】:

请尝试使用其他工具连接到数据库,看看它是否正常工作。如果数据库正常工作,则问题可能在 application.yml 中。 您确定您的数据库已启动,何时建立连接?您是否尝试在短时间内重复docker-compose up? (它应该在保持 DB 不活动的同时重新启动您的应用程序。) 您的错误提示,您需要更新启动选项 - ***.com/questions/50379839/… @GiantsGits yes.DB 容器正在运行 @RatzzFatzz MYSQL 尚未安装在我的本地计算机上。如果有其他方法可以在不安装在本地机器上的情况下检查它 【参考方案1】:

最后,我找到了另一种方法来运行这两个容器而没有任何问题。

首先设置 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(image name with version)

第二套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> (where your application is running)
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 is the image of mysql-db container) employee-jdbc(employee-jdbc is the image of employee-mysql container)

【讨论】:

以上是关于无法通过 Docker 创建与数据库服务器的连接的主要内容,如果未能解决你的问题,请参考以下文章

Docker:无法连接 Spring Boot 和 MYSQL

无法在 GitHub 操作中将 Node.js 与 Docker MySQL 数据库连接

docker中无法通过ZUUL api网关连接微服务

Docker常见故障

如何在docker上远程访问mariadb?

docker的网络模式:none