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
相关产品推荐
相关产品推荐

