【问题标题】:Can't connect to MySQL from Spring-Boot container无法从 Spring-Boot 容器连接到 MySQL
【发布时间】:2018-08-16 22:22:22
【问题描述】:

我正在尝试将我的 Spring-Boot 应用程序(一个容器)连接到 MySQL 数据库(另一个容器)。启动 Java 应用程序时出现以下错误:

com.mysql.jdbc.exceptions.jdbc4.CommunicationsException:通信链路故障

这是我的docker-compose.yml

version: "3"
services:
  db:
    image: mysql:8
    environment:
      - MYSQL_ROOT_PASSWORD=family
      - MYSQL_DATABASE=family_db
      - MYSQL_USER=family_user
      - MYSQL_PASSWORD=family
    ports:
      - 9999:3306
  web:
      build:
        context: .
        dockerfile: Dockerfile-spring
      image: family:latest
      depends_on:
        - db
      ports:
        - 0:8080
      environment:
#        - DATABASE_HOST=db
        - DATABASE_USER=family_user
        - DATABASE_PASSWORD=family
        - DATABASE_NAME=family_db
        - DATABASE_PORT=3306
#        - SPRING_DATASOURCE_URL=jdbc:mysql://mysql:3306/family_db?useUnicode=true&characterEncoding=utf8&useSSL=false
#        - spring.datasource.url=jdbc:mysql://mysql:3306/test?useSSL=false
#        - spring.datasource.username=family_user
#        - spring.datasource.password=family
#        - spring.datasource.driver-class-name=com.mysql.jdbc.Driver

  angular:
    container_name: angular-container
    build: 
      context: angular-app
      dockerfile: Dockerfile-angular
    ports:
      - 0:80

这是我的 Dockerfile-spring:

FROM openjdk:8
VOLUME /tmp<br> COPY target/family.jar app.jar
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","app.jar"]

我应该怎么做才能为我的 Spring-Boot 应用程序打开 MySQL 端口?

【问题讨论】:

  • 尝试将DATABASE_PORT=3306 更改为DATABASE_PORT=9999,因为这是您在其他容器上公开的端口
  • 当我将端口更改为 9999 时,spring boot 会抛出有关未知驱动程序类的异常。我在我的 pom.xml 中添加了 mysql 驱动程序。我虽然我必须连接在 Docker 内部的端口 3306。
  • 如果您通过环境变量设置驱动程序类(看起来是这样),然后尝试使用 SPRING_DATASOURCE_DRIVER_CLASS_NAME
  • 我在 Spring Boot 中为配置文件添加了不同的应用程序属性。当我在生产应用程序属性中将用户名的名称更改为“root”时,它有时有效,有时无效。我不知道该怎么办。驱动程序的异常消失了,因为它是在属性文件中指定的。
  • 我刚刚将 docker-compose.yml 更新为

标签: java spring-boot docker-compose


【解决方案1】:

解决方案是使用桥接驱动为 docker 创建自己的网络。

【讨论】:

  • 能否请您更具体地解释一下原因?
  • Docker compose 默认情况下应该使所有容器都可以被其他容器访问,但在我的情况下它不起作用。一种解决方案应该是将容器相互链接,但此解决方案已被弃用。正确的解决方案是定义自己的网络。这是示例并解释了所有内容:docs.docker.com/compose/networking/…> 我的代码的另一个问题是 spring boot 中的错误 ip,因为它应该看起来像这样:jdbc:mysql://db:3306/family_db?autoReconnect=true&useSSL=false,其中 db 是 docker-compose.yml 中定义的 docker 服务的名称
猜你喜欢
  • 2019-11-25
  • 2021-04-04
  • 2018-06-23
  • 2020-01-29
  • 2022-11-06
  • 2021-04-22
  • 2020-07-12
  • 2021-12-23
  • 2018-09-26
相关资源
最近更新 更多