Spring boot Spring boot microservices和Docker,无法连接到数据库
我正在微服务中编写一个测试应用程序来学习SpringBoot。我已经完成了这个应用程序,并希望使用docker/docker compose在AWS上部署它来托管每个微服务 我无法将任何Spring启动实例连接到它们的Mysql数据库。我已经坚持了几天了,我看不出有什么不对劲 这是我的docker-compose.ymlSpring boot Spring boot microservices和Docker,无法连接到数据库,spring-boot,docker,docker-compose,Spring Boot,Docker,Docker Compose,我正在微服务中编写一个测试应用程序来学习SpringBoot。我已经完成了这个应用程序,并希望使用docker/docker compose在AWS上部署它来托管每个微服务 我无法将任何Spring启动实例连接到它们的Mysql数据库。我已经坚持了几天了,我看不出有什么不对劲 这是我的docker-compose.yml 版本:“3.3” 服务: 卡片(mysql): 图片:“mysql” 重新启动:始终 环境: MYSQL\u ROOT\u密码:“ROOT” MYSQL_数据库:“卡片” 端口
版本:“3.3”
服务:
卡片(mysql):
图片:“mysql”
重新启动:始终
环境:
MYSQL\u ROOT\u密码:“ROOT”
MYSQL_数据库:“卡片”
端口:
- "33061:3306"
auth_mysql:
图片:“mysql”
重新启动:始终
环境:
MYSQL\u ROOT\u密码:“ROOT”
MYSQL_数据库:“auth”
端口:
- "33062:3306"
市场调查:
图片:“mysql”
重新启动:始终
环境:
MYSQL\u ROOT\u密码:“ROOT”
MYSQL_数据库:“市场”
端口:
- "33063:3306"
用户(u mysql):
图片:“mysql”
重新启动:始终
环境:
MYSQL\u ROOT\u密码:“ROOT”
MYSQL_数据库:“用户”
端口:
- "33064:3306"
管理员:
图片:管理员
重新启动:始终
端口:
- 8000:8080
用户:
图片:“openjdk:11”
重新启动:始终
入口点:java-jar/app/services/user/target/cardmarket-user-0.0.1-SNAPSHOT.jar
卷数:
-./:/app
取决于:
-“用户\u mysql”
卡片:
图片:“openjdk:11”
重新启动:始终
入口点:java-jar/app/services/card/target/cardmarket-card-0.0.1-SNAPSHOT.jar
卷数:
-./:/app
取决于:
-“卡片”
市场:
图片:“openjdk:11”
重新启动:始终
入口点:java-jar/app/services/market/target/cardmarket-market-0.0.1-SNAPSHOT.jar
卷数:
-./:/app
取决于:
-“市场调查”
代理:
图片:“openjdk:11”
重新启动:始终
入口点:java-jar/app/zuul-proxy/target/zuul-proxy-0.0.1-SNAPSHOT.jar
卷数:
-./:/app
认证:
图片:“openjdk:11”
重新启动:始终
入口点:java-jar/app/zuul-proxy/zuul-proxy-0.0.1-SNAPSHOT.jar
卷数:
-./:/app
取决于:
-“auth_mysql”
以下是我的每个spring数据源设置:
用户应用程序.properties
spring.jpa.hibernate.ddl-auto=create
spring.datasource.url=jdbc:mysql://user_mysql:3306/user
spring.datasource.initialization-mode=always
spring.datasource.username=root
spring.datasource.password=root
spring.jpa.hibernate.ddl-auto=create-drop
spring.datasource.url=jdbc:mysql://market_mysql:3306/market
spring.datasource.initialization-mode=always
spring.datasource.username=root
spring.datasource.password=root
spring.jpa.hibernate.ddl-auto=create-drop
spring.datasource.url=jdbc:mysql://auth_mysql:3306/auth
spring.datasource.initialization-mode=always
spring.datasource.username=root
spring.datasource.password=root
spring.jpa.hibernate.ddl-auto=create-drop
spring.datasource.url=jdbc:mysql://card_mysql:3306/cards
spring.datasource.initialization-mode=always
spring.datasource.username=root
spring.datasource.password=root
市场应用与房地产
spring.jpa.hibernate.ddl-auto=create
spring.datasource.url=jdbc:mysql://user_mysql:3306/user
spring.datasource.initialization-mode=always
spring.datasource.username=root
spring.datasource.password=root
spring.jpa.hibernate.ddl-auto=create-drop
spring.datasource.url=jdbc:mysql://market_mysql:3306/market
spring.datasource.initialization-mode=always
spring.datasource.username=root
spring.datasource.password=root
spring.jpa.hibernate.ddl-auto=create-drop
spring.datasource.url=jdbc:mysql://auth_mysql:3306/auth
spring.datasource.initialization-mode=always
spring.datasource.username=root
spring.datasource.password=root
spring.jpa.hibernate.ddl-auto=create-drop
spring.datasource.url=jdbc:mysql://card_mysql:3306/cards
spring.datasource.initialization-mode=always
spring.datasource.username=root
spring.datasource.password=root
Auth application.properties
spring.jpa.hibernate.ddl-auto=create
spring.datasource.url=jdbc:mysql://user_mysql:3306/user
spring.datasource.initialization-mode=always
spring.datasource.username=root
spring.datasource.password=root
spring.jpa.hibernate.ddl-auto=create-drop
spring.datasource.url=jdbc:mysql://market_mysql:3306/market
spring.datasource.initialization-mode=always
spring.datasource.username=root
spring.datasource.password=root
spring.jpa.hibernate.ddl-auto=create-drop
spring.datasource.url=jdbc:mysql://auth_mysql:3306/auth
spring.datasource.initialization-mode=always
spring.datasource.username=root
spring.datasource.password=root
spring.jpa.hibernate.ddl-auto=create-drop
spring.datasource.url=jdbc:mysql://card_mysql:3306/cards
spring.datasource.initialization-mode=always
spring.datasource.username=root
spring.datasource.password=root
卡片应用程序.properties
spring.jpa.hibernate.ddl-auto=create
spring.datasource.url=jdbc:mysql://user_mysql:3306/user
spring.datasource.initialization-mode=always
spring.datasource.username=root
spring.datasource.password=root
spring.jpa.hibernate.ddl-auto=create-drop
spring.datasource.url=jdbc:mysql://market_mysql:3306/market
spring.datasource.initialization-mode=always
spring.datasource.username=root
spring.datasource.password=root
spring.jpa.hibernate.ddl-auto=create-drop
spring.datasource.url=jdbc:mysql://auth_mysql:3306/auth
spring.datasource.initialization-mode=always
spring.datasource.username=root
spring.datasource.password=root
spring.jpa.hibernate.ddl-auto=create-drop
spring.datasource.url=jdbc:mysql://card_mysql:3306/cards
spring.datasource.initialization-mode=always
spring.datasource.username=root
spring.datasource.password=root
我肯定这是我遗漏或误解的小东西,但我不知道是什么
编辑1
我又做了几次测试,但还是没能找出问题所在。
除了card和card_mysql容器之外,我注释掉了所有内容。spring启动实例对每一种可能的配置(使用docker dns名称、localhost、shared和network ip)都抛出一个异常,它们似乎都不起作用。
这两个容器进行通信,我可以使用dns名称在它们之间ping
我将docker desktop与wsl一起使用,并在wsl Ubuntu 20.04上部署我的容器。我还没有在真正的Linux机器上尝试过
我还尝试让spring引导实例等待mysql实例,它确实正确地等待了,但异常仍然发生
以下是部分异常spring引导触发器:
2021-05-16 12:23:48.948 INFO 1 --- [ main] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Starting...
2021-05-16 12:23:50.277 ERROR 1 --- [ main] com.zaxxer.hikari.pool.HikariPool : HikariPool-1 - Exception during pool initialization.
com.mysql.cj.jdbc.exceptions.CommunicationsException: 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: 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.ConnectException: Connection refused (Connection refused)
编辑2
我尝试只使用一个spring boot和mysql实例,并使用网络链接它们,不幸的是,仍然会触发异常。两个容器仍在发出砰砰声。以下是我用于此测试的docker compose:
version: "3.9"
services:
card_mysql:
image: "mysql"
restart: always
environment:
MYSQL_ROOT_PASSWORD: "root"
MYSQL_DATABASE: "cards"
networks:
- "card_network"
card:
image: "openjdk:11"
restart: always
entrypoint: ["/app/wait-for-it.sh", "card_mysql:3306", "--", "java", "-jar", "/app/services/card/target/cardmarket-card-0.0.1-SNAPSHOT.jar"]
# entrypoint: ["/app/wait-for-it.sh", "card_mysql:3306", "--", "ping", "card_mysql"]
volumes:
- ./:/app
depends_on:
- "card_mysql"
networks:
- "card_network"
networks:
card_network: {}
您好,请添加网络,并将其收集到一个网络中
version: "3.4"
services:
springMvcRestApi:
image: springbootproject:0.0.1
container_name: app
networks:
- postgres
ports:
- 8085:8085
depends_on:
- postgres
- pgadmin
links:
- postgres
environment:
SPRING_DATASOURCE_URL: jdbc:postgresql://postgres:5432/reactiveDbcd?createDatabaseIfNotExist=true
SPRING_DATASOURCE_USERNAME: postgres
SPRING_DATASOURCE_PASSWORD: 12345
postgres:
container_name: postgres
image: postgres
environment:
POSTGRES_USER: postgres
POSTGRES_PASSWORD: 12345
PGDATA: /data/postgres
volumes:
- postgres:/data/postgres
expose:
- 5432
ports:
- 5432:5432
networks:
- postgres
restart: unless-stopped
pgadmin:
container_name: pgadmin_container
image: dpage/pgadmin4
environment:
PGADMIN_DEFAULT_EMAIL: ${PGADMIN_DEFAULT_EMAIL:-pgadmin4@pgadmin.org}
PGADMIN_DEFAULT_PASSWORD: ${PGADMIN_DEFAULT_PASSWORD:-admin}
PGADMIN_CONFIG_SERVER_MODE: 'False'
volumes:
- pgadmin:/root/.pgadmin
ports:
- "${PGADMIN_PORT:-80}:80"
networks:
- postgres
restart: unless-stopped
networks:
postgres:
driver: bridge
volumes:
postgres:
pgadmin:
您正在公开mysql的端口号3306133062、33063等。但是,在spring属性文件中,您只使用3306。为每个服务适当地更改它,并尝试一下。@dossani暴露的端口只对连接到主机的东西有用。对于容器之间的连接,端口映射并不重要。您将始终使用端口3306。您的代码以何种方式失败?您的应用程序很有可能在MySQL准备就绪之前启动
dependens\u on
基本上是无用的,因为它只是等待容器启动;Docker不知道应用程序是否准备就绪。你的代码应该有连接到数据库的重试逻辑。我已经编辑了这篇文章。spring引导容器都有重启选项,这还不够吗?您好,我刚刚编辑了这篇文章。它似乎也不起作用,我开始认为这一定是spring boot方面的问题,比如如果spring boot无法解决容器名问题是网络问题,请检查如果需要,我可以分享我自己编写的示例吗?