Docker Compose在Jenkins Pipeline运行失败,Spring连接MySQL被拒绝
我想通过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完全无关。
连接拒绝的核心问题及修复步骤
修正数据库连接地址
Spring容器内的localhost指向容器自身,而非宿主机或MySQL容器。Docker Compose会为服务创建默认网络,服务之间可通过服务名互相访问。同时注意数据库名要和docker-compose中配置的一致:spring.datasource.url=jdbc:mysql://mysqldb_standalone:3306/achat?useUnicode=true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC匹配数据库密码
docker-compose中设置了MYSQL_ROOT_PASSWORD: root,但application.properties里密码为空,需同步修改:spring.datasource.password=root解决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统一端口配置
Dockerfile暴露8090,但application.properties设置端口为8082,docker-compose映射9050:9050,三者不统一。建议修正为:- application.properties:
server.port=8090 - docker-compose:
ports: - "9050:8090"
- application.properties:
添加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

