RabbitMq Spring Boot部署docker

时间:2017-04-30 14:54:09

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

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

1)。我为spring boot app创建了图像,如下所示

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我可以看到兔子在某种程度上开始,然后是春季启动应用程序但是无法发送消息

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

我认为我的问题是我的春季启动应用会自动尝试连接到localhost兔主机。那么我该如何指向docker rabbitmq服务器?

任何帮助?

2 个答案:

答案 0 :(得分:1)

尝试为links更新depends_on的部分内容。您的申请可能在messagingapp之前开始。

depends_on

的部分文档
  

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

<强>但是

  

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

支票Controlling startup order

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

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

答案 1 :(得分:0)

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

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

  2. 您应将此行添加到messagingapp服务下:

->

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