RabbitMQ部署

igxiaoshan Lv5

RabbitMQ部署

启动 RabbitMQ 容器

部署脚本

脚本

1
2
3
4
5
6
7
8
9
docker run -d \
-e RABBITMQ_DEFAULT_USER=admin \
-e RABBITMQ_DEFAULT_PASS=admin321 \
--name rabbitmq \
--hostname mq1 \
-p 5672:5672 \
-p 15672:15672 \
-v rabbitmq-data:/var/lib/rabbitmq \
rabbitmq:3-management

解析

  • -d: 后台运行容器。
  • -e RABBITMQ_DEFAULT_USER=admin:创建初始化用户为admin
  • -e RABBITMQ_DEFAULT_PASS=admin321:创建初始化用户密码为admin321
  • --name rabbitmq: 给容器命名为 rabbitmq
  • --hostname mq1: 设置容器的主机名为 mq1
  • -p 5672:5672: 将主机的 5672 端口映射到容器的 5672 端口(AMQP 协议端口)。
  • -p 15672:15672: 将主机的 15672 端口映射到容器的 15672 端口(管理界面端口)。
  • -v rabbitmq-data:/var/lib/rabbitmq: 使用 Docker 卷 rabbitmq-data 持久化存储 RabbitMQ 数据。

总结

1
2
3
4
5
如果脚本中不指定初始化用户和密码;会使用默认的用户和密码;
- 默认用户:guest
- 默认密码:guest
管理页面:
http://localhost:15672

创建用户和虚拟主机

创建用户并赋予其管理界面访问权限,这样新用户就可以登录 RabbitMQ 管理界面

创建新用户

1
docker exec -it rabbitmq rabbitmqctl add_user myuser mypassword
  • rabbitmqctl add_user myuser mypassword: 创建新用户 myuser,密码 mypassword

创建虚拟主机

1
docker exec -it rabbitmq rabbitmqctl add_vhost myvhost
  • rabbitmqctl add_vhost myvhost: 创建虚拟主机 myvhost

设置用户权限

1
docker exec -it rabbitmq rabbitmqctl set_permissions -p / myuser ".*" ".*" ".*"
  • rabbitmqctl set_permissions -p myvhost myuser ".*" ".*" ".*": 为用户 myuser 在虚拟主机 myvhost 上设置权限。

赋予用户管理员角色

1
docker exec -it rabbitmq rabbitmqctl set_user_tags myuser administrator
  • docker exec -it rabbitmq rabbitmqctl set_user_tags myuser administrator:为用户myuser赋予管理员权限,使用户拥有登录管理页面的权限

Docker 卷(Volume)

[Docker 卷](#使用 Docker 卷 rabbitmq-data 持久化存储 RabbitMQ 数据)是一种用于持久化存储数据的方法。卷的数据存储在 Docker 管理的一个位置,而不是在容器的文件系统中。这意味着即使容器被删除,数据仍然会保留。

挂载点

  • 主机路径:在这种情况下,rabbitmq-data 是一个 Docker 卷,而不是主机上的一个具体路径。Docker 卷通常存储在 Docker 引擎管理的一个目录中,该目录的位置取决于你的操作系统和 Docker 配置。例如,在 Linux 上,默认情况下,卷的数据存储在 /var/lib/docker/volumes/ 下。

查看 Docker 卷的实际存储位置

你可以使用以下命令查看 Docker 卷的详细信息,包括其存储位置:

1
docker volume inspect rabbitmq-data

输入如下:

1
2
3
4
5
6
7
8
9
10
11
[
{
"CreatedAt": "2023-06-26T12:34:56Z",
"Driver": "local",
"Labels": null,
"Mountpoint": "/var/lib/docker/volumes/rabbitmq-data/_data",
"Name": "rabbitmq-data",
"Options": null,
"Scope": "local"
}
]

在这个输出中,Mountpoint 字段显示了卷在主机上的实际存储位置。

使用Demo

可以使用 pika 库与 RabbitMQ 进行交互。

安装 pika 库:

1
pip install pika

生产者(producer

1
2
3
4
5
6
7
8
9
10
11
12
import pika

credentials = pika.PlainCredentials('myuser', 'mypassword')
connection = pika.BlockingConnection(pika.ConnectionParameters('localhost', 5672, 'myvhost', credentials))
channel = connection.channel()

channel.queue_declare(queue='hello')

channel.basic_publish(exchange='', routing_key='hello', body='Hello World!')
print(" [x] Sent 'Hello World!'")
connection.close()

消费者(Consumer

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import pika

credentials = pika.PlainCredentials('myuser', 'mypassword')
connection = pika.BlockingConnection(pika.ConnectionParameters('localhost', 5672, 'myvhost', credentials))
channel = connection.channel()

channel.queue_declare(queue='hello')

def callback(ch, method, properties, body):
print(f" [x] Received {body}")

channel.basic_consume(queue='hello', on_message_callback=callback, auto_ack=True)

print(' [*] Waiting for messages. To exit press CTRL+C')
channel.start_consuming()

生产者和消费者示例

  • 编写生产者代码,发送消息。
  • 编写消费者代码,接收消息。