- 物联网
- 消息队列
- 后端
- 网络/通信
【免费下载链接】mosquitto
Eclipse Mosquitto - An open source MQTT broker
本指南以仓库中 docker/1.5-openssl/README.md 为主线,系统讲解 Eclipse Mosquitto 1.5 系列官方 Docker 镜像(OpenSSL 构建变体)的镜像构成、目录与卷布局、运行身份、自定义配置挂载、非默认端口暴露,以及持久化与文件日志的完整配置方法。读完本文,你将能够直接运行一个配置可挂载、数据可持久化、日志可落盘的 Mosquitto 1.5 容器,并理解其构建与权限设计的底层原理。
镜像定位:1.5 系列中的 OpenSSL 变体
在仓库的 docker/README.md 中明确说明:1.5目录对应 Mosquitto 1.5 分支版本,默认使用libressl;而1.5-openssl目录与它"identical except"——唯一差异是改用openssl作为 TLS 实现,并额外启用TLS-PSK(预共享密钥)支持。因此本文档对应的镜像是一个面向需要 OpenSSL 生态(如依赖特定 OpenSSL 版本特性、习惯 OpenSSL 命令行的运维场景)的官方变体。
从 docker/1.5-openssl/Dockerfile 可以看到镜像的版本锚点:
ENV VERSION=1.5.11 \ DOWNLOAD_SHA256=4a3b8a8f5505d27a7a966dd68bfd76f1e69feb51796d1b46b7271d1bb5a1a299 \ GPG_KEYS=A0D6EEA1DCAE49A635A3B2F0779B22DFB3E717B7 \ LWS_VERSION=4.2.1 \ LWS_SHA256=842da21f73ccba2be59e680de10a8cce7928313048750eb6ad73b6fa50763c51- 基础镜像为
alpine:3.18; - 内置 Mosquitto 版本固定为1.5.11;
- WebSocket 支持依赖静态构建的libwebsockets 4.2.1。
与 1.5 系列另一个变体的构建差异可从 docker/1.5/Dockerfile 对照看出:非 openssl 版本安装的是libressl-dev且编译参数为WITH_TLS_PSK=no,而本镜像使用openssl-dev并保留 TLS-PSK 能力,这也是两个镜像唯一的实质区别。
从发布 tarball 构建:校验链设计
镜像不是从仓库源码构建,而是"build as source from published tarballs"(从官方发布包构建)。Dockerfile 的关键步骤体现了供应链校验:
- 下载
mosquitto-1.5.11.tar.gz,用DOWNLOAD_SHA256做 SHA-256 校验(Dockerfile); - 下载同名
.asc签名文件,从多个密钥服务器获取维护者 GPG 公钥(A0D6EEA1DCAE49A635A3B2F0779B22DFB3E717B7)并执行gpg --batch --verify签名验证(Dockerfile),任一密钥服务器失败即构建中止。
编译时启用的特性包括WITH_WEBSOCKETS=yes、WITH_SHARED_LIBRARIES=yes、WITH_STRIP=yes,关闭了WITH_ADNS、WITH_DOCS、WITH_SRV。最终装入镜像的二进制有:/usr/sbin/mosquitto、/usr/bin/mosquitto_pub、/usr/bin/mosquitto_sub、/usr/bin/mosquitto_passwd,以及客户端库/usr/lib/libmosquitto.so.1——也就是说,容器内既可以直接跑 broker,也可以顺手执行mosquitto_pub/mosquitto_sub做连通性自测。
容器内目录布局:挂载点与卷
文档定义了三个核心路径,其中/mosquitto/config是配置挂载点,/mosquitto/data与/mosquitto/log是两个持久化卷:
/mosquitto/config /mosquitto/data /mosquitto/log它们在 Dockerfile 中通过mkdir -p /mosquitto/config /mosquitto/data /mosquitto/log创建,并在 Dockerfile 中声明为卷:
VOLUME ["/mosquitto/data", "/mosquitto/log"]注意:VOLUME只声明/mosquitto/data与/mosquitto/log为匿名卷;而/mosquitto/config是普通挂载点,官方建议你在运行时以-v显式挂载配置。镜像默认命令(Dockerfile)为:
COPY docker-entrypoint.sh / EXPOSE 1883 ENTRYPOINT ["/docker-entrypoint.sh"] CMD ["/usr/sbin/mosquitto", "-c", "/mosquitto/config/mosquitto.conf"]即容器启动后直接以/mosquitto/config/mosquitto.conf作为配置文件启动 broker。构建时 Dockerfile 已将发行包自带的mosquitto.conf安装到该路径,因此在未挂载任何配置的情况下,容器会使用默认配置值运行——这就是 README 中"When creating a container from the image, the default configuration values are used"的实际来源。
入口脚本:root 权限下的属主修复
镜像的入口是 docker-entrypoint.sh,脚本逻辑极简:
#!/bin/ash set -e user="$(id -u)" if [ "$user" = '0' ]; then [ -d "/mosquitto" ] && chown -R mosquitto:mosquitto /mosquitto || true fi exec "$@"其作用是:当容器以root启动时,将/mosquitto及其子目录(config/data/log)递归chown给 mosquitto 用户;随后exec "$@"替换为mosquitto -c ...进程。这一设计的价值在于:当你把宿主机目录挂载进/mosquitto/data或/mosquitto/log时,挂载卷的属主会被修正为容器内 broker 运行用户,避免因权限不匹配导致无法写数据或写日志。若以非 root 用户运行容器,则跳过该步骤。
运行身份:uid/gid 均为 1883
文档明确:镜像以mosquitto用户/组运行 broker,uid 和 gid 均为1883。这一数字刻意与 MQTT 默认端口 1883 保持一致,便于运维记忆。创建过程在 Dockerfile:
addgroup -S -g 1883 mosquitto 2>/dev/null && \ adduser -S -u 1883 -D -H -h /var/empty -s /sbin/nologin -G mosquitto -g mosquitto mosquitto 2>/dev/null该用户是系统用户(-S)、无登录 shell(/sbin/nologin)、无 home 目录,符合最小权限原则。配合 mosquitto.conf 中user mosquitto的降权机制(当以 root 启动时自动降权到指定用户),broker 全程以低权限身份运行。
对挂载卷的实操含义:如果你用-v /host/path:/mosquitto/data挂载宿主机目录,建议让宿主机目录的属主为 uid/gid 1883(例如chown 1883:1883 /host/path),或依赖入口脚本在 root 启动时自动修正属主。
使用自定义配置:挂载本地 mosquitto.conf
当默认配置不满足需求时,将宿主机上的本地配置文件挂载到容器的/mosquitto/config/mosquitto.conf,即可覆盖镜像内默认配置。文档给出的基础命令:
docker run -it -p 1883:1883 -v <absolute-path-to-configuration-file>:/mosquitto/config/mosquitto.conf eclipse-mosquitto:<version>要点拆解:
<absolute-path-to-configuration-file>必须是绝对路径,否则 Docker 的-v绑定挂载会解析失败;-p 1883:1883将容器内 1883 端口映射到宿主机;- 挂载目标必须是
/mosquitto/config/mosquitto.conf(与CMD中-c参数一致); eclipse-mosquitto:<version>中的<version>对应镜像标签,例如本镜像对应的1.5.11标签。
端口变更时的联动调整
文档特别以:boom:强调了一个极易踩坑的点:若修改了mosquitto.conf中的监听端口,docker run的-p暴露参数必须同步更新,否则容器内 broker 已在新端口监听,但宿主机未做端口映射,外部将无法访问。示例(新增 8080 端口的 WebSocket 监听):
docker run -it -p 1883:1883 -p 8080:8080 -v <absolute-path-to-configuration-file>:/mosquitto/config/mosquitto.conf eclipse-mosquitto:<version>从配置语义看,这对应 mosquitto.conf 中的listener port-number [ip address/host name/unix socket path]语法,例如:
listener 1883 listener 8080 protocol websockets启用数据持久化与文件日志
文档给出的推荐改造是在挂载配置中加入三行:
persistence true persistence_location /mosquitto/data/ log_dest file /mosquitto/log/mosquitto.logpersistence / persistence_location:落盘位置
persistence true:开启持久化,将内存数据库(订阅、飞行中的 QoS 1/2 消息、保留消息等)写入磁盘;persistence_location /mosquitto/data/:指定持久化数据库目录,恰好落在镜像声明的数据卷内。
对应 mosquitto.conf 的完整语义:持久化文件名默认是mosquitto.db(persistence_file mosquitto.db),默认每 1800 秒自动保存一次(autosave_interval 1800),也可通过SIGUSR1信号强制落盘。此外,persistence_location还支持通过环境变量MOSQUITTO_PERSISTENCE_LOCATION覆盖配置文件(若两者同时设置,环境变量优先),这在容器编排场景中颇为实用。
log_dest file:文件日志
log_dest file /mosquitto/log/mosquitto.log将日志写到/mosquitto/log/下的文件,而非默认的 stderr。对应 mosquitto.conf 中的说明:
log_dest可配置多个目标,支持stdout、stderr、syslog、topic、file、dlt等;file目标必须附带文件路径参数,且只能配置一个文件目标;- broker 收到 HUP 信号时会关闭并重新打开日志文件,便于配合
logrotate做日志轮转; - 可配合
log_type(error、warning、notice、information、subscribe、websockets等)与connection_messages true控制日志粒度。
卷数据的生命周期
文档末尾的 Note 是容器使用的关键纪律:任何挂载的卷,其数据在容器之间都是持久保留的。也就是说,即使删除并重建容器,只要复用同一卷(或重新挂载同一宿主机目录),持久化数据库与日志文件依然存在。这意味着:
- 升级镜像时,数据不会因容器重建而丢失;
- 反之,若不做持久化(不挂载卷、不开启 persistence),MQTT 订阅状态与保留消息会在容器删除后全部丢失。
验证思路与进一步资料
- 运行后可用容器内置客户端自测:
docker exec -it <container> mosquitto_sub -t '$SYS/#' -C 1,观察$SYS树是否持续更新($SYS的发布间隔由 mosquitto.conf 的sys_interval控制,默认 10 秒); - 查看数据持久化效果:进入容器检查
/mosquitto/data/mosquitto.db是否存在并持续增长; - 查看日志效果:
docker exec -it <container> tail -f /mosquitto/log/mosquitto.log; - 更完整的配置项说明可查阅 man/mosquitto.conf.5.xml(即
mosquitto.conf(5)手册页源码),持久化与日志相关配置的解析实现位于 src/conf.c。
小结
本文档对应的1.5-openssl镜像本质上是"1.5 系列 + OpenSSL/TLS-PSK"的官方变体,其使用模型围绕三个目录展开:/mosquitto/config承载可挂载的配置、/mosquitto/data承载持久化数据、/mosquitto/log承载文件日志;broker 以 uid/gid 1883 的 mosquitto 用户运行,入口脚本负责在 root 启动时修正挂载目录属主。只需牢记两条铁律——修改监听端口必须同步调整-p映射、卷数据在容器间持久保留——即可在生产环境中稳定地以容器方式运行 Mosquitto 1.5。
- 物联网
- 消息队列
- 后端
- 网络/通信
【免费下载链接】mosquitto
Eclipse Mosquitto - An open source MQTT broker
相关推荐
Eclipse Mosquitto 2.0 OpenSSL 版 Docker 镜像实战指南:配置挂载、认证授权与数据持久化
Eclipse Mosquitto 2.0 OpenSSL 版 Docker 镜像实战指南:配置挂载、认证授权与数据持久化 导读 本文以 docker/2.0
物联网消息队列后端网络/通信Eclipse Mosquitto 1.5 Docker 镜像使用指南:挂载点、用户权限与持久化配置
Eclipse Mosquitto 1.5 Docker 镜像使用指南:挂载点、用户权限与持久化配置 本文围绕 Mosquitto 仓库中 docker/1.5
物联网消息队列后端网络/通信Eclipse Mosquitto 2.1 Alpine Docker 镜像实战:配置挂载、认证授权与持久化指南
Eclipse Mosquitto 2.1 Alpine Docker 镜像实战:配置挂载、认证授权与持久化指南 Eclipse Mosquitto 官方 Do
后端消息队列消息路由
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考