如何用docker安装一个MQTT 服务器?

为什么用docker安装?因为服务器上已经安装了一个MQTT服务器?想在要安装一个供另一个程序使用,或者做测试。 感觉用docker会更干净。

本文由AI辅助整理,亲测有效。

下面以 Ubuntu 24.04 + Docker Compose 为例,部署一套支持账号密码认证、数据持久化、自动重启的 MQTT 服务。

一、创建项目目录

bash 复制代码
mkdir -p ~/docker/mosquitto/{config,data,log}
cd ~/docker/mosquitto

最终目录结构:

bash 复制代码
mosquitto/
├── docker-compose.yml
├── config/
│   ├── mosquitto.conf
│   └── passwd
├── data/
└── log/

二、创建配置文件

创建 config/mosquitto.conf:

bash 复制代码
nvim config/mosquitto.conf

写入

bash 复制代码
# MQTT TCP 端口
listener 1883
protocol mqtt

# 禁止匿名连接
allow_anonymous false

# 用户名密码认证
password_file /mosquitto/config/passwd

# 数据持久化
persistence true
persistence_location /mosquitto/data/
autosave_interval 300

# 日志
log_dest stdout

# 日志类型
log_type error
log_type warning
log_type notice
log_type information

这里使用 UTC 时间,容器内通过 TZ=UTC 设置时区。

三、创建 Docker Compose 文件

创建 docker-compose.yml:

bash 复制代码
services:
  mosquitto:
    image: eclipse-mosquitto:2.1.2-alpine
    container_name: mosquitto
    restart: unless-stopped

    ports:
      - "1884:1883"

    environment:
      TZ: UTC

    volumes:
      - ./config:/mosquitto/config:ro
      - ./data:/mosquitto/data
      - ./log:/mosquitto/log

这里固定使用 Mosquitto 2.1.2,而不是 latest,避免未来自动获取新版本时出现兼容性问题。该版本标签已在官方 Docker 镜像列表中列出。

注意这里的端口映射,修改成自己的想要的。

bash 复制代码
- "1884:1883"

四、创建 MQTT 账号密码

假设创建:

  • 用户名:aqua-sense
  • 密码:执行命令时自行输入
    先调整目录权限。官方镜像中的 Mosquitto 用户 UID/GID 为 1883。
bash 复制代码
sudo chown -R 1883:1883 data log

创建密码文件:

bash 复制代码
docker run --rm -it \
  -v "$PWD/config:/mosquitto/config" \
  eclipse-mosquitto:2.1.2-alpine \
  mosquitto_passwd -c /mosquitto/config/passwd aqua-sense

命令执行后会提示输入密码。

再设置密码文件的权限:

bash 复制代码
sudo chown 1883:1883 config/passwd
sudo chmod 640 config/passwd

注意:mosquitto_passwd 会加密哈希保存密码,不会直接保存明文。以后添加其他用户时,不要加 -c,否则可能覆盖原来的账号文件。

五、启动 MQTT 服务器

bash 复制代码
docker compose up -d

查看容器:

bash 复制代码
docker compose ps

查看运行日志:

bash 复制代码
docker compose logs -f mosquitto

正常情况下会看到 MQTT 服务监听 1884 端口。

我这里看日志报错了:

bash 复制代码
osquitto  | 1791787204: password-file: Error: Unable to open pwfile "/mosquitto/config/passwd".
mosquitto  | 1791787204: mosquitto version 2.1.2 terminating
mosquitto  | 1791787204: Saving in-memory database to /mosquitto/data//mosquitto.db.
mosquitto  | 1791787204: Restored 0 clients

解决办法

在当前目录 ~/docker/mosquitto 下执行:

  1. 修改文件所有者
bash 复制代码
chown 1883:1883 config/passwd
  1. 修改文件权限
bash 复制代码
chmod 640 config/passwd
  1. 重启容器
bash 复制代码
docker compose restart mosquitto
  1. 查看日志
bash 复制代码
docker compose logs --tail=30 mosquitto

正常情况下应该看到:

mosquitto version 2.1.2 running

到这里我已经完成了

相关推荐
会周易的程序员2 天前
STVM OSAL 层设计方案
物联网·iot·软plc·iec61131·stvm·open plc
会周易的程序员2 天前
STVM OSAL 层架构设计文档
c++·物联网·嵌入式·虚拟机·iot·软plc·iec61131
Bruce_Liuxiaowei2 天前
内网“影子资产“:串口服务器安全盲区剖析
服务器·网络·安全·iot
智码看视界3 天前
Edge AI 全栈实战 ⑤:云边协同收尾——MQTT 桥接 + 云端看板管 N 台边缘设备
mqtt·flask·iot·全栈开发·云边协同·edgeai
令狐少侠20113 天前
centos7 下,使用docker 部署IOT 调试平台,ThingsBoard 并完美启动
java·spring boot·iot
黑妹天下第一乖4 天前
小智改造实战解读-首 token 延迟去哪了:云端与端侧大模型的分段对照
开发语言·人工智能·python·嵌入式硬件·自然语言处理·iot
黑妹天下第一乖5 天前
第09讲 · 多媒体与音频 SDK:硬件编解码与端侧语音
人工智能·嵌入式硬件·深度学习·机器人·音视频·iot
请输入蚊子5 天前
CVE-2026-8260 D-Link DCS-935L缓冲区溢出漏洞 复现
网络·安全·web安全·iot
K成长日志5 天前
BLE Host层L2CAP--数据包格式
网络·物联网·无线通信·蓝牙·iot·ble