首页 > 解决方案 > 连接被拒绝:运行 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 时能够提取该图像但无法连接到 mysql 工作台。

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 应用程序时,我无法运行该应用程序,因为它说的是与上面提到的几乎相同的错误,即连接拒绝。所以我无法创建罐子,所以无法创建图像。所以我的想法在这里也失败了。

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"
                 }
             ]
         },

标签: spring-bootdockerdocker-compose

解决方案


很好,但是在这里您看到您之前使用的是 DB_HOST,现在您使用的是 DATABASE_HOST= mysqlDb ,它当前指向您的 mysql 服务名称。可以在 docker compose 创建的单个网络中发现此服务名称。您正在硬编码 DB_HOST=192.168.0.1 并尝试使用此 IP 进行连接,这在 docker compose 创建其网络时是无效的。


推荐阅读