使用Docker Compose无法连接MySQL的问题求助
我有一个基于Spring Boot的微服务应用,使用MySQL数据库存储用户凭证及其他数据。启动Docker Compose后所有服务均显示运行,但无法访问数据库,持续收到如下错误:
成功发送到服务器的最后一个数据包是0毫秒前。驱动未收到来自服务器的任何数据包。org.springframework.dao.DataAccessResourceFailureException: Unable to acquire JDBC Connection
我采用YAML配置服务,凭证存储在.env文件中,即使硬编码凭证错误仍存在。不使用Docker Compose,以普通Java程序运行时一切正常。应用运行时,所有服务在Eureka中可见,可访问登录页面但无法登录,调用认证API时,即使提供有效凭证仍返回401 Unauthorized而非200。
Docker Compose配置
services: eureka-server: build: ./naming-server ports: - "8761:8761" db: image: mysql:latest ports: - "3307:3306" environment: MYSQL_ROOT_PASSWORD: ${DB_PASSWORD} MYSQL_DATABASE: i_am_biker_db MYSQL_USER: biker MYSQL_PASSWORD: ${DB_PASSWORD} volumes: - mysql-data:/var/lib/mysql api-gateway: build: ./api-gateway ports: - "8765:8765" depends_on: - eureka-server env_file: - .env environment: EUREKA_CLIENT_SERVICEURL_DEFAULTZONE: "http://eureka-server:8761/eureka/" web-service: build: ./web-service depends_on: - eureka-server env_file: - .env environment: EUREKA_CLIENT_SERVICEURL_DEFAULTZONE: "http://eureka-server:8761/eureka/" maintenance-service: build: ./maintenance-service depends_on: - eureka-server env_file: - .env environment: EUREKA_CLIENT_SERVICEURL_DEFAULTZONE: "http://eureka-server:8761/eureka/" bikes-service: build: ./bikes-service depends_on: - eureka-server - db env_file: - .env environment: EUREKA_CLIENT_SERVICEURL_DEFAULTZONE: "http://eureka-server:8761/eureka/" DATASOURCE_URL: jdbc:mysql://db:3306/i_am_biker_db?useSSL=false&serverTimezone=UTC&allowPublicKeyRetrieval=true DATASOURCE_USERNAME: biker authentication-service: build: ./authentication-service ports: - "8900:8900" depends_on: - eureka-server - db env_file: - .env environment: EUREKA_CLIENT_SERVICEURL_DEFAULTZONE: "http://eureka-server:8761/eureka/" DATASOURCE_URL: jdbc:mysql://db:3306/i_am_biker_db?useSSL=false&serverTimezone=UTC&allowPublicKeyRetrieval=true DATASOURCE_USERNAME: biker volumes: mysql-data:
排查与解决建议
解决数据库启动就绪问题:
depends_on仅保证服务启动顺序,不确保MySQL完全初始化完成。给db服务添加健康检查,让依赖服务等待数据库就绪:db: # 原有配置不变 healthcheck: test: ["CMD", "mysqladmin", "ping", "-h", "localhost", "-u", "biker", "-p${DB_PASSWORD}"] interval: 10s timeout: 5s retries: 5同时修改依赖db的服务配置:
bikes-service: depends_on: db: condition: service_healthy authentication-service: depends_on: db: condition: service_healthy验证连接参数与驱动兼容性:
- 进入服务容器执行
echo $DATASOURCE_PASSWORD,确认密码参数是否正确传递 - 检查MySQL驱动版本:mysql:latest为8.x版本,需使用
mysql-connector-java:8.0+或mysql-connector-j:8.0+驱动
- 进入服务容器执行
测试容器间网络连通性:进入authentication-service容器,执行
ping db或telnet db 3306,确认能连通数据库服务。若不通,检查Docker Compose默认网络是否正常,避免自定义网络导致隔离。检查数据库初始化状态:进入db容器,执行
mysql -u biker -p${DB_PASSWORD} i_am_biker_db,确认数据库、表结构是否存在。若数据卷异常,可执行docker-compose down -v删除卷后重新启动初始化。
内容的提问来源于stack exchange,提问作者bkrawczynski

