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

标签 mysql spring spring-boot docker docker-compose

我想做的是,从我的 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-compose:

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-compose up 开始的数据库:

enter image description here

到目前为止一切似乎都运行良好。

现在我已经启动了 db,对于应用程序,这是它的 docker-compose.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

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

enter image description here

enter image description here

enter image description here

未知主机,那么让我们试试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

现在我超时了:

enter image description here

如您所见,我得到了错误。我的设置有什么问题以及如何修复 这?我有未知的主机异常或拒绝连接或连接超时。

我试过:

注意事项:

  • 我在一台计算机上运行这一切我使用端口 3308 因为我有本地 MySQL 数据库 3306。

  • 这是docker ps -a

enter image description here

@Vusal ANSWER 输出:

enter image description here

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

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

最佳答案

试试这个 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"

并更新您的 application.properties 以使用下一个 JDBC 连接 url:

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

当两个容器在同一个 docker-compose 文件中时它应该工作,因为 docker-compose 为容器创建默认网络,因此它们可以通过名称相互解析。

关于mysql - Docker MySQL - 无法从 Spring Boot 应用程序连接到 MySQL 数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56441497/

相关文章:

python - "incorrect string value"但可以用 UTF-8 解码

Mysql 仅使用一张表来统计每个奖杯的条目总数

spring - 一些 Rest API 只能在 https 上访问,而另一些只能在 http 上访问

spring-boot - Thymeleaf 如何查看当前 URL?

mysql - 如何使用hibernate实体管理器在spring boot中调用带有输出参数的MySQL存储过程

多个实例上的 Spring 和计划任务

用于数据管理的MySQL程序编写

PHPUnit DBUnit 用于集成测试查询 MySQL 存储过程的类

java - 如何在Hibernate中运行mysql更新批量查询?

spring - 在 spring mvc 中使用 @component 注解注释的 Spring 类的范围是什么?