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

时间:2019-01-11 11:02:09

标签: java mysql spring-boot docker docker-compose

我正在尝试建立一个依赖于docker-compose中名为 teste 的MySQL数据库的Spring Boot应用程序。发出 docker-compose up 之后,我得到:

Caused by: java.net.ConnectException: Connection refused (Connection refused)

我正在Linux Mint上运行,我的 docker-compose版本是1.23.2 ,我的 docker版本是18.09.0

application.properties

# JPA PROPS
spring.jpa.show-sql=true
spring.jpa.properties.hibernate.format_sql=true
spring.jpa.hibernate.ddl-auto=update
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL5Dialect
spring.jpa.hibernate.naming-strategy=org.hibernate.cfg.ImprovedNamingStrategy

spring.datasource.url=jdbc:mysql://db:3306/teste?useSSL=false&serverTimezone=UTC
spring.datasource.username=rafael
spring.datasource.password=password

spring.database.driverClassName =com.mysql.cj.jdbc.Driver

docker-compose.yml

version: '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

和Dockerfile

FROM openjdk:8
ADD target/app.jar app.jar
EXPOSE 8080
ENTRYPOINT ["java", "-jar", "app.jar"]

先谢谢!

2 个答案:

答案 0 :(得分:1)

您的配置看起来不错,我只建议您:

  • 删除UILongPressGestureRecognizer。在links: db网络中没有价值
  • 除非您想从外部user-defined bridge连接,否则请删除数据库的端口公开端口-所有端口都自动在docker-compose网络内部公开。

我认为问题在于数据库容器比网络启动需要更多的时间。 user-defined bridge仅控制顺序,但不能保证您已准备好数据库。如果可能,请设置几次连接尝试或在Web容器中放入套接字等待过程。

答案 1 :(得分:1)

Docker compose始终以依赖关系顺序或文件中的顺序顺序(如果未给出)启动和停止容器。但是docker-compose不能保证它会一直等到依赖容器运行之后。您可以在refer处获取更多详细信息。因此,这里的问题是,当spring-mysql容器尝试访问数据库时,数据库尚未准备就绪。因此,推荐的解决方案是您可以使用wait-for-it.sh或类似的脚本来以spring-mysql来包装ENTRYPOINT应用。

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

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

还有两个要考虑的重要事项是:

  • 请勿使用deprecated的链接,而应使用用户定义的网络。如果您未明确定义任何网络,则docker-compose文件中的所有服务都将位于单个用户定义的网络中。因此,您只需要从撰写文件中删除链接即可。
  • 如果仅在用户定义的网络内使用docker容器,则无需发布该端口。
相关问题