docker部署mqtt之Mosquitto
本文详细介绍了在CentOS7.9系统上通过Docker部署MQTT服务的完整流程。主要内容包括:使用Eclipse Mosquitto镜像创建容器,配置持久化存储和端口映射;设置MQTT基础配置,支持匿名访问或密码认证;可选SSL加密配置步骤;以及使用MQTTX工具或命令行进行服务测试的方法。文章还提供了容器管理命令、常见问题排查方案,特别强调了生产环境中启用密码认证和SSL加密的重要性。该方案
在 CentOS 7.9 上通过 Docker 安装 MQTT 服务,最常用且稳定的方案是使用 Eclipse Mosquitto(轻量级、开源的 MQTT broker,支持 MQTT 3.1/3.1.1/5.0 协议)。以下是 完整实操步骤,包括容器部署、权限配置、持久化、SSL 加密(可选)及测试验证,贴合生产环境需求。
一、前置条件
- 已完成 CentOS 7.9 上 Docker 的安装与配置(参考前文,确保
docker命令可正常使用); - 开放 MQTT 常用端口(默认 1883 非加密端口,8883 SSL 加密端口),若防火墙未关闭:
bash
运行
# 放行 1883(非加密)和 8883(SSL 加密)端口 sudo firewall-cmd --permanent --add-port=1883/tcp sudo firewall-cmd --permanent --add-port=8883/tcp # 重新加载防火墙规则 sudo firewall-cmd --reload
二、Docker 部署 Mosquitto(MQTT 服务)
步骤 1:创建宿主机目录(持久化配置、数据、日志)
为避免容器删除后配置 / 数据丢失,需挂载宿主机目录到容器:
bash
运行
# 创建配置目录、数据目录、日志目录
mkdir -p /data/mosquitto/{conf,data,log}
# 设置目录权限(避免容器内权限不足)
chmod -R 777 /data/mosquitto/
步骤 2:编写 Mosquitto 配置文件
在宿主机配置目录下创建 mosquitto.conf 核心配置文件,支持 匿名访问 / 密码认证、持久化、日志等功能:
bash
运行
vim /data/mosquitto/conf/mosquitto.conf
写入以下配置(按需调整,注释已说明用途):
ini
# 基础配置
pid_file /var/run/mosquitto.pid
# 日志配置(输出到文件+控制台,级别 debug 便于调试,生产可改为 info)
log_dest file /mosquitto/log/mosquitto.log
log_dest stdout
log_level debug
# 持久化配置(消息持久化到磁盘,容器重启后不丢失)
persistence true
persistence_location /mosquitto/data/
# 允许匿名访问(默认开启,测试环境用;生产环境建议关闭,启用密码认证)
allow_anonymous true
# 密码文件路径(启用密码认证时需配置)
password_file /mosquitto/conf/passwd
# 监听端口(默认 1883 非加密端口)
listener 1883
# 允许远程访问(默认允许,无需额外配置)
# 可选:配置 SSL 加密端口(8883,需后续准备证书)
# listener 8883
# cafile /mosquitto/conf/ca.crt # CA 根证书
# certfile /mosquitto/conf/server.crt # 服务器证书
# keyfile /mosquitto/conf/server.key # 服务器私钥
步骤 3:启动 Mosquitto 容器
通过 docker run 命令启动容器,挂载宿主机目录、映射端口:
bash
运行
docker run -d \
--name mosquitto \
-p 1883:1883 \ # 映射非加密端口
-p 8883:8883 \ # 映射 SSL 加密端口(若配置了 SSL 则启用)
-v /data/mosquitto/conf:/mosquitto/conf \ # 挂载配置目录
-v /data/mosquitto/data:/mosquitto/data \ # 挂载数据目录
-v /data/mosquitto/log:/mosquitto/log \ # 挂载日志目录
--restart=always \ # 容器随 Docker 自动启动(生产必备)
eclipse-mosquitto:2.0.18 # 推荐稳定版本(可替换为 latest)
步骤 4:验证容器启动状态
bash
运行
# 查看容器运行状态(输出 active 则正常)
docker ps | grep mosquitto
# 查看容器日志(确认无报错)
docker logs -f mosquitto
成功日志示例:
plaintext
172.17.0.1:1883 ready
mosquitto version 2.0.18 starting
Config loaded from /mosquitto/conf/mosquitto.conf
三、核心配置优化(生产环境必备)
1. 启用密码认证(关闭匿名访问)
默认配置允许匿名访问(allow_anonymous true),生产环境需禁用并配置用户名密码:
步骤 1:生成密码文件
通过 Mosquitto 容器内置工具 mosquitto_passwd 创建用户(如用户名 mqtt_user):
bash
运行
# 进入容器执行密码生成命令(-c 表示创建新文件,仅第一次使用)
docker exec -it mosquitto mosquitto_passwd -c /mosquitto/conf/passwd mqtt_user
# 按提示输入密码(如 123456),重复确认
- 若需添加多个用户,去掉
-c参数:bash
运行
docker exec -it mosquitto mosquitto_passwd /mosquitto/conf/passwd mqtt_user2 - 若需删除用户:
bash
运行
docker exec -it mosquitto mosquitto_passwd -D /mosquitto/conf/passwd mqtt_user2
步骤 2:修改配置文件,关闭匿名访问
bash
运行
vim /data/mosquitto/conf/mosquitto.conf
将 allow_anonymous true 改为 allow_anonymous false,保存退出后重启容器:
bash
运行
docker restart mosquitto
2. 配置 SSL 加密(可选,提升安全性)
MQTT 默认传输不加密,敏感数据需通过 SSL/TLS 加密(端口 8883),需准备 SSL 证书(自签名或第三方证书,如 Let's Encrypt)。
步骤 1:生成自签名证书(测试环境用)
通过 openssl 生成 CA 根证书、服务器证书和私钥,保存到宿主机配置目录:
bash
运行
# 进入配置目录
cd /data/mosquitto/conf
# 1. 生成 CA 根证书(有效期 3650 天)
openssl genrsa -out ca.key 2048
openssl req -x509 -new -nodes -key ca.key -sha256 -days 3650 -out ca.crt
# 按提示输入信息(国家、组织、Common Name 等,可随意填写)
# 2. 生成服务器私钥和证书签名请求(CSR)
openssl genrsa -out server.key 2048
openssl req -new -key server.key -out server.csr
# 注意:Common Name 需填写 MQTT 服务器的 IP 或域名(如 192.168.1.100)
# 3. 用 CA 根证书签名服务器 CSR,生成服务器证书
openssl x509 -req -in server.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out server.crt -days 3650 -sha256
步骤 2:启用 SSL 配置
编辑 mosquitto.conf,取消 SSL 相关注释并配置证书路径:
ini
# 启用 8883 SSL 端口
listener 8883
# 配置证书(路径为容器内路径,因已挂载宿主机目录,对应 /mosquitto/conf/)
cafile /mosquitto/conf/ca.crt
certfile /mosquitto/conf/server.crt
keyfile /mosquitto/conf/server.key
重启容器生效:
bash
运行
docker restart mosquitto
四、MQTT 服务测试验证
需使用 MQTT 客户端工具测试发布 / 订阅功能,推荐 MQTTX(图形化工具,支持 Windows/macOS/Linux)或 mosquitto_sub/mosquitto_pub(命令行工具)。
方法 1:使用容器内置命令行工具测试
步骤 1:启动订阅者(订阅 test/topic 主题)
打开终端 1,执行以下命令(需密码认证时添加 -u 和 -P 参数):
bash
运行
# 非加密端口订阅(带密码)
docker exec -it mosquitto mosquitto_sub -h localhost -p 1883 -t "test/topic" -u mqtt_user -P 123456
# 若启用 SSL 加密,订阅 8883 端口(--cafile 指定 CA 证书)
# docker exec -it mosquitto mosquitto_sub -h localhost -p 8883 -t "test/topic" -u mqtt_user -P 123456 --cafile /mosquitto/conf/ca.crt
步骤 2:启动发布者(向 test/topic 主题发布消息)
打开终端 2,执行以下命令发布消息:
bash
运行
# 非加密端口发布消息(带密码)
docker exec -it mosquitto mosquitto_pub -h localhost -p 1883 -t "test/topic" -u mqtt_user -P 123456 -m "Hello MQTT from Docker!"
# SSL 加密端口发布(--cafile 指定 CA 证书)
# docker exec -it mosquitto mosquitto_pub -h localhost -p 8883 -t "test/topic" -u mqtt_user -P 123456 --cafile /mosquitto/conf/ca.crt -m "Hello MQTT (SSL)!"
验证结果
终端 1(订阅者)会收到终端 2(发布者)发送的消息,说明 MQTT 服务正常工作。
方法 2:使用 MQTTX 图形化工具测试(推荐)
- 下载安装 MQTTX;
- 新建连接,配置如下:
- 名称:任意(如
CentOS-MQTT); - 协议:
mqtt(非加密)或mqtts(SSL 加密); - 服务器:CentOS 7.9 宿主机 IP(如
192.168.1.100); - 端口:
1883(非加密)或8883(SSL 加密); - 用户名 / 密码:
mqtt_user/123456; - 若启用 SSL:在「高级」中选择「CA 证书」,上传宿主机的
ca.crt文件;
- 名称:任意(如
- 点击「连接」,成功后创建订阅(主题
test/topic),再发布消息,即可看到消息接收成功。
五、Mosquitto 容器管理常用命令
bash
运行
# 启动容器
docker start mosquitto
# 停止容器
docker stop mosquitto
# 重启容器(修改配置后需执行)
docker restart mosquitto
# 查看容器日志(实时跟踪)
docker logs -f mosquitto
# 进入容器终端
docker exec -it mosquitto /bin/sh
# 备份配置和数据(复制宿主机目录)
cp -r /data/mosquitto /data/mosquitto_backup
# 升级容器(拉取新版本镜像后重启)
docker pull eclipse-mosquitto:2.0.18
docker stop mosquitto && docker rm mosquitto
# 重新执行启动命令(保持挂载和端口映射不变)
六、常见问题排查
1. 容器启动失败,日志提示 “Permission denied”
- 原因:宿主机
/data/mosquitto目录权限不足,容器内无法读写; - 解决:重新设置目录权限:
bash
运行
chmod -R 777 /data/mosquitto/ docker restart mosquitto
2. 客户端连接失败,提示 “Connection Refused”
- 检查容器是否启动:
docker ps | grep mosquitto(未启动则docker start mosquitto); - 检查端口是否占用:
netstat -tulpn | grep 1883(若被占用,修改宿主机映射端口,如-p 1884:1883); - 检查防火墙是否放行端口:
sudo firewall-cmd --list-ports(确保 1883/8883 已放行)。
3. 启用密码认证后,客户端连接提示 “Connection Refused: not authorized”
- 原因:用户名 / 密码错误,或密码文件路径配置错误;
- 解决:
- 确认密码文件路径:
mosquitto.conf中password_file配置为/mosquitto/conf/passwd(容器内路径); - 重新生成密码:
docker exec -it mosquitto mosquitto_passwd -c /mosquitto/conf/passwd mqtt_user(覆盖旧密码); - 重启容器:
docker restart mosquitto。
- 确认密码文件路径:
4. SSL 连接失败,提示 “SSL handshake failed”
- 原因:CA 证书配置错误,或客户端未指定 CA 证书;
- 解决:
- 确认
mosquitto.conf中cafile、certfile、keyfile路径正确; - 客户端连接时必须指定 CA 证书(如 MQTTX 中上传
ca.crt); - 检查证书 Common Name 是否与服务器 IP / 域名一致。
- 确认
总结
在 CentOS 7.9 上通过 Docker 部署 MQTT 服务的核心流程:
- 挂载宿主机目录,实现配置 / 数据 / 日志持久化;
- 启动 Mosquitto 容器,映射 1883(非加密)/8883(SSL 加密)端口;
- 生产环境启用密码认证(关闭匿名访问)和 SSL 加密,提升安全性;
- 通过 MQTTX 或命令行工具测试发布 / 订阅功能,验证服务可用性。
该方案轻量、易维护,支持横向扩展(如集群部署),可满足物联网、消息通知等场景的 MQTT 通信需求。
魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐
所有评论(0)