java - Docker Mysql + Spring 连接被拒绝

标签 java mysql spring docker

我通过 Docker 设置了一个 Mysql 服务器,在我的 IDE 中运行我的微服务时一切正常,我能够通过以下方式连接到我的数据库

spring.datasource.url= jdbc:mysql://docker:3079/vetdb?useSSL=false

现在我想通过 Docker 测试部署我的微服务

Docker-Compose

version: '3'

services:
  vetdb:
    container_name: vetdb
    hostname: vetdb
    image: mysql:latest
    command: --default-authentication-plugin=mysql_native_password
    environment:
      - MYSQL_ROOT_PASSWORD=root
      - MYSQL_DATABASE=vetdb
      - MYSQL_PASSWORD=root
    ports:
      - 3079:3306
    volumes:
      - ./mysql-data:/var/lib/mysql

  VET:
    hostname: ${VET_HOSTNAME}
    container_name: ${VET_HOSTNAME}
    image: openjdk:8-jdk-alpine
    ports:
      - "${VET_PORT}:8080"
    volumes:
      - "/dockervolumes/microservices/VET/tmp:/tmp"
      - "./jar:/jar"
    entrypoint:
      - "java"
      - "-Djava.security.egd=file:/dev/./urandom"
      - "-jar"
      - "/jar/${VET_JAR_NAME}.jar"
    depends_on:
      - vetdb
    links:
      - vetdb:vetdb

因此我更改了数据源 url

spring.datasource.url= jdbc:mysql://vetdb:3079/vetdb?useSSL=false

现在,当我运行 docker-compose up --build 时,我得到 Caused by: java.net.ConnectException: Connection refused (Connection refused)

应用程序属性

spring.jpa.hibernate.ddl-auto=update
spring.datasource.url= jdbc:mysql://vetdb:3079/vetdb?useSSL=false
spring.datasource.username=root  
spring.datasource.testWhileIdle = true
spring.datasource.validationQuery = SELECT 1
spring.datasource.password=root
spring.datasource.driverClassName=com.mysql.jdbc.Driver
spring.datasource.platform=mysql

我是 Docker 的新手,我希望有人能帮助我。 对不起我糟糕的英语

提前准备好

编辑 感谢@David Maze 提供的解决方案! spring.datasource.url=jdbc:mysql://vetdb:3306/vetdb?useSSL=false

jetty worker 组成

version: '3'

services:
  vetdb:
    container_name: vetdb
    hostname: vetdb
    image: mysql:latest
    command: --default-authentication-plugin=mysql_native_password
    environment:
      - MYSQL_ROOT_PASSWORD=root
      - MYSQL_DATABASE=vetdb
      - MYSQL_PASSWORD=root
    volumes:
      - ./mysql-data:/var/lib/mysql

  VET:
    hostname: ${VET_HOSTNAME}
    container_name: ${VET_HOSTNAME}
    image: openjdk:8-jdk-alpine
    ports:
      - "${VET_PORT}:8080"
    volumes:
      - "/dockervolumes/microservices/VET/tmp:/tmp"
      - "./jar:/jar"
    entrypoint:
      - "java"
      - "-Djava.security.egd=file:/dev/./urandom"
      - "-jar"
      - "/jar/${VET_JAR_NAME}.jar"
    depends_on:
      - vetdb

最佳答案

当您使用容器名称作为主机名在容器之间进行连接时,您必须直接使用服务器运行的端口号。是否发布了任何端口并不重要(docker run -p,Docker Compose ports: 行);您将使用这些行中的第二个端口号。

在你的情况下,这意味着使用标准的 MySQL 端口 3306(即使你已经发布到主机上的不同端口)

jdbc:mysql://vetdb:3306/vetdb?useSSL=false

关于java - Docker Mysql + Spring 连接被拒绝,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52312297/

相关文章:

spring - 配置文件未从 tomcat 中设置的环境变量中选取,但在 web.xml 中提及时选取

java - Spring Boot 3 未找到 Flyway 迁移

java - 如何检查鼠标是否被压出 JFrame

java - 文件的随机访问

MySQL:只需一个请求即可获取所有项目和相关标签

java - 如何在 JDBC 中检索 MySQL 主键的最大值?

java - Castor:为具有抽象属性的类创建映射文件

java - JSF2.0 @EJB 注入(inject) @ViewScoped 导致 MyFaces 变为 CFNE

java - 如何生成 -1/2 到 1/2 之间的随机值

php - 如何使用 PHP 获取列中的所有值?