spring-boot - 连接被拒绝:运行 Docker Compose 时
问题描述
我是 Docker 的新手。我在 Spring Boot 应用程序中使用 docker。下面是我的文件。
Application.properties 文件:
spring.datasource.url=jdbc:mysql://${DATABASE_HOST}:3306/${DATABASE_NAME}?allowPublicKeyRetrieval=true&useSSL=true
spring.datasource.username = root
spring.datasource.password = root
server.port=8443
Docker文件:
FROM openjdk:latest
ADD target/app.jar app.jar
EXPOSE 8443
ENTRYPOINT ["java","-jar","app.jar", "--spring.profiles.active=docker"]
码头工人撰写:
version: '3.1'
services:
mysqlDb:
image: mysql:latest
environment:
- MYSQL_ROOT_PASSWORD=root
- MYSQL_DATABASE=springdemo
- MYSQL_USER=root
- MYSQL_PASSWORD=root
- DATABASE_HOST= 192.168.0.1
volumes:
- /data/mysql
ports:
- "3306:3306"
container_name: mysql-db
springbootdocker:
image: xyz/signup
restart: always
ports:
- "8080:8080"
depends_on:
- mysqlDb
links:
- mysqlDb
environment:
- DATABASE_HOST= mysqlDb
- DATABASE_USER=root
- DATABASE_PASSWORD=root
- DATABASE_NAME=springdemo
- DATABASE_PORT=3306
healthcheck:
test: ["CMD","curl","-f","http://localhost:8080/health"]
interval: 1m30s
timeout: 10s
retries: 3
问题的第一部分已解决: 当我运行应用程序时,我收到以下错误:
Caused by: com.mysql.cj.exceptions.CJCommunicationsException: Communications link failure
The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server.
Caused by: java.net.UnknownHostException: ${DATABASE_HOST}
1)我想要实现的目标 -
- 想为我的应用程序创建一个 jar。
- 创建罐子后,我想从罐子创建图像
- 创建应用程序的映像后,我想推入 docker hub。
- 从其他服务器,我将运行 docker-compose.yml 文件。它将从 docker hub 获取 mysql 和图像,并在 docker-compose 中提到的另一个端口中运行应用程序。
希望我很清楚,我想要实现什么。
问题来了:
当我尝试在本地运行应用程序时,我只能在 application.properties 类中编写这一行时才能创建 jar。
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/springdemo?allowPublicKeyRetrieval=true&useSSL=true
我能够创建 jar 并在该图像之后 -> 将该图像上传到 docker hub ,当我运行 docker-compose 时能够提取该图像但无法连接到 mysql 工作台。
所以,我想,我在不同的系统/服务器中运行 docker-compose。ip地址不一样。
因此,我将网址更改为:
spring.datasource.url=jdbc:mysql://192.168.0.1:3306/springdemo?allowPublicKeyRetrieval=true&useSSL=true
在哪里
192.168.0.1 - this ip is for the diffrent server, where i want to run the docker-compose file
但是当我运行 spring boot 应用程序时,我无法运行该应用程序,因为它说的是与上面提到的几乎相同的错误,即连接拒绝。所以我无法创建罐子,所以无法创建图像。所以我的想法在这里也失败了。
- 然后又一次,一个想法再次出现在我的脑海中,我们不能将动态IP地址放在application.properties文件中,所以我尝试了这一行:
spring.datasource.url=jdbc:mysql://${DATABASE_HOST}:3306/${DATABASE_NAME}?allowPublicKeyRetrieval=true&useSSL=true
DATABASE_HOST - 你可以在 docker-compose 文件中找到它
我想可能是这个: ${DATABASE_HOST} ,将从 docker-compose 中选择 DATABASE_HOST 的值。
但是我的想法失败了,我在运行应用程序时遇到了上面提到的错误。无法创建jar,所以无法创建图像。
第二部分 - 问题仍未解决
当我能够在我的本地终端中运行 docker-compose 并能够创建容器时。我还可以看到 mysql 以及我的架构已连接。但是当我尝试使用邮递员或网络浏览器访问我的 API 时,它说没有连接
http://localhost:8080/dockerex
在我的控制器类中:
@RestController
@RequestMapping(value = "/dockerex")
public class SpringBootDockerController {
@GetMapping
public String check() {
return "checking";
}
}
当我检查我的容器时,IP 地址变为空白:容器快照:
[
{
"Id": "7664bab5ed452e3e2243e1802010240ab5a3eb817af6164e985b10e729ff4c8f",
"Created": "2020-02-04T17:30:08.5351511Z",
"Path": "java",
"Args": [
"-jar",
"app.jar",
"--spring.profiles.active=docker"
],
"State": {
"Status": "running"
.......................
"PortBindings": {
"8080/tcp": [
{
"HostIp": "",
"HostPort": "8080"
}
]
},
解决方案
很好,但是在这里您看到您之前使用的是 DB_HOST,现在您使用的是 DATABASE_HOST= mysqlDb ,它当前指向您的 mysql 服务名称。可以在 docker compose 创建的单个网络中发现此服务名称。您正在硬编码 DB_HOST=192.168.0.1 并尝试使用此 IP 进行连接,这在 docker compose 创建其网络时是无效的。
推荐阅读
- python - 如何使用 webrtc 发送视频流
- msbuild - MSBuild skips some tasks when DeployOnBuild and PublishProfile parameters are present
- wordpress - Wordpress Divi 博客模块 - 没有控制帖子数量的选项
- java - org.springframework.dao.InvalidDataAccessApiUsageException:HIbernate 中枚举类的未知名称值 [-1]
- javascript - 如何用 echarts 渲染自定义线?
- java - 空堆栈是否自动具有空值?
- excel - 如果在工作表 1 A 列中找到值,则需要将工作表 2 的整行粘贴到工作表 3
- java - 为什么我的 CompletableFuture 永远不会返回我需要的响应并且 api 调用处于挂起状态?
- python - 如何求这个函数的时间复杂度?
- mongodb - MongoDb对多个否定条件的查询和操作