【问题标题】:Export RabbitMQ Docker image with vhost and queues使用 vhost 和队列导出 RabbitMQ Docker 映像
【发布时间】:2016-11-30 20:15:47
【问题描述】:

我有一个 rabbitMQ docker 容器,我使用以下命令开始:

docker run -d --name myrabbit1 -p 15672:15672 rabbitmq:3-management

然后我登录管理插件并创建用户、虚拟主机、队列等。

我想保存所有这些设置,以便再次加载它们。为此,我尝试提交一个新图像:

docker commit myrabbit1 vbrabbit:withVhostAndQueues

然后我启动我的新容器(在停止旧容器之后):

docker run -d --name vbrabbit2 -p 15672:15672 -p 5672:5672 vbrabbit:withVhostAndQueues

我希望所有队列、虚拟主机等都会被保存,但事实并非如此。

我错过了什么?

docker ps -a 的结果:

【问题讨论】:

  • 提交后,您停止并删除了 myrabbit1,因为您使用主机上的相同端口,对吧?
  • 发布docker ps -a
  • 是的,我先停止了旧的(描述已更新)
  • docker ps -a?
  • ps -a 输出添加

标签: docker rabbitmq


【解决方案1】:

我想保存所有这些设置,以便再次加载它们

您是否需要使用相同的设置创建容器的副本?

或者您只是希望 docker stop myrabbit1 和稍后 docker start myrabbit 再次运行同一个容器?

【讨论】:

  • 我正在寻找具有相同设置的容器副本,以便我团队中的每个开发人员都可以预先配置所有内容。
【解决方案2】:

TL;DR

容器内的 RabbitMQ 实例在不同的地方寻找数据。默认配置会更改每个容器创建的数据存储/加载位置。因此,OPs 数据存在于创建的“最终”image 中,但 rabbitmq 没有加载它。

修复静态设置RABBITMQ_NODENAME,这同样可能需要在/etc/hosts 中添加另一行,以便 RabbitMQ 确认节点处于活动状态。

详情

这发生在我的 docker rabbit:3.8.12-management

这是由 RabbitMQ 的默认配置影响其数据存储方式造成的。默认情况下,RabbitMQ 在 UNIX 系统上启动一个名为 rabbit@$HOSTNAME 的节点(参见 config docs 上的 RABBITMQ_NODENAME)。在 Docker 中,每个容器运行的 $HOSTNAME 更改默认为 container id(例如 dd84759287560 之类的东西)。

在@jhilden 的情况下,当vbrabbit:withVhostAndQueues 映像作为新容器启动时,RABBITMQ_NODENAME 与用于创建和存储原始虚拟主机、用户、队列等的值不同。并且作为 RabbitMQ 存储以RABBITMQ_NODENAME 命名的目录中的数据现有数据不会在vbrabbit:withVhostAndQueues 启动时加载。当$HOSTNAME 改变时RABBITMQ_NODENAME 改变。因此,启动的 RabbitMQ 实例找不到任何现有数据。 (例如,现有数据存在于图像中,但用于不同的 RABBITMQ_NODENAME 并且未加载)。

注意:我只考虑为本地开发单实例集群解决此问题。如果您使用 RabbitMQ docker 进行生产部署,您可能需要查看自定义主机名

为了解决这个问题,我们为容器设置了一个静态 RABBITMQ_NODENAME

在我们更新的 docker-compose v3 文件中:

  # Before fix
  rabbitmq:
    image: "rabbitmq:$RABBITMQ_VERSION"
    container_name: rabbitmq
    ports:
      - "5672:5672"
      - "15672:15672"
      - "61613:61613"
    volumes:
      - "./etc/rabbit-plugins:/etc/rabbitmq/enabled_plugins"
      - type: volume
        source: rabbitmq-data
        target: /var/lib/rabbitmq

修复后进入:

  rabbitmq:
    image: "rabbitmq:$RABBITMQ_VERSION"
    container_name: rabbitmq
    # Why do we set NODENAME and extra_hosts?
    # 
    # It codifies that we're using the same RabbitMQ instance between container rebuilds.
    # If NODENAME is not set it defaults to "rabbit@$HOST" and because $HOST is dynamically
    # created in docker it changes per container deployment. Why is a changing host an issue?
    # Well because under the hood Rabbit stores data on a per node basis. Thus without the
    # static RABBITMQ_NODENAME the directory the data is stored within changes per restart.
    # Going from "rabbit@7745942c559e" to "rabbit@036834720485" the next. Okay, but why do we
    # need extra_hosts? We'll Rabbit wants to resolve itself to affirm it's management UI is
    # functioning post deployment and does that with an HTTP call. Thus to resolve the static
    # host from RABBITMQ_NODENAME we need to add it to the containers /etc/hosts file.
    environment:
      RABBITMQ_NODENAME: "rabbit@staticrabbit"
    extra_hosts:
      - "staticrabbit:127.0.0.1"
    ports:
      - "5672:5672"
      - "15672:15672"
      - "61613:61613"
    volumes:
      - "./etc/rabbit-plugins:/etc/rabbitmq/enabled_plugins"
      - type: volume
        source: rabbitmq-data
        target: /var/lib/rabbitmq

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-05-21
    • 1970-01-01
    • 2019-01-17
    • 1970-01-01
    • 2018-10-20
    • 2012-05-14
    • 2011-05-08
    • 1970-01-01
    相关资源
    最近更新 更多