Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/spring-boot/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Spring boot Spring boot microservices和Docker,无法连接到数据库_Spring Boot_Docker_Docker Compose - Fatal编程技术网

Spring boot Spring boot microservices和Docker,无法连接到数据库

Spring 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_数据库:“卡片” 端口

我正在微服务中编写一个测试应用程序来学习SpringBoot。我已经完成了这个应用程序,并希望使用docker/docker compose在AWS上部署它来托管每个微服务

我无法将任何Spring启动实例连接到它们的Mysql数据库。我已经坚持了几天了,我看不出有什么不对劲

这是我的docker-compose.yml

版本:“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无法解决容器名问题是网络问题,请检查如果需要,我可以分享我自己编写的示例吗?