使用 docker-compose 无法在同一网络中连接 mysql 和 spring boot

Posted

技术标签:

【中文标题】使用 docker-compose 无法在同一网络中连接 mysql 和 spring boot【英文标题】:using docker-compose unable to connect mysql and spring boot in same network 【发布时间】:2020-05-05 16:45:47 【问题描述】:

任何帮助将不胜感激。 我正在尝试在两个容器中运行 mysql 和 spring-boot 应用程序,但是在同一个网络中。 使用以下命令,两个容器相互通信。 mysql 命令 docker run --name mysql-local --network=spring-boot-network -p 4000:3306 -d -e MYSQL_ROOT_PASSWORD=password -e MYSQL_USER=root-user -e MYSQL_PASSWORD=password -e MYSQL_DATABASE=testdb mysql 应用命令 docker run --network=spring-boot-network -p 8080:8080 --name test-app -e RDH_HOSTNAME:mysql-local -e RDS_PORT:4000 -e RDS_USER:root-user -e -e RDS_PASSWORD:password 171ce195f461

使用上面的 tow docker 命令在 spring-boot-network 中创建了两个容器,它们可以相互通信。 当我尝试使用 docker-compose 时出现问题。 我传递了与命令行相同的环境,但我的应用拒绝连接 mysql。

我正在使用 spotify 插件来创建图像。

<plugin>
                <groupId>com.spotify</groupId>
                <artifactId>dockerfile-maven-plugin</artifactId>
                <version>1.4.3</version>
                <executions>
                    <execution>
                        <id>default</id>
                        <goals>
                            <goal>build</goal>
                        </goals>
                    </execution>
                </executions>
                <configuration>
                    <repository>rajesh132/test-docker</repository>
                    <tag>$project.version</tag>
                    <buildArgs>
                        <JAR_FILE>$project.build.finalName.jar</JAR_FILE>
                    </buildArgs>
                </configuration>
            </plugin>

当我启动容器时,mysql 容器被创建并启动。我也可以使用 mysqlsh 客户端和 mysql 工作台连接到它。但是,我无法连接到我的应用程序。以下是我在项目中使用的属性和 docker 文件。 Docker 文件

ADD target/docker-test.jar docker-test.jar
ENTRYPOINT ["java", "-jar", "docker-test.jar"]

Docker 编写文件

version: '3.7'
services:
  spirng-boot-test-application:
    image: rajesh132/test-docker:0.0.1-SNAPSHOT
      #build:
      #context: .
    #dockerfile: Dockerfile
    ports:
      - "8080:8080"
    restart: always
    depends_on: # Start the depends_on first
      - mysql-app
    environment:
      RDS_HOSTNAME: mysql-app
      RDS_PORT: 4000
      RDS_DB_NAME: testdb
      RDS_USERNAME: test-user
      RDS_PASSWORD: password
    networks:
      - web-application-network

  mysql-app:
    image: mysql
    ports:
      - "4000:3306"
    restart: always
    environment:

      MYSQL_ROOT_PASSWORD: password
      MYSQL_USER: test-user
      MYSQL_PASSWORD: password
      MYSQL_DATABASE: testdb
    volumes:
      - mysql-database-data-volume:/var/lib/mysql
    networks:
      - web-application-network

# Volumes
volumes:
  mysql-database-data-volume:

networks:
  web-application-network:

application.yml

  datasource:
    #  use this url for localhost
    #use docker container name instead 'localhost'
    #  url: jdbc:mysql://localhost:3306/authorizationDb?createDatabaseIfNotExist=true
    url: jdbc:mysql://$RDS_HOSTNAME:localhost:$RDS_PORT:3306/$RDS_DB_NAME:test?createDatabaseIfNotExist=true&useSSL=false&allowPublicKeyRetrieval=true
    username: $RDS_USER:root
    password: $RDS_PASSWORD:password
    driver-class-name: com.mysql.cj.jdbc.Driver
    initialization-mode: always
    tomcat:
      test-on-borrow: true
      validation-query: SELECT 1
  jpa:
    hibernate:
      naming:
        physical-strategy: org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl
      ddl-auto: update
    properties:
      hibernate:
        show_sql: true
        format_sql: true
    database-platform: org.hibernate.dialect.MySQL8Dialect

logging:
  level:
    org:
      hibernate:
        type: trace

我关注了很多博客、文档,但没有成功构建。任何帮助都非常感谢。

【问题讨论】:

【参考方案1】:

您的RDS_PORT: 4000 必须改为RDS_PORT: 3306

当您将容器端口公开为“4000:3306”时,只能从主机使用端口 4000。在容器网络内,需要使用3306。

【讨论】:

Mysql 正在我的主机上运行。我将端口更改为 3306 并且 docker 引擎给出了一个错误,例如端口已使用。 达蒙...终于,我明白了。对于使用 4000 端口的外部 docker,它可以与容器通信。 Docker 容器内部与 3306 端口通信。妈的……

以上是关于使用 docker-compose 无法在同一网络中连接 mysql 和 spring boot的主要内容,如果未能解决你的问题,请参考以下文章

使用`docker-compose run`时无法调试,但`docker-compose up`有效

由于网络问题,Docker 无法使用 ***

在同一主机上的不同网络中的 Docker 容器之间进行通信

Docker 中的 Kafka 无法正常工作

使用主机 DNS 服务器的 Docker-compose 容器

如何在 Docker-Compose 中一起使用主机网络和任何其他用户定义的网络?