Spring Boot + MySQL docker 容器

Posted

技术标签:

【中文标题】Spring Boot + MySQL docker 容器【英文标题】:Spring Boot + MySQL docker containers 【发布时间】:2022-01-09 00:21:12 【问题描述】:

我有两个容器,一个带有 Srping 应用程序,另一个带有 mysql。当我在本地机器上运行 Spring 应用程序时,它成功连接到我在 docker 容器中运行的 MySQL 数据库。启动 Spring 容器后,我收到连接错误,应用程序无法与 MySQL 容器通信。如何配置 Spring 容器与 db 容器通信?我试过创建一个桥接网络无济于事。我相信我的问题是spring.datasource.url=jdbc:mysql://localhost:3309/library,但是当我尝试使用网络 ID 时,jar 无法构建spring.datasource.url=jdbc:mysql://lms-network/library。我一直在关注this 教程。码头工人image.

【问题讨论】:

【参考方案1】:

有几种方法可以解决。

使用 docker-compose

将两个容器放入 docker-compose 文件中。示例:

version: "3"
services: 
  spring-boot-service:
    build:
      context: .
    ports:
      - 8080:8080
    environment:
      DB_HOST: mysql-db
      DB_NAME: library
      DB_USER: <user>
      DB_PASSWORD : <pwd>


  mysql-db:
    image: mysql
    ports:
      - 3306:3306
    environment:
      MYSQL_ROOT_PASSWORD: "root"
      MYSQL_DATABASE: <db_name>
      #... other properties

然后在 application.properties 中,使用连接字符串: spring.datasource.url=jdbc:mysql://$DB_HOST:3306/$DB_NAME

然后使用docker-compose up 一起运行两个容器。这样他们将通过 docker-compose 共享网络。

使用 host.docker.internal

当您在单独的容器中运行 Spring Boot 应用程序和 mysql 时,您不能再从 localhost 引用 mysql 数据库,因为 localhost 意味着指向您的容器。由于 mysql 在您的主机上运行,​​您可以通过在连接字符串中使用 host.docker.internal 而不是 localhost 来引用它。

所以你的连接字符串应该是

spring.datasource.url=jdbc:mysql://host.docker.internal:3309/library

【讨论】:

我试过了,但仍然出现连接错误。如果我无法连接到 SQL 数据库,我不明白如何构建图像,因为 Spring 会在生成 jar 之前尝试运行应用程序。 理想的构建不应该依赖于 SQL 连接。您的单元测试可能是针对 MySQL 编写的。您能否分享您所面临错误的日志? 我明白了。谢谢您的帮助。这个视频有帮助 -> youtube.com/watch?v=PAQvxqocb6A

以上是关于Spring Boot + MySQL docker 容器的主要内容,如果未能解决你的问题,请参考以下文章

Docker 容器整合 Spring Boot 应用

使用docker构建第一个spring boot项目

IDEA快速部署Spring Boot 项目到Docker

Docker环境下Spring Boot应用内存飙升分析与解决

Spring Boot + MySQL + Docker Compose - 无法使 Spring Boot 连接到 MySQL

无法加载在 Docker 中运行的 Spring Boot 应用程序