You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Docker环境下Java 11应用无法连接MySQL 8数据库求助

问题原因分析

你的连接错误主要由以下几个配置问题导致,和Java版本无关(错误日志里的java.base是Java 9+的模块标识,说明实际运行的是Java 11,和你Dockerfile里的配置一致):

1. 数据库连接端口错误

容器之间通过Docker网络通信时,需要使用容器内部的端口,而非宿主机映射的端口。

  • 在docker-compose.yml中,mysqldb容器内部的MySQL端口是3306,宿主机的3307只是对外映射的端口。
  • 你的application.yml里却用了3307作为连接端口,导致无法访问数据库容器。

修正后的application.yml数据库配置:

datasource:
  password: pass
  driver-class-name: com.mysql.cj.jdbc.Driver
  username: root
  url: jdbc:mysql://mysqldb:3306/moviesdb?createDatabaseIfNotExist=true&allowPublicKeyRetrieval=true&useSSL=false

2. Dockerfile配置无效且存在错误

你的Dockerfile存在多FROM指令误用和无效命令的问题:

  • 多FROM指令如果不配合COPY --from,只会保留最后一个镜像的内容,前面的maven:3.8.1-openjdk-11镜像完全没用。
  • CMD mvn clean install -DskipTests会被ENTRYPOINT覆盖,根本不会执行;如果本地没有提前构建target/*.jar,镜像里会缺少app.jar。

修正后的Dockerfile(镜像内构建项目版本):

# 使用maven镜像构建项目
FROM maven:3.8.1-openjdk-11 AS builder
WORKDIR /app
COPY pom.xml .
COPY src ./src
RUN mvn clean package -DskipTests

# 使用openjdk镜像运行项目
FROM openjdk:11
WORKDIR /app
COPY --from=builder /app/target/*.jar app.jar
EXPOSE 8080
ENTRYPOINT ["java", "-jar", "-Dspring.profiles.active=docker", "app.jar"]

如果已在本地构建好target/*.jar,可简化为:

FROM openjdk:11
COPY target/*.jar app.jar
EXPOSE 8080
ENTRYPOINT ["java", "-jar", "-Dspring.profiles.active=docker", "app.jar"]

3. 服务启动顺序未控制

movies-app会在mysqldb完全启动就绪前就尝试连接数据库,导致连接拒绝。需要配置服务依赖并等待数据库就绪:

修正后的docker-compose.yml(添加依赖和健康检查):

version: '3.8'

services:
  server:
    container_name: movies-app
    build: .
    restart: always
    ports:
      - "8088:8080"
    networks:
      - app-network
    depends_on:
      mysqldb:
        condition: service_healthy  # 等待数据库健康检查通过后再启动

  mysqldb:
    container_name: mysqldb
    image: mysql:8.0.28
    restart: always
    ports:
      - "3307:3306"
    environment:
      MYSQL_DATABASE: moviesdb
      MYSQL_USER: user
      MYSQL_PASSWORD: pass
      MYSQL_ROOT_PASSWORD: pass  # 注意:MYSQL_ROOT_USER不是官方有效变量,默认root用户已存在,只需设置密码
    volumes:
      - dbdata:/var/lib/mysql
    networks:
      - app-network
    healthcheck:
      test: ["CMD", "mysqladmin", "ping", "-h", "localhost", "-u", "root", "-ppass"]
      interval: 5s
      timeout: 5s
      retries: 5
      
networks:
  app-network:
    driver: bridge

volumes:
  dbdata:
    driver: local

4. 额外配置问题

  • docker-compose.yml中server服务的端口映射是8088:8080,但Dockerfile里EXPOSE 8088,这只是端口声明不影响运行,但建议保持一致(比如统一为8080或8088)。

内容的提问来源于stack exchange,提问作者Jack

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 01:30:52