使用Docker Compose来部署Spring Boot应用程序和MySQL数据库,但Spring Boot无法访问MySQL,大家帮忙看看怎么解决?

问题描述

1、本地启动spring 应用程序 可成功连接容器中的 mysql 数据库
2、Docker Compose部署的容器内Spring Boot应用程序无法访问 另一个容器的 MySQL


说明:两个容器在同一个docker内

docker-compose.yml 配置文件如下:

图片.png

version: "3.9"
services:
  app:
    build:
      context: .
      dockerfile: Dockerfile
    ports:
      - 8989:8989
    environment:
      - TZ=Asia/Shanghai
    depends_on:
      - db
    networks:
      - mynetwork
  db:
    image: mysql:5.7
    container_name: mysql-test
    environment:
       # 数据库
        MYSQL_DATABASE: test
        # 设置root用户密码
        MYSQL_ROOT_PASSWORD: admin
        TZ: Asia/Shanghai
    ports:
      - 3309:3306
    expose:
      - 3306
    networks:
      - mynetwork
    volumes:
      - ./mysql:/var/lib/mysql
networks:
  mynetwork:



application.yml 内容 :

图片.png

# 数据库配置
server:
  port: 8989
spring:
  datasource:
    url: jdbc:mysql://db:3309/test?useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=Asia/Shanghai
    username: root
    password: admin
    driverClassName: com.mysql.cj.jdbc.Driver
    connection-timeout: 3600

请问哪里的配置有问题 ?

补充:

    url: jdbc:mysql://db:3306/test?useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=Asia/Shanghai

用 服务 和 3306 连接也没能成功

阅读 3k
3 个回答

端口应该使用 3306

3309 是暴露在外面的端口,而同一个 network 下面可以直连。

如果不行,要确认如下几点:

  1. 从app容器中,尝试能不能连接到 db:3306 端口,可以利用 telnet 或者 wget 命令尝试,如果都没有,再启动一个 centos 容器,加入到网络组中,安装这两个命令尝试
  2. 确认在 app 启动前 db 是否启动了,depends_on其实并没有用,它指的是依赖容器启动,并不会确认里面的服务是否启动成功了

容器组内相互访问,通信地址为服务名:容器自身端口,也就是db:3306

你这里是端口写错了。应该是db:3306。

yml里面的 ports: - 3309:3306,前一个是host的端口,后一个是容器内的端口。
ports : -[HOST:CONTAINER]

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题