拒绝连接:运行Docker Compose时

时间:2020-02-03 07:55:05

标签: spring-boot docker 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

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)我要实现的目标-

  • 想为我的应用程序创建一个jar。
  • 创建罐子之后,我想从罐子中创建图像
  • 创建应用程序的映像后,我要推入docker hub。
  • 在其他服务器上,我将运行docker-compose.yml文件。它将从docker hub获取mysql和映像,并在docker-compose中提到的其他端口上运行该应用程序。

希望我很清楚,我想要实现什么。

这是问题所在:

  • 当我尝试在本地运行应用程序时,仅在将行写到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,因此无法创建图像。所以我的想法在这里也失败了。

  • 然后,再次想到一个主意,我们不能将动态IP地址放在application.properties文件中,所以我尝试了这一行:

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

4 个答案:

答案 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