在 CentOS 7.9 上通过 Docker 安装 MQTT 服务,最常用且稳定的方案是使用 Eclipse Mosquitto(轻量级、开源的 MQTT broker,支持 MQTT 3.1/3.1.1/5.0 协议)。以下是 完整实操步骤,包括容器部署、权限配置、持久化、SSL 加密(可选)及测试验证,贴合生产环境需求。

一、前置条件

  1. 已完成 CentOS 7.9 上 Docker 的安装与配置(参考前文,确保 docker 命令可正常使用);
  2. 开放 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 图形化工具测试(推荐)

  1. 下载安装 MQTTX
  2. 新建连接,配置如下:
    • 名称:任意(如 CentOS-MQTT);
    • 协议:mqtt(非加密)或 mqtts(SSL 加密);
    • 服务器:CentOS 7.9 宿主机 IP(如 192.168.1.100);
    • 端口:1883(非加密)或 8883(SSL 加密);
    • 用户名 / 密码:mqtt_user / 123456
    • 若启用 SSL:在「高级」中选择「CA 证书」,上传宿主机的 ca.crt 文件;
  3. 点击「连接」,成功后创建订阅(主题 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”

  • 原因:用户名 / 密码错误,或密码文件路径配置错误;
  • 解决:
    1. 确认密码文件路径:mosquitto.conf 中 password_file 配置为 /mosquitto/conf/passwd(容器内路径);
    2. 重新生成密码:docker exec -it mosquitto mosquitto_passwd -c /mosquitto/conf/passwd mqtt_user(覆盖旧密码);
    3. 重启容器:docker restart mosquitto

4. SSL 连接失败,提示 “SSL handshake failed”

  • 原因:CA 证书配置错误,或客户端未指定 CA 证书;
  • 解决:
    1. 确认 mosquitto.conf 中 cafilecertfilekeyfile 路径正确;
    2. 客户端连接时必须指定 CA 证书(如 MQTTX 中上传 ca.crt);
    3. 检查证书 Common Name 是否与服务器 IP / 域名一致。

总结

在 CentOS 7.9 上通过 Docker 部署 MQTT 服务的核心流程:

  1. 挂载宿主机目录,实现配置 / 数据 / 日志持久化;
  2. 启动 Mosquitto 容器,映射 1883(非加密)/8883(SSL 加密)端口;
  3. 生产环境启用密码认证(关闭匿名访问)和 SSL 加密,提升安全性;
  4. 通过 MQTTX 或命令行工具测试发布 / 订阅功能,验证服务可用性。

该方案轻量、易维护,支持横向扩展(如集群部署),可满足物联网、消息通知等场景的 MQTT 通信需求。

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐