Skip to content

Docker 部署

1. 概述

Docker 是部署 RabbitMQ 最便捷的方式之一,特别适合开发、测试和 CI/CD 环境。本章将详细介绍使用 Docker 和 Docker Compose 部署 RabbitMQ 的多种方式,包括单节点部署、集群部署和高可用配置。

2. 系统要求

2.1 Docker 版本要求

组件最低版本推荐版本
Docker Engine20.10+24.0+
Docker Compose2.0+2.20+

2.2 硬件资源建议

部署类型CPU内存磁盘
开发环境1 核1 GB5 GB
测试环境2 核2 GB10 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-management

3.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-management

3.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-management

3.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-management

4. 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_network

4.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: bridge

4.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 = 2048

enabled_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_SECRET

4.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_users

5. 集群部署

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: bridge

5.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_cluster

5.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_policies

6. 高级配置

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/rabbitmq

6.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 -d

7.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_app

7.4 数据持久化问题

问题表现

重启后数据丢失

解决方案

yaml
volumes:
  - rabbitmq_data:/var/lib/rabbitmq

# 或使用主机目录
volumes:
  - ./data:/var/lib/rabbitmq

7.5 时区问题

解决方案

yaml
services:
  rabbitmq:
    image: rabbitmq:3.13-management
    environment:
      TZ: Asia/Shanghai
    volumes:
      - /etc/localtime:/etc/localtime:ro

8. 验证方法

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_check

8.3 检查集群状态

bash
docker compose exec rabbitmq1 rabbitmqctl cluster_status
docker compose exec rabbitmq1 rabbitmqctl list_nodes

8.4 连接测试

bash
# HTTP API 测试
curl -u admin:admin123 http://localhost:15672/api/overview

# 端口测试
nc -zv localhost 5672
nc -zv localhost 15672

8.5 管理界面测试

bash
curl -I http://localhost:15672

# 或在浏览器访问
# http://localhost:15672

9. 常用命令速查

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

10. 相关链接