为什么用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 下执行:
- 修改文件所有者
bash
chown 1883:1883 config/passwd
- 修改文件权限
bash
chmod 640 config/passwd
- 重启容器
bash
docker compose restart mosquitto
- 查看日志
bash
docker compose logs --tail=30 mosquitto
正常情况下应该看到:
mosquitto version 2.1.2 running
到这里我已经完成了