Docker 安装 RabbitMQ

前言

特别注意

RabbitMQ 的数据库名称规则是 NODENAME@hostname,由于 Docker 每次从 Docker Image 启动容器的时候会自动生成 hostname,这样一来之前保存在主机上的数据库就会没用了,包括之前创建的用户也会没有了。所以在创建容器的时候必须指定 hostname,比如 --hostname=my-rabbit,这样 Docker 环境启动后 RabbitMQ 就会一直读取固定目录中的数据。

Docker 安装

快速启动

1
docker run -d --hostname my-rabbit --name some-rabbit rabbitmq:3.8.14

这将启动一个 RabbitMQ 容器,默认监听端口为 5672。如果等待一分钟的时间,Docker 容器会输出以下的日志信息:

1
2
# 查看容器的日志信息
docker logs -f -n 100 some-rabbit
1
2
3
4
5
6
7
8
=INFO REPORT==== 6-Jul-2015::20:47:02 ===
node : rabbit@my-rabbit
home dir : /var/lib/rabbitmq
config file(s) : /etc/rabbitmq/rabbitmq.config
cookie hash : UoNOcDhfxW9uoZ92wh6BjA==
log : tty
sasl log : tty
database dir : /var/lib/rabbitmq/mnesia/rabbit@my-rabbit

指定 vhost

通过 RABBITMQ_DEFAULT_VHOST 环境变量来指定 vhost,然后启动 RabbitMQ 容器。

1
docker run -d --hostname my-rabbit --name some-rabbit -e RABBITMQ_DEFAULT_VHOST=my_vhost rabbitmq:3.8.14

开启控制台管理

开启 RabbitMQ 的控制台管理功能后,浏览器可以通过 http://localhost:15672 来访问 RabbitMQ 的 Web 控制台页面,登录的默认用户名和密码为 guest / guest

1
docker run -d --hostname my-rabbit --name some-rabbit -p 15672:15672 rabbitmq:3.8.14-management

提示

在上面的 Docker 命令中,rabbitmq:3.8.14-management 是镜像的完整名称,其中 3.8.14 是镜像的版本号,可以按实际需要指定其他版本号。

指定用户名和密码

通过 RABBITMQ_DEFAULT_USERRABBITMQ_DEFAULT_PASS 环境变量来指定 RabbitMQ 的 Web 控制台的用户名和密码,然后启动 RabbitMQ 容器。

1
docker run -d --hostname my-rabbit --name some-rabbit -e RABBITMQ_DEFAULT_USER=user -e RABBITMQ_DEFAULT_PASS=password -p 15672:15672 rabbitmq:3.8.14-management

指定用户名和密码启动容器后,浏览器可以通过 http://localhost:15672 来访问 RabbitMQ 的 Web 控制台页面。

指定启用的插件列表

首先在宿主机创建插件列表的配置文件 enabled_plugins,然后将需要启用的插件列表写入配置文件中,比如:

1
[rabbitmq_federation_management,rabbitmq_management,rabbitmq_mqtt,rabbitmq_stomp].

然后在启动 RabbitMQ 容器时,将宿主机内的插件配置文件挂载到容器内部的 /etc/rabbitmq/enabled_plugins 位置

1
docker run -d --hostname my-rabbit -v /usr/local/rabbitmq/enabled_plugins:/etc/rabbitmq/enabled_plugins --name some-rabbit rabbitmq:3.8.14

Docker-Compose 安装

创建配置文件

创建 docker-compose.yml 配置文件并写入以下内容,其中 RABBITMQ_DEFAULT_USER 为用户名,RABBITMQ_DEFAULT_PASS 为用户密码,5672 为 RabbitMQ 的服务端口,15672 为 RabbitMQ 的 Web 控制台的端口。RabbitMQ 的 Web 控制台默认是未启用的,若需启用 Web 控制台的功能,可以挂载对应的配置文件到容器内的 /etc/rabbitmq/enabled_plugins,而配置文件的内容为 RabbitMQ 启用的插件列表。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
version: '3.5'

services:
rabbitmq:
image: rabbitmq:3.8.14
container_name: some-rabbit
hostname: my-rabbit
privileged: false
restart: always
environment:
- RABBITMQ_DEFAULT_VHOST=/
- RABBITMQ_DEFAULT_USER=user
- RABBITMQ_DEFAULT_PASS=password
ports:
- 5672:5672
- 15672:15672
volumes:
- '/usr/local/rabbitmq/enabled_plugins:/etc/rabbitmq/enabled_plugins'

若需要指定 RabbitMQ 容器使用静态 IP 地址,可以参考以下配置内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
version: '3.5'

services:
rabbitmq:
image: rabbitmq:3.8.14
container_name: some-rabbit
hostname: my-rabbit
privileged: false
restart: always
networks:
rabbitmq-network:
ipv4_address: 172.175.0.5
environment:
- RABBITMQ_DEFAULT_VHOST=/
- RABBITMQ_DEFAULT_USER=user
- RABBITMQ_DEFAULT_PASS=password
ports:
- 5672:5672
- 15672:15672
volumes:
- '/usr/local/rabbitmq/enabled_plugins:/etc/rabbitmq/enabled_plugins'

networks:
rabbitmq-network:
name: rabbitmq-network
driver: bridge
ipam:
config:
- subnet: 172.175.0.0/24

上述挂载的 /usr/local/rabbitmq/enabled_plugins 插件配置文件的内容如下:

1
[rabbitmq_federation_management,rabbitmq_management,rabbitmq_mqtt,rabbitmq_stomp].

启动容器

使用以下命令来创建并启动 RabbitMQ 容器,浏览器可以通过 http://localhost:15672 来访问 RabbitMQ 的 Web 控制台页面。

1
2
3
4
5
6
7
8
# 创建并启动 RabbitMQ 容器
docker-compose up -d

# 查看 RabbitMQ 容器的运行状态
docker-compose ps

# 查看 RabbitMQ 容器的运行日志
docker logs some-rabbit

常见问题

如果在登录 RabbitMQ 的 Web 控制台后,Web 页面提示以下的警告信息:

1
Stats in management UI are disabled on this node

首先在宿主机内创建 management_agent.disable_metrics_collector.conf 配置文件

1
touch management_agent.disable_metrics_collector.conf

然后往宿主机内的配置文件写入以下内容

1
management_agent.disable_metrics_collector = false

然后将宿主机内的配置文件挂载到 RabbitMQ 容器内的 /etc/rabbitmq/conf.d/management_agent.disable_metrics_collector.conf 位置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
version: '3.5'

services:
rabbitmq:
image: rabbitmq:3.8.14
container_name: some-rabbit
hostname: my-rabbit
privileged: false
restart: always
environment:
- RABBITMQ_DEFAULT_VHOST=/
- RABBITMQ_DEFAULT_USER=user
- RABBITMQ_DEFAULT_PASS=password
ports:
- 5672:5672
- 15672:15672
volumes:
- '/usr/local/rabbitmq/enabled_plugins:/etc/rabbitmq/enabled_plugins'
- '/usr/local/rabbitmq/management_agent.disable_metrics_collector.conf:/etc/rabbitmq/conf.d/management_agent.disable_metrics_collector.conf'