Docker springboot连接mysql connect refuse

docker-compose配置文章

项目场景:

docker-compose运行jar、mysql容器。在同一网桥下,配置springboot通过域名访问mysql数据库。


问题描述

日志报错:springboot cannot connect to mysql connection refused

原因分析:

springboot无法正常访问数据库,非同一网络、端口未开放、防火墙、Jar重新连接数据库配置未重构等。


解决方案:

1.是否配置useSSL(高版本的mysql需要指明)

在这里插入图片描述

2.查看是否是同一网络下,并且存在容器(证明是否在同一网络)

#查看网络
[root@localhost docker-compose-demo]# docker network ls
NETWORK ID     NAME                                          DRIVER    SCOPE
5bb70c9c8677   bridge                                        bridge    local
9035eb472472   docker-compose-demo_docker-compose-demo-net   bridge    local
3221931118c7   host                                          host      local
478c3b2b1271   none                                          null      local
[root@localhost docker-compose-demo]# docker network inspect 9035eb472472
[
    {
        "Name": "docker-compose-demo_docker-compose-demo-net",
        "Id": "9035eb47247219c3aa76dd476431e1738cdc4f61397745e2a99e1b9848645012",
        "Created": "2022-12-08T06:27:40.512043218-08:00",
        "Scope": "local",
        "Driver": "bridge",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": null,
            "Config": [
                {
                    "Subnet": "192.168.62.56/24",
                    "Gateway": "192.168.62.1"
                }
            ]
        },
        "Internal": false,
        "Attachable": true,
        "Ingress": false,
        "ConfigFrom": {
            "Network": ""
        },
        "ConfigOnly": false,
        "Containers": {
            "7f20a56083fe518e8e6aafb4d5a8385b699151c381705c8e4811ccf53eea67a1": {
                "Name": "mysql",
                "EndpointID": "055f135452b248ac2eabc955ce407e0ee1b9b8569b09f182a6dcded0298c6f6e",
                "MacAddress": "02:42:c0:a8:3e:03",
                "IPv4Address": "192.168.62.3/24",
                "IPv6Address": ""
            },
            "b34ea8492a6f65798369f8aa2430cf9c350b337147eeed2ad38164c606e2d3c0": {
                "Name": "docker-compose-demo02",
                "EndpointID": "cdafff677802ac63a5d9cc9eadbce844c32d501fc2092ec068977c6059a55d0e",
                "MacAddress": "02:42:c0:a8:3e:02",
                "IPv4Address": "192.168.62.2/24",
                "IPv6Address": ""
            }
        },
        "Options": {},
        "Labels": {
            "com.docker.compose.network": "docker-compose-demo-net",
            "com.docker.compose.project": "docker-compose-demo",
            "com.docker.compose.version": "1.29.2"
        }
    }
]

在这里插入图片描述

3.查看Jar容器是否可以ping通mysql(证明是否可以访问mysql容器)

[root@localhost docker-compose-demo]# docker ps
CONTAINER ID   IMAGE                 COMMAND                  CREATED      STATUS          PORTS                                                  NAMES
b34ea8492a6f   docker-compose-demo   "java -jar docker-co…"   4 days ago   Up 11 minutes   8082/tcp, 0.0.0.0:8082->8080/tcp, :::8082->8080/tcp    docker-compose-demo02
7f20a56083fe   mysql:8.0.30          "docker-entrypoint.s…"   4 days ago   Up 11 minutes   0.0.0.0:3306->3306/tcp, :::3306->3306/tcp, 33060/tcp   mysql
[root@localhost docker-compose-demo]# docker exec -it b34ea8492a6f bash
root@b34ea8492a6f:/# ping mysql
PING mysql (192.168.62.3): 56 data bytes
64 bytes from 192.168.62.3: icmp_seq=0 ttl=64 time=0.110 ms
64 bytes from 192.168.62.3: icmp_seq=1 ttl=64 time=0.120 ms
64 bytes from 192.168.62.3: icmp_seq=2 ttl=64 time=0.091 ms
^C--- mysql ping statistics ---
3 packets transmitted, 3 packets received, 0% packet loss
round-trip min/avg/max/stddev = 0.091/0.107/0.120/0.000 ms
root@b34ea8492a6f:/# ^C
root@b34ea8492a6f:/# 

在这里插入图片描述

4.通过Navicat(证明数据库可以被docker-compose内设置的root用户访问)

在这里插入图片描述

5.DockerFile生成镜像是最新的(证明jar生成的容器是最新的)

本人就是因为这个原因弄了很久。之前的mysql配置不存在useSSL=false,添加后,重新运行docker-compose up。不过DockerFile存在缓存,不会重新构建镜像,导致容器不是最新的。

解决方法:
在这里插入图片描述

### 解决 DockerSpring Boot 应用无法连接到同一 Docker 容器内的 MySQL 在同一 Docker 容器内部署 Spring BootMySQL 并不常见,通常建议将两者分别部署在独立的容器中并让其共享相同的自定义网络。这样做不仅提高了资源利用率还增强了安全性与可维护性。 如果确实需要在同一容器内实现此功能,则需注意: - **环境变量配置**:确保应用程序使用的数据库 URL 设置为 `jdbc:mysql://localhost:3306/dbname` 或者使用相对路径而非绝对 IP 地址[^3]。 - **端口冲突处理**:由于二者共存于单个容器之中,必须确认 MySQL 使用的标准端口号 (如 3306) 没有与其他进程发生冲突。 不过更推荐的做法是利用 Docker 的多容器特性来分离这些服务组件。创建一个名为 `backend-network` 的 Docker 网络以便更好地管理不同微服务之间的通信[^5]: ```bash docker network create backend-network ``` 接着,在启动各个服务时指定该网络名称: 对于 MySQL 容器: ```bash docker run --network=backend-network --name=mysql-container -e MYSQL_ROOT_PASSWORD=rootpassword -d mysql:latest ``` 而对于 Spring Boot 应用则应修改 application.properties 文件中的数据源设置如下所示,并将其加入相同网络: ```properties spring.datasource.url=jdbc:mysql://mysql-container:3306/dbname?useSSL=false&serverTimezone=UTC spring.datasource.username=root spring.datasource.password=rootpassword ``` 最后启动 Spring Boot 应用对应的容器命令示例如下: ```bash docker run --network=backend-network --name=springboot-app -p 8080:8080 my-spring-boot-image ``` 这样做的好处在于每个服务都有自己独立的工作空间,同时也能够方便快捷地相互通讯而无需担心因同处一室所带来的各种潜在风险。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值