在 Docker 容器内运行 Spring Boot 应用程序,无法连接 MySQL

Posted

技术标签:

【中文标题】在 Docker 容器内运行 Spring Boot 应用程序,无法连接 MySQL【英文标题】:Running Spring Boot app inside Docker container, unable to connect MySQL 【发布时间】:2015-11-19 01:57:45 【问题描述】:

我正在尝试学习 Docker,并创建了一个运行 mysql 服务器的容器。它工作正常,当我在本地运行 Spring Boot 应用程序(没有 Docker)时,我可以从我的 Spring Boot 应用程序中使用 MySQL。但是当我尝试在另一个 Docker 容器中运行 Spring Boot 应用程序时,与 MySQL 的连接失败并出现错误:java.net.ConnectException: Connection refused

在我的 Spring Boot application.properties 我有这个配置:

spring.datasource.url: jdbc:mysql://127.0.0.1/mydb
spring.datasource.username=root
spring.datasource.password=
spring.datasource.driverClassName=com.mysql.jdbc.Driver

有什么想法可能是错的吗?

【问题讨论】:

【参考方案1】:

当您想从 Spring Boot 容器中使用 MySQL 容器时,一个好主意是 link 像这样:

docker run ... --name spring-boot --link mysql ...

假设 mysql 是您的 MySQL 容器的名称,您可以在配置中使用以下 JDBC URL:

spring.datasource.url: jdbc:mysql://mysql/mydb

【讨论】:

如果你没有链接两个容器,我希望数据源 url 是 'jdbc:mysql:///mydb' 假设 Spring boot 容器和MySQL 容器在同一主机上运行。【参考方案2】:

处理这种情况的最佳方法(我使用过的)是在分离模式下运行您的 MySQL 容器。显然,您可以随意命名容器:

docker run --detach --name = my-MySQL --env = "MYSQL_ROOT_PASSWORD=your_password_here" mysql

您的容器将以分离模式运行,现在您可以使用检查命令检查其运行的 IP 和端口:

docker inspect docker_mysql

您可以使用以下命令检查日志:-

docker logs my-MySQL

此外,您还可以使用检查后获得的 IP。我的 MySQL 在 172.17.0.2 和默认端口 3306 上运行:

spring.datasource.url=jdbc:mysql://172.17.0.2:3306/mydb 

您还可以使用任何客户端连接到 MySQL 服务器。我一般使用mysql-client

sudo  mysql -uroot -pyour_password_here -h 172.17.0.2 -P 3306

【讨论】:

以上是关于在 Docker 容器内运行 Spring Boot 应用程序,无法连接 MySQL的主要内容,如果未能解决你的问题,请参考以下文章

使用docker-compose时无法访问docker容器内的spring-boot rest-endpoint

无法从 docker 容器内的 Spring Boot 连接到 Redis

无法从远程 docker 容器监听 docker 容器内运行的服务

[Docker容器内的Spring Boot应用程序的log4j2日志

如何检查一个进程是不是在 docker 容器内运行?

使用 Spring Boot 代码运行 docker 容器