我是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
DockerFile:
FROM openjdk:latest
ADD target/app.jar app.jar
EXPOSE 8443
ENTRYPOINT ["java","-jar","app.jar", "--spring.profiles.active=docker"]
Docker Compose:
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)我要实现的目标-
希望我很清楚,我想要实现什么。
这是问题所在:
当我尝试在本地运行应用程序时,仅在将行写到application.properties类中时,我才能创建jar。
spring.datasource.url = jdbc:mysql://127.0.0.1:3306 / springdemo?allowPublicKeyRetrieval = true&useSSL = true
我能够创建jar并在该映像之后->将映像上传到docker hub,当我运行docker-compose时能够提取该映像,但无法连接到mysql工作台。 / p>
所以,我想,我正在不同的系统/服务器中运行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应用程序时,我无法运行该应用程序,因为它说的是与上述几乎相同的错误,即Connection reject。所以我无法创建jar,因此无法创建图像。所以我的想法在这里也失败了。
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地址变为空白:conatiner的快照:
[
{
"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"
}
]
},
答案 0 :(得分:1)
很好,但是在这里您看到您之前使用DB_HOST,现在使用的是DATABASE_HOST = mysqlDb,它当前指向您的mysql服务名称。 可以在docker compose创建的单个网络中发现此服务名称。 您正在硬编码DB_HOST = 192.168.0.1并尝试使用此IP进行连接,因为docker compose创建了它的网络,该IP是无效的。
答案 1 :(得分:0)
您必须在这里提及服务名称,因为您的数据库服务名称是 mysqlDb 。下面是更新的application.properties
spring.datasource.url=jdbc:mysql://$(DB_HOST:mysqlDb):3306/springdemo?allowPublicKeyRetrieval=true&useSSL=true
spring.datasource.username = root
spring.datasource.password = root
server.port=8443
答案 2 :(得分:0)
尝试一下:
将docker-compose文件中的DB_HOST= 192.168.0.7
替换为DB_HOST= mysqldb
。
并更新您的application.properties文件:
spring.datasource.url=jdbc:mysql://$(DB_HOST:mysqlDb):3306/springdemo?allowPublicKeyRetrieval=true&useSSL=true
对此:
spring.datasource.url=jdbc:mysql://$(mysqlDb):3306/springdemo?allowPublicKeyRetrieval=true&useSSL=true
答案 3 :(得分:0)
谢谢大家:我的命中方法是:P
spring.datasource.url=jdbc:mysql://${DATABASE_HOST:localhost}:${DATABASE_PORT:3306}/springdemo?allowPublicKeyRetrieval=true&useSSL=true