当前位置: 首页 > 知识库问答 >
问题:

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

微生俊材
2023-03-14

我想做的是,从我的spring boot应用程序连接到Docker中的mysql数据库。每个都在各自的容器中。

但是我一定有什么问题,因为我做不到。

为了保持简单:

应用程序属性:

# URL for the mysql db
spring.datasource.url=jdbc:mysql://workaround-mysql:3308/workaround?serverTimezone=UTC&max_allowed_packet=15728640
# User name in mysql
spring.datasource.username=springuser
# Password for mysql
spring.datasource.password=admin
#Port at which application runs
server.port=8080

MySQL的docker组合:

version: '3'
services:
  workaround-mysql:
    container_name: workaround-mysql
    image: mysql
    environment:
      MYSQL_DATABASE: workaround
      MYSQL_USER: springuser
      MYSQL_PASSWORD: admin
      MYSQL_ROOT_PASSWORD: admin
      MYSQL_ROOT_HOST: '%'
    ports:
      - "3308:3306"
    restart: always

很简单,对吧?数据库我从docker-composup开始:

到目前为止,一切似乎都很顺利。

现在我已经启动了db,对于应用程序来说,这是它的docker组件。yml:

version: '3'
services:

  workaround:
    restart: always
    # will build ./docker/workaround/Dockerfile
    build: ./docker/workaround
    working_dir: /workaround
    volumes:
      - ./:/workaround
      - ~/.m2:/root/.m2
    expose:
      - "8080"
    command: "mvn clean spring-boot:run"

对于它的Dockerfile,我使用Linux Alpine和Java。

FROM alpine:3.9
....add java...
RUN apk update
RUN apk add dos2unix --update-cache --repository http://dl-3.alpinelinux.org/alpine/edge/community/ --allow-untrusted
RUN apk add bash
RUN apk add maven

超级简单。现在让我们启动应用程序:

未知主机,那么让我们试试IP:

    docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' workaround-mysql

# URL for the mysql db
spring.datasource.url=jdbc:mysql://172.20.0.2:3308/workaround?serverTimezone=UTC&max_allowed_packet=15728640

现在我得到超时:

正如你们所见,我犯了一个错误。我的设置有什么问题,如何解决?我有未知的主机异常或拒绝连接或连接超时。

我尝试过:

  • 在我的application.properties中使用容器的ip,不起作用
  • MySQL和应用程序的不同端口
  • MySQL的不同图像和版本
  • 将所有内容都放在一个docker中,并与等待组合
  • 数据库计时器。
  • 最小设置https://github.com/hellokoding/hellokoding-courses/tree/master/docker-examples/dockercompose-springboot-mysql-nginx也导致通信链路故障,站点可以访问,但我怀疑数据库连接正确。

注意:

>

这里是docker ps-a

@Vusal应答输出:

与答案中的代码唯一不同的是,我确实等待数据库准备好30秒

command: /bin/bash -c "sleep 30;mvn clean spring-boot:run;"

共有3个答案

胡云瀚
2023-03-14

为了让服务通过docker与MySql连接,它必须在同一个网络中,请查看docker网络

但为了更好的解决方案,我建议您为MySql和Spring boot编写一个docker compose文件。原因是当你这样做时,它很容易被链接。不需要任何其他配置。

version: "3"
services:
  mysql-service:
    image: mysql
    ports:
      - "3306:3306"
    environment:
      - MYSQL_DATABASE=db
      - MYSQL_USER=root
      - MYSQL_PASSWORD=pass
      - MYSQL_ROOT_PASSWORD=pass
  spring-service:
    image: springservce:latest
    ports:
      - "8080:8080"
    depends_on:
      - mysql-service

农飞尘
2023-03-14

到目前为止,您还没有尝试在同一Docker网络上运行这两个容器。

首先,忘记IP地址——无论如何都应该避免使用它。

其次,使用相同的Docker网络启动两个compose实例。

第三,不要暴露端口——在桥接网络中,所有端口都可以被正在运行的容器访问。

>

 docker network create foo

修改两个撰写文件,以便它们使用此网络,而不是创建每个自己的:

 version: '3.5'
 services:

 ....

 networks:
   default:
     external: true
     name: foo

从compose文件中删除expose指令-默认情况下,在一个网络中,所有端口都是公开的

修改连接字符串以使用默认3306端口而不是3308

享受

益和雅
2023-03-14

试试这个docker compose。yml:

version: '3'
services:
  workaround-mysql:
    container_name: workaround-mysql
    image: mysql
    environment:
      MYSQL_DATABASE: workaround
      MYSQL_USER: springuser
      MYSQL_PASSWORD: admin
      MYSQL_ROOT_PASSWORD: admin
      MYSQL_ROOT_HOST: '%'
    ports:
      - "3308:3306"
    restart: always
  workaround:
    depends_on: 
      - workaround-mysql
    restart: always
    # will build ./docker/workaround/Dockerfile
    build: ./docker/workaround
    working_dir: /workaround
    volumes:
      - ./:/workaround
      - ~/.m2:/root/.m2
    expose:
      - "8080"
    command: "mvn clean spring-boot:run"

并更新您的应用程序。属性要使用下一个JDBC连接url:

spring.datasource.url=jdbc:mysql://workaround-mysql:3306/workaround?serverTimezone=UTC&max_allowed_packet=15728640

当同一docker compose文件中的两个容器都组成文件时,它应该可以工作,因为docker compose为容器创建默认网络,因此它们可以按名称相互解析

 类似资料:
  • 我正在尝试从Spring Boot应用程序连接到mySQL数据库。然而,当我试图运行它时,它显示出错误。 我如何解决这个问题? 错误 从我的文件中添加代码片段 pom。xml 应用属性 堆栈跟踪 我还没有在sql中手动创建表,因为我认为spring.jpa.hibernate.ddl-Auto=date应该这样做

  • 喂,伙计们! 这是我的第一次,所以我会尽力做到最好。 我想创建一个应用程序,它是运行与Springboot框架,我想把它连接到一个docker容器嵌入MySQL(但Spring启动应用程序不是运行在docker) 所以我一直关注这个帖子 我已经做了我的docker-comact: 我用这个命令运行它: 一切都很好,所以现在我在Spring靴上改变application.properties: 但当

  • application.yml: 我尝试从运行mysql的命名空间上的另一个pod访问该服务,因为它已经预先安装了mysql-client,并从主机访问该服务。两人都有访问数据库的权限。我还在运行应用程序的pod上tring ping。它发现服务有任何问题。 然后我尝试使用NodePort而不是ClusterIP。什么都没变。 我完全卡住了,不知道出了什么问题。如有任何帮助,不胜感激。

  • 尝试使用主连接字符串和用户名(数据库名)连接到cosmosdb Mongo API 原因:com.mongodb.mongotieoutexception:在等待与com.mongodb.client.internal.mongoclientdelegate$1@3C291AAD匹配的服务器时,在30000 ms后超时。群集状态的客户端视图是{type=replica_set,servers=[{

  • 我在将 rails 2.3.5 应用程序连接到远程数据库时遇到问题。 在我的数据库.yml中,我有: 我得到的错误是: 无法通过套接字连接到本地 MySQL 服务器 (2) 我知道问题不在权限或用户设置上,因为当我使用相同的mysqlgem运行一个简单的ruby脚本时,它会起作用。此外,我的python脚本可以连接,我可以通过CLI与连接 我似乎无法让rails使用192.168.1.113而不是

  • 我已经在一个实例中安装了opsmanager数据库,并在其他实例中安装了应用程序 > 在应用程序数据库服务器中,i时显示127.0.0.1:27017运行mongod 当我用sudo服务mongodb-mms启动时,会出现以下错误 uri=mongoDb://db_instance_publicip:27017/?maxpoolsize=150}错误:在等待连接时超时30000 ms后.....