Docker RabbitMQ持久化

54

使用 Docker 中的 RabbitMQ 容器,如果没有挂载卷并且直接删除容器,则会导致数据丢失。

我的 Dockerfile:

FROM rabbitmq:3-management
ENV RABBITMQ_HIPE_COMPILE 1
ENV RABBITMQ_ERLANG_COOKIE "123456"
ENV RABBITMQ_DEFAULT_VHOST "123456"

我的运行脚本:

IMAGE_NAME="service-rabbitmq"
TAG="${REGISTRY_ADDRESS}/${IMAGE_NAME}:${VERSION}"

echo $TAG

docker rm -f $IMAGE_NAME

  docker run \
    -itd \
    -v "rabbitmq_log:/var/log/rabbitmq" \
    -v "rabbitmq_data:/var/lib/rabbitmq" \
    --name "service-rabbitmq" \
    --dns=8.8.8.8 \
    -p 8080:15672 \
    $TAG

移除容器后,所有数据都会丢失。

我该如何在Docker中配置RabbitMQ以保持持久化数据?


我曾在这里提出过类似的问题,但没有得到好的答案。http://stackoverflow.com/questions/40897360/export-rabbitmq-docker-image-with-vhost-and-queues - jhilden
相关问题在rabbitmq docker的Github主页上,网址为https://github.com/docker-library/rabbitmq/issues/106。 - Nam G VU
现在有什么更新吗? - Nico
2个回答

50
兔子消息队列在mnesia目录中使用主机名作为文件夹名称的一部分。也许在docker运行命令中添加--hostname some-rabbit? 我曾经遇到相同问题,我在这里找到了答案。

2
是的。为了澄清mnesia文件夹,我们可以调用docker logs $YOUR_CONTAINER_NAME来查看行database dir : /var/lib/rabbitmq/mnesia/rabbit@$YOUR_HOST_NAME参考 https://hub.docker.com/_/rabbitmq/ - Nam G VU
9
您可以将RABBITMQ_NODENAME环境变量设置为类似于 node@rabbitmq 的内容,而无需更改主机名。 - hmatt1
通过访问此URL,我使用以下命令解决了问题:docker run -d -v /MY_LOCAL/Data/Rabbitmq:/var/lib/rabbitmq --hostname my-rabbit --name rabbit-dev -p 8080:15672 -p 5671:5671 -p 5672:5672 rabbitmq:3-management - Guilherme

39

简介

虽然没有进行过深入的调查,但似乎最简单的方法是像 Pedro 在上面提到的那样更改 hostname

更多信息:

使用 RABBITMQ_NODENAME

如果你想通过 Docker 编辑 RABBITMQ_NODENAME 变量,似乎你需要添加一个 hostname,因为 Docker 主机名会生成为随机哈希值。

如果将 RABBITMQ_NODENAME 变量更改为类似于 my-rabbit 这样的静态变量,则 RabbitMQ 会抛出类似于“nxdomain not found”的错误,因为它正在寻找类似于
my-rabbit@<docker_hostname_hash>。如果你知道 Docker 主机名并可以自动将其拉入到像这样的 RABBITMQ_NODENAME 值中,my-rabbit@<docker_hostname_hash>,我相信它会起作用。


更新

我之前说过,

如果你知道 Docker 主机名并可以自动将其拉入到像这样的 RABBITMQ_NODENAME 值中,my-rabbit@<docker_hostname_hash>,我相信它会起作用。

按照描述,这不会起作用,因为默认的 Docker 主机名是在启动时随机生成的,如果没有显式指定,则会生成随机哈希值。实际上,障碍将确保您使用与最初运行的完全相同的<docker_hostname_hash>,以便正确拾取数据目录。这将很难动态/稳健地实现。最简单的方法是像下面描述的那样使用显式主机名。


另一种选择是将 hostname 设置为你选择的值 - 比如说,app-messaging - 并且RABBITMQ_NODENAME 变量设置为类似于 rabbit@app-messaging 的值。这样你可以控制将在数据目录中使用的完整节点名称。

使用主机名

(推荐)

尽管如此,除非你有理由更改主机名,否则只更改主机名是确保每次挂载和卸载数据到相同位置的最简单方法。

我正在使用以下 Docker Compose 文件成功地保持我的设置在多次启动时。

version: '3'
services:
  rabbitmq:
    hostname: 'mabbit'
    image: "${ARTIFACTORY}/rabbitmq:3-management"
    ports:
      - "15672:15672"
      - "5672:5672"
    volumes:
      - "./data:/var/lib/rabbitmq/mnesia/"
    networks:
      - rabbitmq

networks:
  rabbitmq:
    driver: bridge

这将在我的compose文件旁边创建一个data目录,并像下面这样持久化RabbitMQ设置:

./data/
  rabbit@mabbit/
  rabbit@mabbit-plugins-expand/
  rabbit@mabbit.pid
  rabbit@mabbit-feature_flags


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接