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 库:
生产者(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()
|
生产者和消费者示例:
- 编写生产者代码,发送消息。
- 编写消费者代码,接收消息。