从 Spring Boot 应用程序连接到 mysql 容器

Posted

技术标签:

【中文标题】从 Spring Boot 应用程序连接到 mysql 容器【英文标题】:From Springboot app connect to mysql container 【发布时间】:2018-09-26 14:35:06 【问题描述】:

大家好!

这是我的第一次,所以我会尽力做到最好。

我想创建一个使用 Springboot 框架运行的应用程序,我想将它连接到一个嵌入 mysql 的 docker 容器(但 spring boot 应用程序没有在 docker 上运行)

所以我关注了这个post

我已经制作了我的 docker-compose:

  db:
     image: mysql
  ports:
     - '3306:3306'
  environment:
     - MYSQL_ROOT_PASSWORD=secret
     - MYSQL_DATABASE=users
  volumes:
     - ../data:/var/lib/mysql

我用这个命令运行它:

docker-compose run --service-ports db

一切都很好,所以现在我在 spring boot 上更改了我的 application.properties:

   ## Server Properties 
   server.port= 5000

   ## Spring DATASOURCE (DataSourceAutoConfiguration & DataSourceProperties)
   spring.datasource.url= jdbc:mysql://127.0.0.1:3306/users?useSSL=false&serverTimezone=UTC&useLegacyDatetimeCode=false
   spring.datasource.username= root
   spring.datasource.password= secret

   ## Hibernate Properties

   #The SQL dialect makes Hibernate generate better SQL for the chosen database

   spring.jpa.properties.hibernate.dialect= org.hibernate.dialect.MySQL5InnoDBDialect
   spring.jpa.hibernate.ddl-auto = update

   ## Hibernate Logging
   logging.level.org.hibernate.SQL= DEBUG

   ## Jackson Properties
   spring.jackson.serialization.WRITE_DATES_AS_TIMESTAMPS= false
   spring.jackson.time-zone= UTC

但是当我运行我的应用程序时,我有这个错误:( :

原因:org.springframework.jdbc.CannotGetJdbcConnectionException: 获取JDBC连接失败;嵌套异常是 com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure

我在 MacOS 上...

我试图跟随 callicoder 的课程......

https://www.callicoder.com/spring-boot-spring-security-jwt-mysql-react-app-part-1/

感谢您的帮助:)

【问题讨论】:

第一个猜测:尝试不使用服务端口选项或使用 localhost 而不是 127.0.0.1 不工作,但感谢您的回复... 【参考方案1】:

问题是 db 容器没有在 localhost 上运行,而是在迷你 Linux VM 内运行,因为您在 MAC 上。

因此,要连接到数据库,您需要使用运行容器的机器的 IP 地址。为此,请运行命令docker-machine ip default。这将返回您将在连接 url 中使用的 IP 地址,而不是 localhost:

spring.datasource.url= jdbc:mysql://<docker-machine-ip>:3306/users?useSSL=false&serverTimezone=UTC&useLegacyDatetimeCode=false

【讨论】:

我还没有docker机,我要自己造一台? 过去是这样,但最近的 Mac 版 Docker 直接使用虚拟机管理程序而不是 vagrant VM。 使用:docker port database_db_1 输出:3306/tcp -&gt; 0.0.0.0:3306 所以我使用:jdbc:mysql://0.0.0.0:3306/users?useSSL=false&serverTimezone=UTC&useLegacyDatetimeCode=false :),谢谢兄弟

以上是关于从 Spring Boot 应用程序连接到 mysql 容器的主要内容,如果未能解决你的问题,请参考以下文章

如何从 Spring Boot 连接到在线 MongoDB 数据库?

无法从 Spring Boot 应用程序连接到 Bigtable

Docker MySQL - 无法从 Spring Boot 应用程序连接到 MySQL 数据库

从 Spring Boot 连接到 AWS SQS 时出错

无法从 docker 容器内的 Spring Boot 连接到 Redis

从位于服务器上的 Spring Boot 应用程序连接到远程数据库失败