为了账号安全,请及时绑定邮箱和手机立即绑定

Spring Boot + docker-compose + MySQL:连接被拒绝

Spring Boot + docker-compose + MySQL:连接被拒绝

GCT1015 2022-04-28 16:17:15
我正在尝试设置一个 Spring Boot 应用程序,该应用程序依赖于 docker-compose 中名为teste的 MySQL 数据库。发出后docker-compose up,我得到:Caused by: java.net.ConnectException: Connection refused (Connection refused)我在 Linux Mint 上运行,我的 docker-compose 版本是 1.23.2,我的 Docker 版本是 18.09.0。应用程序属性# JPA PROPSspring.jpa.show-sql=truespring.jpa.properties.hibernate.format_sql=truespring.jpa.hibernate.ddl-auto=updatespring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL5Dialectspring.jpa.hibernate.naming-strategy=org.hibernate.cfg.ImprovedNamingStrategyspring.datasource.url=jdbc:mysql://db:3306/teste?useSSL=false&serverTimezone=UTCspring.datasource.username=rafaelspring.datasource.password=passwordspring.database.driverClassName =com.mysql.cj.jdbc.Driver码头工人-compose.ymlversion: '3.5'services:  db:    image: mysql:latest    environment:      - MYSQL_ROOT_PASSWORD=rootpass      - MYSQL_DATABASE=teste            - MYSQL_USER=rafael      - MYSQL_PASSWORD=password    ports:      - 3306:3306  web:    image: spring-mysql    depends_on:      - db    links:      - db    ports:      - 8080:8080    environment:      - DATABASE_HOST=db      - DATABASE_USER=rafael      - DATABASE_NAME=teste      - DATABASE_PORT=3306和 DockerfileFROM openjdk:8ADD target/app.jar app.jarEXPOSE 8080ENTRYPOINT ["java", "-jar", "app.jar"]
查看完整描述

3 回答

?
元芳怎么了

TA贡献1798条经验 获得超7个赞

我遇到了同样的问题,如果您不想使用任何自定义脚本,可以使用运行状况检查和依赖项轻松解决。使用这些的示例如下:


services:

  mysql-db:

    image: mysql

    environment:

      - MYSQL_ROOT_PASSWORD=vikas1234

      - MYSQL_USER=vikas

    ports:

      - 3306:3306

    restart: always

    healthcheck:

      test: [ "CMD", "mysqladmin" ,"ping", "-h", "localhost" ]

      timeout: 20s

      retries: 10


  app:

    image: shop-keeper

    container_name: shop-keeper-app

    build:

      context: .

      dockerfile: Dockerfile

    ports:

      - 8080:8080

    depends_on:

      mysql-db:

        condition: service_healthy

    environment:

      SPRING_DATASOURCE_URL: jdbc:mysql://mysql-db:3306/shopkeeper?createDatabaseIfNotExist=true

      SPRING_DATASOURCE_USERNAME: root

      SPRING_DATASOURCE_PASSWORD: vikas1234


查看完整回答
反对 回复 2022-04-28
?
有只小跳蛙

TA贡献1824条经验 获得超8个赞

Docker compose 总是按依赖顺序启动和停止容器,如果没有给出,则在文件中按顺序启动和停止容器。但是 docker-compose 不保证它会等到依赖容器运行。您可以参考此处了解更多详情。所以这里的问题是当你的spring-mysql容器试图访问数据库时你的数据库还没有准备好。因此,推荐的解决方案是您可以使用wait-for-it.sh或类似的脚本来包装您的spring-mysql应用程序开始ENTRYPOINT

例如,如果您在 Dockerfile 中使用wait-for-it.sh您的,则在将上述脚本复制到项目根目录后应更改为以下内容:ENTRYPOINT

ENTRYPOINT ["./wait-for-it.sh", "db:3306", "--", "java", "-jar", "app.jar"]

这里要考虑的另外两个重要的事情是:

  • 不要使用它们已被弃用的链接,您应该使用用户定义的网络。如果您没有明确定义任何网络,则 docker-compose 文件中的所有服务都将位于单个用户定义的网络中。所以你只需要从撰写文件中删除链接。

  • 如果仅在用户定义的网络中使用 docker 容器,则无需发布端口。


查看完整回答
反对 回复 2022-04-28
?
湖上湖

TA贡献2003条经验 获得超2个赞

你的配置看起来不错,我只推荐:

  • 删除links: dbuser-defined bridge它在网络中没有价值

  • 删除为 db 公开的端口,除非您想从外部连接docker-compose- 所有端口都会在user-defined bridge网络内部自动公开。

我认为问题在于数据库容器比 web.xml 需要更多的时间来启动。depends_on只是控制顺序,但不保证您的数据库准备就绪。如果可能,设置几次连接尝试或在您的 Web 容器中放置套接字等待过程。


查看完整回答
反对 回复 2022-04-28
  • 3 回答
  • 0 关注
  • 347 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信