Docker、Spring、Mysql java.net.ConnectException:尝试运行 docker 应用程序时连接被拒绝(连接被拒绝)

时间:2021-03-27 14:54:47

标签: mysql spring-boot docker

我有一个连接到 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:

1 个答案:

答案 0 :(得分:0)

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