【问题标题】:Java app can't connect to rabbitMQ from the same docker containerJava 应用程序无法从同一个 docker 容器连接到 rabbitMQ
【发布时间】:2021-08-13 13:21:49
【问题描述】:

我有一个产生消息的示例 Spring Boot 应用程序:

@Scheduled(fixedRate = 10000)
public void test() throws Exception {
    ConnectionFactory factory = new ConnectionFactory();
    factory.setHost("localhost");
    try (Connection connection = factory.newConnection();
         Channel channel = connection.createChannel()) {
        channel.queueDeclare(QUEUE_NAME, false, false, false, null);
        String message = "Hello Rabbit!";
        channel.basicPublish("", QUEUE_NAME, null, message.getBytes(StandardCharsets.UTF_8));
        System.out.println(" [x] Sent '" + message + "'");
    }
}

它是码头化的:

FROM openjdk:11 as jdkbase
FROM jdkbase

COPY target/RabbitMQtester-0.0.1-SNAPSHOT.jar /run/RabbitMQtester-0.0.1-SNAPSHOT.jar
#ADD target/sfida-1.0.0.jar /run/sfida-1.0.0.jar

ENTRYPOINT java -Dfile.encoding=UTF-8 -jar /run/RabbitMQtester-0.0.1-SNAPSHOT.jar

我需要构建一个包含 RabbitMQ 和我的应用程序的图像。这是此任务的 docker-compose.yml:

version: "3.7"
services:
  mytestapp:
    build: .
  rabbitmq:
    image: rabbitmq:3.8.3-management-alpine
    hostname: localhost
    environment:
      RABBITMQ_DEFAULT_USER: guest
      RABBITMQ_DEFAULT_PASS: guest
    ports:
      - 5672:5672
      - 15672:15672

当我启动生成的图像时,我可以从我的主机访问 rabbitMQ 管理页面。另外,我可以从主机运行我的应用程序,它会访问rabbitMQ。 但是我在容器/图像中的应用程序无法访问 RabbitMQ(它会引发“连接被拒绝(连接被拒绝)”错误) 我的配置有什么问题?

UPD:我也尝试将 docker-compose.yml 更改为此(并在我的应用程序中连接到 factory.setHost("rabbitmq");

version: "3.8"
services:
  mytestapp:
    build: .
    networks:
      - some-net
  rabbitmq:
    image: rabbitmq:3.8.3-management-alpine
    hostname: rabbitmq
    networks:
      - some-net
    environment:
      RABBITMQ_DEFAULT_USER: guest
      RABBITMQ_DEFAULT_PASS: guest
    ports:
      - 5672:5672
      - 15672:15672
networks:
  some-net:
    driver: bridge

对此:

version: "3.8"
services:
  mytestapp:
    build: .

  rabbitmq:
    image: rabbitmq:3.8.3-management-alpine
    hostname: rabbitmq
    environment:
      RABBITMQ_DEFAULT_USER: guest
      RABBITMQ_DEFAULT_PASS: guest
    ports:
      - 5672:5672
      - 15672:15672

但结果是一样的……

【问题讨论】:

  • 您是否在docker-compose 文件中桥接网络?
  • 另外你使用的是什么类型的操作系统?
  • 1.这是我的整个 docker-compose.yml 文件; 2.MacOS 11.2.3
  • 可能使用localhost 作为主机名会导致一些问题。尝试将 docker-compose 中的 hostnamefactory.setHost 重命名为 rabbitmq-container 之类的东西
  • 我已经尝试过了(请参阅 upd),但结果仍然相同,但出现错误:(

标签: java docker docker-compose rabbitmq


【解决方案1】:

默认情况下,RabbitMQ 服务可使用 docker 服务的名称 rabbitmq(当您删除 hostname: localhost)从同一堆栈中的其他服务中访问(前提是它们配置了相同的网络,在这种情况下默认)。所以你应该用factory.setHost("rabbitmq");替换factory.setHost("localhost");并删除hostname: localhost

您确实指定了hostname: localhost,因此可以假设可以使用localhost 主机名从mytestapp 服务访问RabbitMQ,但由于它不起作用,它很可能与默认环回冲突并改为解析为127.0.0.1 .

【讨论】:

  • 我已经尝试过了(参见 upd),但结果仍然相同,但有错误:(
  • 只是一个问题,因为我也遇到了这个问题,您是否在 docker compose 时指定了 --build 标志?因为否则它只会在第一次构建。您可以通过添加一些日志来验证这一点,以查看是否应用了更改。所以:docker-compose up --build
猜你喜欢
  • 2020-10-06
  • 2021-12-16
  • 2019-05-24
  • 2017-04-11
  • 2020-12-23
  • 2020-01-30
  • 2019-07-30
  • 1970-01-01
  • 2016-02-23
相关资源
最近更新 更多