如何用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

到这里我已经完成了

相关推荐
海雅达手持终端PDA3 天前
工业手持终端的“去手机化”演进:看海雅达如何以“同轴扫摄”终结工程妥协,重塑工业PDA新范式
android·物联网·智能手机·硬件工程·能源·制造·iot
电子科技圈3 天前
芯科科技2026年Tech Talks技术系列讲座再增添全新主题共探无线SoC架构演进与安全合规
科技·嵌入式硬件·mcu·物联网·安全·架构·iot
Y003 天前
KNX 照明系统原理与 基于 KNX.net 的开发示例:从组地址到开关灯
iot·knx
voipmaker3 天前
GB28181 对接踩坑实录:注册不上、目录不全、流卡顿,一次说清(附 2022 版变更清单)
物联网·音视频·实时音视频·信息与通信·iot·gb28181·国标gb28181
TDengine (老段)4 天前
TDengine IDMP 十大实用功能(3)
大数据·数据库·物联网·时序数据库·iot·tdengine·涛思数据
IT规划师5 天前
MQTT实战 - MQTT高频面试题 + 我的8年实战答案(十一)
物联网·mqtt·面试·.net core·iot·mqttnet
Flynn Liang6 天前
物联网时序数据乱序问题全链路治理:从设备到存储的五层实战(附 Flink/Kafka/IoTDB 配置级代码)
flink·kafka·iot·iotdb·emqx·乱序·时序数据
Keith Guo7 天前
What does device twin mean in azure cloud?
azure·iot