Appearance
Docker 部署
1. 概述
Docker 是部署 RabbitMQ 最便捷的方式之一,特别适合开发、测试和 CI/CD 环境。本章将详细介绍使用 Docker 和 Docker Compose 部署 RabbitMQ 的多种方式,包括单节点部署、集群部署和高可用配置。
2. 系统要求
2.1 Docker 版本要求
| 组件 | 最低版本 | 推荐版本 |
|---|---|---|
| Docker Engine | 20.10+ | 24.0+ |
| Docker Compose | 2.0+ | 2.20+ |
2.2 硬件资源建议
| 部署类型 | CPU | 内存 | 磁盘 |
|---|---|---|---|
| 开发环境 | 1 核 | 1 GB | 5 GB |
| 测试环境 | 2 核 | 2 GB | 10 GB |
| 生产环境 | 4 核+ | 4 GB+ | 50 GB+ |
2.3 检查 Docker 环境
bash
docker --version
docker compose version
docker info | grep -E "Server Version|Storage Driver|Cgroup"3. 单节点部署
3.1 快速启动
bash
docker run -d --name rabbitmq \
-p 5672:5672 \
-p 15672:15672 \
rabbitmq:3.13-management3.2 带持久化的启动
bash
docker run -d --name rabbitmq \
--hostname rabbitmq \
-p 5672:5672 \
-p 15672:15672 \
-v rabbitmq_data:/var/lib/rabbitmq \
-v rabbitmq_log:/var/log/rabbitmq \
rabbitmq:3.13-management3.3 带自定义配置的启动
bash
docker run -d --name rabbitmq \
--hostname rabbitmq \
-p 5672:5672 \
-p 15672:15672 \
-v rabbitmq_data:/var/lib/rabbitmq \
-v rabbitmq_log:/var/log/rabbitmq \
-v ./rabbitmq.conf:/etc/rabbitmq/rabbitmq.conf:ro \
-v ./enabled_plugins:/etc/rabbitmq/enabled_plugins:ro \
-e RABBITMQ_DEFAULT_USER=admin \
-e RABBITMQ_DEFAULT_PASS=admin123 \
rabbitmq:3.13-management3.4 完整配置示例
bash
docker run -d --name rabbitmq \
--hostname rabbitmq \
--restart unless-stopped \
-p 5672:5672 \
-p 5671:5671 \
-p 15672:15672 \
-p 15671:15671 \
-p 25672:25672 \
-p 4369:4369 \
-v rabbitmq_data:/var/lib/rabbitmq \
-v rabbitmq_log:/var/log/rabbitmq \
-v ./conf/rabbitmq.conf:/etc/rabbitmq/rabbitmq.conf:ro \
-v ./conf/enabled_plugins:/etc/rabbitmq/enabled_plugins:ro \
-v ./certs:/etc/rabbitmq/certs:ro \
-e RABBITMQ_DEFAULT_USER=admin \
-e RABBITMQ_DEFAULT_PASS=YourStrongPassword123 \
-e RABBITMQ_DEFAULT_VHOST=/ \
-e RABBITMQ_ERLANG_COOKIE='RABBITMQ_CLUSTER_COOKIE' \
--memory="2g" \
--memory-swap="2g" \
--cpus="2" \
--ulimit nofile=65536:65536 \
--health-cmd="rabbitmqctl status" \
--health-interval=30s \
--health-timeout=10s \
--health-retries=5 \
rabbitmq:3.13-management4. Docker Compose 部署
4.1 基础 Docker Compose 配置
创建 docker-compose.yml 文件:
yaml
version: '3.8'
services:
rabbitmq:
image: rabbitmq:3.13-management
container_name: rabbitmq
hostname: rabbitmq
restart: unless-stopped
ports:
- "5672:5672"
- "15672:15672"
environment:
RABBITMQ_DEFAULT_USER: admin
RABBITMQ_DEFAULT_PASS: admin123
RABBITMQ_DEFAULT_VHOST: /
volumes:
- rabbitmq_data:/var/lib/rabbitmq
- rabbitmq_log:/var/log/rabbitmq
healthcheck:
test: ["CMD", "rabbitmqctl", "status"]
interval: 30s
timeout: 10s
retries: 5
start_period: 40s
volumes:
rabbitmq_data:
rabbitmq_log:
networks:
default:
name: rabbitmq_network4.2 生产环境 Docker Compose 配置
yaml
version: '3.8'
services:
rabbitmq:
image: rabbitmq:3.13-management
container_name: rabbitmq
hostname: rabbitmq
restart: unless-stopped
ports:
- "5672:5672"
- "5671:5671"
- "15672:15672"
- "15671:15671"
- "25672:25672"
environment:
RABBITMQ_DEFAULT_USER: ${RABBITMQ_USER:-admin}
RABBITMQ_DEFAULT_PASS: ${RABBITMQ_PASS:-admin123}
RABBITMQ_DEFAULT_VHOST: ${RABBITMQ_VHOST:-/}
RABBITMQ_ERLANG_COOKIE: ${RABBITMQ_COOKIE:-RABBITMQ_CLUSTER_COOKIE}
RABBITMQ_NODENAME: rabbit@rabbitmq
volumes:
- ./conf/rabbitmq.conf:/etc/rabbitmq/rabbitmq.conf:ro
- ./conf/advanced.config:/etc/rabbitmq/advanced.config:ro
- ./conf/enabled_plugins:/etc/rabbitmq/enabled_plugins:ro
- ./certs:/etc/rabbitmq/certs:ro
- rabbitmq_data:/var/lib/rabbitmq
- rabbitmq_log:/var/log/rabbitmq
deploy:
resources:
limits:
cpus: '2'
memory: 2G
reservations:
cpus: '1'
memory: 1G
ulimits:
nofile:
soft: 65536
hard: 65536
healthcheck:
test: ["CMD", "rabbitmqctl", "status"]
interval: 30s
timeout: 10s
retries: 5
start_period: 60s
logging:
driver: "json-file"
options:
max-size: "100m"
max-file: "5"
networks:
- rabbitmq_network
volumes:
rabbitmq_data:
driver: local
rabbitmq_log:
driver: local
networks:
rabbitmq_network:
driver: bridge4.3 配置文件
rabbitmq.conf:
conf
listeners.tcp.default = 5672
management.tcp.port = 15672
default_user = admin
default_pass = admin123
loopback_users = none
vm_memory_high_watermark.relative = 0.6
disk_free_limit.absolute = 1GB
log.file.level = info
log.console = true
log.console.level = info
default_vhost = /
default_permissions.configure = .*
default_permissions.write = .*
default_permissions.read = .*
consumer_timeout = 1800000
heartbeat = 60
channel_max = 2048enabled_plugins:
erlang
[rabbitmq_management,rabbitmq_prometheus,rabbitmq_web_stomp,rabbitmq_mqtt].advanced.config:
erlang
[
{rabbit, [
{default_user, <<"admin">>},
{default_pass, <<"admin123">>},
{tcp_listeners, [5672]},
{ssl_listeners, [5671]},
{ssl_options, [
{cacertfile, "/etc/rabbitmq/certs/ca.crt"},
{certfile, "/etc/rabbitmq/certs/server.crt"},
{keyfile, "/etc/rabbitmq/certs/server.key"},
{verify, verify_peer},
{fail_if_no_peer_cert, false}
]},
{memory_high_watermark, {relative, 0.6}},
{disk_free_limit, {absolute, 1000000000}}
]},
{rabbitmq_management, [
{listener, [
{port, 15672},
{ssl, false}
]}
]}
].4.4 环境变量文件
创建 .env 文件:
env
RABBITMQ_USER=admin
RABBITMQ_PASS=YourStrongPassword123
RABBITMQ_VHOST=/
RABBITMQ_COOKIE=RABBITMQ_CLUSTER_COOKIE_SECRET4.5 启动和管理
bash
# 启动服务
docker compose up -d
# 查看日志
docker compose logs -f rabbitmq
# 查看状态
docker compose ps
# 停止服务
docker compose down
# 停止并删除数据
docker compose down -v
# 重启服务
docker compose restart
# 进入容器
docker compose exec rabbitmq bash
# 执行命令
docker compose exec rabbitmq rabbitmqctl status
docker compose exec rabbitmq rabbitmqctl list_users5. 集群部署
5.1 Docker Compose 集群配置
yaml
version: '3.8'
services:
rabbitmq1:
image: rabbitmq:3.13-management
container_name: rabbitmq1
hostname: rabbitmq1
restart: unless-stopped
ports:
- "5672:5672"
- "15672:15672"
environment:
RABBITMQ_ERLANG_COOKIE: 'RABBITMQ_CLUSTER_COOKIE'
RABBITMQ_NODENAME: rabbit@rabbitmq1
volumes:
- rabbitmq1_data:/var/lib/rabbitmq
- ./conf/rabbitmq.conf:/etc/rabbitmq/rabbitmq.conf:ro
healthcheck:
test: ["CMD", "rabbitmqctl", "status"]
interval: 30s
timeout: 10s
retries: 5
networks:
- rabbitmq_cluster
rabbitmq2:
image: rabbitmq:3.13-management
container_name: rabbitmq2
hostname: rabbitmq2
restart: unless-stopped
ports:
- "5673:5672"
- "15673:15672"
environment:
RABBITMQ_ERLANG_COOKIE: 'RABBITMQ_CLUSTER_COOKIE'
RABBITMQ_NODENAME: rabbit@rabbitmq2
volumes:
- rabbitmq2_data:/var/lib/rabbitmq
- ./conf/rabbitmq.conf:/etc/rabbitmq/rabbitmq.conf:ro
healthcheck:
test: ["CMD", "rabbitmqctl", "status"]
interval: 30s
timeout: 10s
retries: 5
depends_on:
rabbitmq1:
condition: service_healthy
networks:
- rabbitmq_cluster
rabbitmq3:
image: rabbitmq:3.13-management
container_name: rabbitmq3
hostname: rabbitmq3
restart: unless-stopped
ports:
- "5674:5672"
- "15674:15672"
environment:
RABBITMQ_ERLANG_COOKIE: 'RABBITMQ_CLUSTER_COOKIE'
RABBITMQ_NODENAME: rabbit@rabbitmq3
volumes:
- rabbitmq3_data:/var/lib/rabbitmq
- ./conf/rabbitmq.conf:/etc/rabbitmq/rabbitmq.conf:ro
healthcheck:
test: ["CMD", "rabbitmqctl", "status"]
interval: 30s
timeout: 10s
retries: 5
depends_on:
rabbitmq1:
condition: service_healthy
networks:
- rabbitmq_cluster
volumes:
rabbitmq1_data:
rabbitmq2_data:
rabbitmq3_data:
networks:
rabbitmq_cluster:
driver: bridge5.2 集群初始化脚本
创建 init-cluster.sh:
bash
#!/bin/bash
set -e
echo "Waiting for RabbitMQ nodes to start..."
sleep 30
echo "Stopping rabbitmq2 and rabbitmq3..."
docker compose exec -T rabbitmq2 rabbitmqctl stop_app
docker compose exec -T rabbitmq3 rabbitmqctl stop_app
echo "Joining rabbitmq2 to cluster..."
docker compose exec -T rabbitmq2 rabbitmqctl join_cluster rabbit@rabbitmq1
docker compose exec -T rabbitmq2 rabbitmqctl start_app
echo "Joining rabbitmq3 to cluster..."
docker compose exec -T rabbitmq3 rabbitmqctl join_cluster rabbit@rabbitmq1
docker compose exec -T rabbitmq3 rabbitmqctl start_app
echo "Checking cluster status..."
docker compose exec -T rabbitmq1 rabbitmqctl cluster_status
echo "Cluster setup completed!"5.3 自动集群配置
使用自动发现机制:
yaml
version: '3.8'
services:
rabbitmq:
image: rabbitmq:3.13-management
deploy:
replicas: 3
environment:
RABBITMQ_ERLANG_COOKIE: 'RABBITMQ_CLUSTER_COOKIE'
RABBITMQ_CLUSTER_FORMATION_PEER_DISCOVERY_BACKEND: rabbit_peer_discovery_classic_config
RABBITMQ_CLUSTER_FORMATION_CLASSIC_CONFIG_NODES: >
rabbit@rabbitmq1,
rabbit@rabbitmq2,
rabbit@rabbitmq3
volumes:
- rabbitmq_data:/var/lib/rabbitmq
networks:
- rabbitmq_cluster5.4 镜像队列策略
bash
# 设置镜像队列策略
docker compose exec rabbitmq1 rabbitmqctl set_policy ha-all ".*" \
'{"ha-mode":"all","ha-sync-mode":"automatic"}' \
--apply-to queues
# 查看策略
docker compose exec rabbitmq1 rabbitmqctl list_policies6. 高级配置
6.1 SSL/TLS 配置
yaml
version: '3.8'
services:
rabbitmq:
image: rabbitmq:3.13-management
container_name: rabbitmq
hostname: rabbitmq
ports:
- "5671:5671"
- "15671:15671"
environment:
RABBITMQ_SSL_CACERTFILE: /etc/rabbitmq/certs/ca.crt
RABBITMQ_SSL_CERTFILE: /etc/rabbitmq/certs/server.crt
RABBITMQ_SSL_KEYFILE: /etc/rabbitmq/certs/server.key
RABBITMQ_SSL_VERIFY: verify_peer
RABBITMQ_SSL_FAIL_IF_NO_PEER_CERT: "false"
volumes:
- ./certs:/etc/rabbitmq/certs:ro
- rabbitmq_data:/var/lib/rabbitmq6.2 监控配置
yaml
version: '3.8'
services:
rabbitmq:
image: rabbitmq:3.13-management
container_name: rabbitmq
ports:
- "5672:5672"
- "15672:15672"
- "15692:15692"
environment:
RABBITMQ_DEFAULT_USER: admin
RABBITMQ_DEFAULT_PASS: admin123
volumes:
- ./conf/enabled_plugins:/etc/rabbitmq/enabled_plugins:ro
- rabbitmq_data:/var/lib/rabbitmq
prometheus:
image: prom/prometheus:latest
container_name: prometheus
ports:
- "9090:9090"
volumes:
- ./prometheus/prometheus.yml:/etc/prometheus/prometheus.yml:ro
depends_on:
- rabbitmq
grafana:
image: grafana/grafana:latest
container_name: grafana
ports:
- "3000:3000"
environment:
GF_SECURITY_ADMIN_PASSWORD: admin
volumes:
- grafana_data:/var/lib/grafana
depends_on:
- prometheus
volumes:
rabbitmq_data:
grafana_data:enabled_plugins(包含 Prometheus 插件):
erlang
[rabbitmq_management,rabbitmq_prometheus].prometheus.yml:
yaml
global:
scrape_interval: 15s
scrape_configs:
- job_name: 'rabbitmq'
static_configs:
- targets: ['rabbitmq:15692']6.3 延迟队列插件
yaml
version: '3.8'
services:
rabbitmq:
image: rabbitmq:3.13-management
container_name: rabbitmq
ports:
- "5672:5672"
- "15672:15672"
volumes:
- ./conf/enabled_plugins:/etc/rabbitmq/enabled_plugins:ro
- rabbitmq_data:/var/lib/rabbitmq
command: >
bash -c "rabbitmq-plugins enable --offline rabbitmq_delayed_message_exchange &&
docker-entrypoint.sh rabbitmq-server"7. 常见问题与解决方案
7.1 容器无法启动
问题表现:
Error: {"init terminating in do_boot",{undef,[{rabbit,boot,[],[]},...]}}解决方案:
bash
# 检查日志
docker logs rabbitmq
# 清理数据重新启动
docker compose down -v
docker compose up -d7.2 内存不足
问题表现:
memory resource limit alarm set on node解决方案:
yaml
services:
rabbitmq:
image: rabbitmq:3.13-management
deploy:
resources:
limits:
memory: 2G
environment:
RABBITMQ_VM_MEMORY_HIGH_WATERMARK: "0.6"7.3 集群节点无法加入
问题表现:
Error: {badrpc,nodedown}解决方案:
bash
# 确保 Erlang Cookie 一致
docker compose exec rabbitmq1 cat /var/lib/rabbitmq/.erlang.cookie
docker compose exec rabbitmq2 cat /var/lib/rabbitmq/.erlang.cookie
# 检查网络连通性
docker compose exec rabbitmq2 ping rabbitmq1
# 重置节点
docker compose exec rabbitmq2 rabbitmqctl stop_app
docker compose exec rabbitmq2 rabbitmqctl reset
docker compose exec rabbitmq2 rabbitmqctl join_cluster rabbit@rabbitmq1
docker compose exec rabbitmq2 rabbitmqctl start_app7.4 数据持久化问题
问题表现:
重启后数据丢失
解决方案:
yaml
volumes:
- rabbitmq_data:/var/lib/rabbitmq
# 或使用主机目录
volumes:
- ./data:/var/lib/rabbitmq7.5 时区问题
解决方案:
yaml
services:
rabbitmq:
image: rabbitmq:3.13-management
environment:
TZ: Asia/Shanghai
volumes:
- /etc/localtime:/etc/localtime:ro8. 验证方法
8.1 检查容器状态
bash
docker ps | grep rabbitmq
docker compose ps
docker inspect rabbitmq | grep -A 10 "Health"8.2 检查服务状态
bash
docker compose exec rabbitmq rabbitmqctl status
docker compose exec rabbitmq rabbitmqctl node_health_check8.3 检查集群状态
bash
docker compose exec rabbitmq1 rabbitmqctl cluster_status
docker compose exec rabbitmq1 rabbitmqctl list_nodes8.4 连接测试
bash
# HTTP API 测试
curl -u admin:admin123 http://localhost:15672/api/overview
# 端口测试
nc -zv localhost 5672
nc -zv localhost 156728.5 管理界面测试
bash
curl -I http://localhost:15672
# 或在浏览器访问
# http://localhost:156729. 常用命令速查
bash
# 启动
docker compose up -d
# 停止
docker compose down
# 重启
docker compose restart
# 查看日志
docker compose logs -f rabbitmq
# 进入容器
docker compose exec rabbitmq bash
# 执行 rabbitmqctl 命令
docker compose exec rabbitmq rabbitmqctl status
docker compose exec rabbitmq rabbitmqctl list_users
docker compose exec rabbitmq rabbitmqctl list_queues
docker compose exec rabbitmq rabbitmqctl list_exchanges
# 插件管理
docker compose exec rabbitmq rabbitmq-plugins list
docker compose exec rabbitmq rabbitmq-plugins enable <plugin_name>
docker compose exec rabbitmq rabbitmq-plugins disable <plugin_name>
# 用户管理
docker compose exec rabbitmq rabbitmqctl add_user <username> <password>
docker compose exec rabbitmq rabbitmqctl set_user_tags <username> administrator
docker compose exec rabbitmq rabbitmqctl set_permissions -p / <username> ".*" ".*" ".*"
docker compose exec rabbitmq rabbitmqctl delete_user <username>
# 集群管理
docker compose exec rabbitmq1 rabbitmqctl cluster_status
docker compose exec rabbitmq1 rabbitmqctl stop_app
docker compose exec rabbitmq1 rabbitmqctl join_cluster rabbit@rabbitmq2
docker compose exec rabbitmq1 rabbitmqctl start_app