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

Docker Compose在Jenkins Pipeline运行失败,Spring连接MySQL被拒绝

问题:Docker Compose中Spring应用连接MySQL失败及XAMPP依赖疑问

我想通过docker-compose.yaml同时运行PhpMyAdmin(基于XAMPP)和Spring应用,但遇到了连接拒绝异常:

Caused by: java.net.ConnectException: Connection refused (Connection refused)
java.net.PlainSocketImpl.socketConnect(Native Method)

我在CentOS虚拟机里用Vagrant部署了Jenkins,Spring Boot项目存在本地机器上。想问下是不是必须开启XAMPP/WAMP才能让服务正常运行?


相关配置信息

Jenkins Pipeline脚本片段

stage('Building our image') {
         //docker build successful
    }
    
stage('Deploy our image') {
         //docker push successful (deployed on dockerhub)
}

stage('Docker compose') {
        steps {
           
        sh 'docker-compose up'
        sh 'docker-compose logs'
           
        }
    }

Dockerfile(应用配置端口为8090)

FROM openjdk:8-jdk-alpine
EXPOSE 8090
ADD target/achat-1.0.jar achat-1.0.jar
ENTRYPOINT ["java","-jar","/achat-1.0.jar"]  

docker-compose.yml

version: "3.3"
services:
  mysqldb_standalone:
  
    container_name: mysqldb
    image: mysql:8
    restart: unless-stopped
    environment:
    
      MYSQL_ROOT_PASSWORD: root
      MYSQL_DATABASE: achat
      
    ports:
      - "3306:3306"

  spring_boot_project:
  
    image: achat

    container_name: achat

    build:
        context: ./
        dockerfile: Dockerfile

    ports:
      - 9050:9050

    depends_on:
      - mysqldb_standalone

application.properties

#Server configuration
server.servlet.context-path=/SpringMVC
server.port=8082

### DATABASE ###
spring.datasource.url=jdbc:mysql://localhost:3306/achatdb?useUnicode=true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC
spring.datasource.username=root
spring.datasource.password=
### JPA / HIBERNATE ###
spring.jpa.show-sql=true
spring.jpa.hibernate.ddl-auto=update
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL5InnoDBDialect

#logging configuration
logging.level.com.zaxxer.hikari=INFO
logging.level.org.springframework=INFO 
logging.level.root=INFO
logging.pattern.console=%d{yyyy-MM-dd HH:mm:ss} - %-5level - %logger{60} - %msg%n

问题分析与解决办法

关于XAMPP/WAMP的疑问

不需要开启本地的XAMPP/WAMP。你已经在docker-compose中定义了mysqldb_standalone服务,这个MySQL容器会独立提供数据库服务,和本地的XAMPP完全无关。

连接拒绝的核心问题及修复步骤

  1. 修正数据库连接地址
    Spring容器内的localhost指向容器自身,而非宿主机或MySQL容器。Docker Compose会为服务创建默认网络,服务之间可通过服务名互相访问。同时注意数据库名要和docker-compose中配置的一致:

    spring.datasource.url=jdbc:mysql://mysqldb_standalone:3306/achat?useUnicode=true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC
    
  2. 匹配数据库密码
    docker-compose中设置了MYSQL_ROOT_PASSWORD: root,但application.properties里密码为空,需同步修改:

    spring.datasource.password=root
    
  3. 解决MySQL初始化延迟问题
    depends_on仅保证容器启动顺序,不保证MySQL服务完全就绪。可添加健康检查确保MySQL就绪后再启动Spring应用:
    在mysqldb_standalone服务中添加:

    healthcheck:
      test: ["CMD", "mysqladmin" ,"ping", "-h", "localhost"]
      timeout: 20s
      retries: 10
    

    在Spring服务的depends_on中修改为:

    depends_on:
      mysqldb_standalone:
        condition: service_healthy
    
  4. 统一端口配置
    Dockerfile暴露8090,但application.properties设置端口为8082,docker-compose映射9050:9050,三者不统一。建议修正为:

    • application.properties:server.port=8090
    • docker-compose:ports: - "9050:8090"
  5. 添加PhpMyAdmin服务
    当前docker-compose未包含PhpMyAdmin,可添加以下服务配置:

    phpmyadmin:
      image: phpmyadmin/phpmyadmin
      container_name: phpmyadmin
      ports:
        - "8080:80"
      environment:
        PMA_HOST: mysqldb_standalone
        MYSQL_ROOT_PASSWORD: root
      depends_on:
        - mysqldb_standalone
    

    配置完成后,访问宿主机的8080端口即可打开PhpMyAdmin,连接MySQL容器。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 19:00:30