【问题标题】:Docker, Spring, Mysql java.net.ConnectException: Connection refused (Connection refused) while trying to run docker appDocker,Spring,Mysql java.net.ConnectException:尝试运行 docker app 时连接被拒绝(连接被拒绝)
【发布时间】:2021-06-24 05:04:41
【问题描述】:

我有一个连接到 MySQL 数据库的 Springboot 应用程序。当我尝试运行应用程序时,它会出现以下异常:

- com.mysql.cj.jdbc.exceptions.CommunicationsException: Communications link failure
- The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server.
- org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactory' defined in class path resource [org/springframework/boot/autoconfigure/orm/jpa/HibernateJpaConfiguration.class]: Invocation of init method failed; nested exception is javax.persistence.PersistenceException: [PersistenceUnit: default] Unable to build Hibernate SessionFactory; nested exception is org.hibernate.exception.JDBCConnectionException: Unable to open JDBC Connection for DDL execution
- java.net.ConnectException: Connection refused (Connection refused)

我的 Dockerfile 是这样的:

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

我的 application.properties :

spring.datasource.url=jdbc:mysql://localhost:3306/study # ${MYSQL_HOST:localhost}
spring.datasource.username=root
spring.datasource.password=root
spring.jpa.hibernate.ddl-auto=update
spring.jpa.database-platform=org.hibernate.dialect.MySQLDialect
spring.jpa.show-sql=false
spring.jpa.database=mysql
spring.hibernate.dialect=org.hibernate.dialect.MySQLDialect
security.basic.enable: false
security.ignored=/**

这是我用来运行 mysql 容器的命令:

sudo docker run --net studyapp-network --name localhost -e MYSQL_ROOT_PASSWORD=root -e MYSQL_DATABASE=study -e MYSQL_USER=cnyt -e MYSQL_PASSWORD=root -d mysql:5.7.32

这是用于运行应用程序容器:

sudo docker run --net studyapp-network -p 8080:8080 cuneytyvz/studyapp

我使用 'localhost' 作为我的 mysql 容器的名称。我试图改变这一点,发生同样的错误。

我也可以使用 docker-compose 毫无问题地运行这个应用程序。但我也希望看到它在没有 docker-compose 的情况下也能正常工作。可能是什么问题?

这是工作的 docker-compose 文件:

version: '3.3'

services:
  #service 1: definition of mysql database
  mysql-db:
    image: mysql:latest
    container_name: mysql-db
    environment:
      - MYSQL_ROOT_PASSWORD=root
      - MYSQL_USER=cnyt
    ports:
      - "3306:3306"
    restart: always
    volumes:
      - my-datavolume:/var/lib/mysql


  #service 2: definition of phpMyAdmin
  phpmyadmin:
    image: phpmyadmin/phpmyadmin:latest
    container_name: my-php-myadmin
    ports:
      - "8082:80"
    restart: always

    depends_on:
      - mysql-db
    environment:
      SPRING_DATASOURCE_USERNAME: root
      SPRING_DATASOURCE_PASSWORD: root



  #service 3: definition of your spring-boot app
  studyapp:                        #it is just a name, which will be used only in this file.
    image: studyapp               #name of the image after dockerfile executes
    container_name: studyapp  #name of the container created from docker image
    build:
      context: .                          #docker file path (. means root directory)
      dockerfile: Dockerfile              #docker file name
    ports:
      - "8080:8080"                       #docker containter port with your os port
    restart: always

    depends_on:                           #define dependencies of this app
      - mysql-db                                #dependency name (which is defined with this name 'db' in this file earlier)
    environment:
      SPRING_DATASOURCE_URL: jdbc:mysql://mysql-db:3306/study?createDatabaseIfNotExist=true
      SPRING_DATASOURCE_USERNAME: root
      SPRING_DATASOURCE_PASSWORD: root

volumes:
  my-datavolume:

【问题讨论】:

  • 在最后的docker run 命令中,--net 选项位于图像名称之后,因此它成为要运行的命令。如果要将其解释为 docker 选项,则需要将其移到图像名称之前。
  • @DavidMaze 给了你一个点,并检查这些stackoverflow.com/questions/2983248/…
  • @DavidMaze 我尝试在 --name 之前移动 --net 并且没有任何改变。
  • @SachithMuhandiram 我检查了链接,但是当我尝试通过 Docker 运行应用程序时才遇到这个问题。如果我通过 IDE 或 docker-compose 运行我的应用程序,它会连接到 db 并运行没有任何问题。
  • @cuneytyvz 你能发布工作中的docker-compose 文件吗?

标签: mysql spring-boot docker


【解决方案1】:

这是因为我使用 'localhost' 作为 mysql 容器的名称。它可能会混淆我的应用程序 docker 容器。我更改了它,它可以正常工作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-01-19
    • 2021-06-27
    • 2021-11-16
    • 2019-10-20
    • 1970-01-01
    • 2022-01-22
    • 2023-03-21
    • 2019-06-06
    相关资源
    最近更新 更多