【问题标题】:RabbitMq Spring Boot deploy dockerRabbitMq Spring Boot 部署 docker
【发布时间】:2017-09-28 04:44:52
【问题描述】:

我有一个带有生产者和接收者的 Spring Boot 应用程序,它使用本地 rabbitmq 发送和接收消息。我正在尝试在 docker 容器上部署应用程序和 rabbit,一旦部署运行启动应用程序。一旦应用程序启动,它就会有一个实现 Spring CommandLineRunner 的生产者,这意味着应用程序会立即开始发送消息,因此必须先运行一个 rabbitmq 代理。我对码头工人很陌生。到目前为止我试过了:

1)。我为 Spring Boot 应用程序创建了如下图像

FROM java:8
EXPOSE 8080
ADD /target/MessagingApp.jar MessagingApp.jar
ENTRYPOINT ["java","-jar","MessagingApp.jar"]

2)。然后为兔子和我新创建的图像创建了 docker.compose 文件

rabbitmq:
  image: rabbitmq:management
  ports:
    - "5672:5672"
    - "15672:15672"
messagingapp:
  image: messagingapp:latest
  ports:
    - "80:8080"
  links:
    - rabbitmq

然后我运行了 docker-compose up,我可以看到 rabbit 启动到一定程度,然后是 spring boot 应用程序,但是发送消息失败

at com.rabbitmq.client.impl.SocketFrameHandlerFactory.create..

我认为我的问题是我的 spring boot 应用程序会自动尝试连接到 localhost rabbit 主机。那么如何让它指向 docker rabbitmq 服务器呢?

有什么帮助吗?

【问题讨论】:

    标签: java spring docker spring-boot docker-compose


    【解决方案1】:

    尝试将links 的一部分更新为depends_on。您的应用程序可能在messagingapp 之前启动。

    depends_on的部分文档

    docker-compose up 将按依赖顺序启动服务。当 docker-compose 执行 V2 文件时,它会自动在文件中定义的所有容器之间建立一个网络,每个容器都可以立即使用 docker-compose.yml 文件中定义的名称来引用其他容器。

    但是

    注意:depends_on 在启动 web 之前不会等待 db 和 redis “准备好” - 仅在它们启动之前。

    检查Controlling startup order

    您需要添加command 来检查服务状态。更多文档...

    depends_on:
          - "db"
        command: ["./wait-for-it.sh", "db:5432", "--", "python", "app.py"]
    

    【讨论】:

    • 我想,我知道错误是什么。我的应用程序假设 rabbitmq 服务器是 localhost,但 docker 在不同的 IP 上运行,那么如何链接我的应用程序 rabbit 以使用 docker ip 作为主机?
    • 当您运行docker-compose 时,它将在容器之间创建网络。兔子的网址应该是服务名称rabbitmq
    【解决方案2】:

    您的 Dockerfile 和 docker-compose.yml 文件似乎是正确的,除了两点:

    1. 您需要使用depends_on,而不是关键字links。这将首先构建并运行 RabbitMQ 实例,然后是您的 Web 服务。

    2. 你应该在你的消息应用服务下添加这一行:

    -->

    environment:
    -  SPRING_RABBITMQ_HOST=rabbitmq
    

    这将使您的 Spring Boot 应用程序能够识别 Docker 中的 RabbitMQ 映像。

    所以,尝试像这样更新您的 docker-compose.yml 文件:

    rabbitmq:
      image: rabbitmq:management
      ports:
        - "5672:5672"
        - "15672:15672"
    messagingapp:
      image: messagingapp:latest
      ports:
        - "80:8080"
      environment:
        - SPRING_RABBITMQ_HOST=rabbitmq
      depends_on:
        - rabbitmq
    

    【讨论】: