ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Eclipse Mosquitto 本地 Docker 镜像构建与容器化部署指南:从源码 tar 包到 MQTT Broker

Eclipse Mosquitto 本地 Docker 镜像构建与容器化部署指南:从源码 tar 包到 MQTT Broker 后端消息队列消息路由【免费下载链接】mosquittoEclipse Mosquitto - An open source MQTT broker项目地址https://gitcode.com/gh_mirrors/mos/mosquitto点击查看免费下载本指南围绕仓库中docker/local目录对应的 Eclipse Mosquitto 本地 Docker 镜像方案展开讲解如何通过一条make localdocker命令把当前工作区源码打包成mosq.tar.gz并构建出名为eclipse-mosquitto:local的镜像以及如何利用该镜像的挂载点、数据卷、用户模型与自定义配置完成容器化部署。读完本文你将掌握 Mosquitto Docker 镜像的内部目录约定/mosquitto/config、/mosquitto/data、/mosquitto/log、uid/gid 1883 的用户体系以及通过挂载自定义mosquitto.conf实现端口调整、持久化与日志落盘的具体做法。一、docker/local 目录定位基于当前源码的本地镜像docker/local是 Eclipse Mosquitto 仓库中一类特殊的 Docker 构建目录。与基于官方发布 tarball 的generic目录不同它构建的镜像直接取材于当前工作区内的源码因此非常适合在开发、调试 Mosquitto 或验证未发布改动时使用。其核心约定记录在 docker/local/README.md 中构建镜像所需的源码以压缩包mosq.tar.gz形式放在docker/local目录下在仓库根目录执行make localdocker会自动生成该源码包并完成镜像构建。仓库根目录的 docker/README.md 也对这一用途做了说明Thelocaldirectory can be used to build an image based on the files in the working directory by usingmake localdockerfrom the root of the repository.local 目录可通过在仓库根目录运行make localdocker基于工作区中的文件构建镜像。二、构建流程make localdocker 做了什么在仓库根目录执行以下命令即可触发本地镜像构建make localdocker这条命令由根目录 Makefile 中的localdocker目标实现其实际执行步骤如下先执行reallyclean清理上一次构建产物保证源码包干净对DISTDIRS中列出的各个子目录分别执行make dist生成发布文件集合DISTFILES在临时目录dockertmp/中组织出mosquitto-${VERSION}/目录结构并打包为mosq.tar.gz将mosq.tar.gz复制到docker/local目录即 Dockerfile 中COPY mosq.tar.gz /tmp所引用的文件进入docker/local目录执行docker build并传入--build-arg VERSION${VERSION}最终镜像标签为eclipse-mosquitto:local。也就是说mosq.tar.gz并非预先存在于仓库中而是make localdocker的产物。如果你想手动复现也可以自行把当前源码按mosquitto-VERSION目录结构打包成mosq.tar.gz放到docker/local下再直接docker build。三、镜像内部结构从 Dockerfile 看构建与安装内容docker/local/Dockerfile完整定义了镜像的构建方式理解它能帮你判断镜像里有什么、能做什么。3.1 基础镜像与构建依赖镜像基于alpine:3.23构建阶段安装的依赖包括编译工具链build-base、cmake、linux-headers功能库开发头文件argon2-dev密码哈希、cjson-devJSON、libedit-dev命令行编辑、libmicrohttpd-devHTTP API、openssl-devTLS、sqlite-devSQLite 持久化、util-linux-dev辅助工具gnupg签名验证。构建完成后会删除这些build-deps只保留运行期依赖argon2-libs、ca-certificates、cjson、libedit、libmicrohttpd、sqlite-libs、tzdata时区数据从而控制镜像体积。3.2 编译选项构建时通过make ... binary目标编译 Mosquitto 主程序关键选项如下选项值含义WITH_WEBSOCKETSyes启用 WebSocket 支持WITH_SHARED_LIBRARIESyes构建共享库 libmosquittoWITH_STRIPyes剥离符号减小二进制体积WITH_DOCSno不构建文档WITH_SRVno禁用 DNS SRV 支持WITH_ADNSno禁用异步 DNS 解析CFLAGS含-DHTTP_API_DIR.../dashboard编译期注入 HTTP API 仪表盘目录3.3 安装到镜像中的组件构建完成后镜像内安装的关键可执行文件与库包括/usr/sbin/mosquittobroker 主程序容器默认命令/usr/bin/mosquitto_pub、mosquitto_sub、mosquitto_rrMQTT 命令行客户端工具/usr/bin/mosquitto_ctrl、mosquitto_passwd、mosquitto_signal管理、密码与信号控制工具/usr/lib/libmosquitto.so.1客户端共享库五个编译好的插件.somosquitto_acl_file.so、mosquitto_dynamic_security.so、mosquitto_password_file.so、mosquitto_persist_sqlite.so、mosquitto_sparkplug_aware.so分别对应仓库中的 acl-file、dynamic-security、password-file、persist-sqlite 与 sparkplug-aware 插件/usr/share/mosquitto/dashboard来自仓库 dashboard/src 的 Web 仪表盘静态资源供 HTTP API 使用许可证文件epl-v20、edl-v10安装到/usr/share/licenses/mosquitto/。3.4 目录、用户与启动命令Dockerfile 末尾的关键声明创建目录/mosquitto/config、/mosquitto/data、/mosquitto/log并将默认配置文件docker/local/mosquitto.conf安装为/mosquitto/config/mosquitto.conf将整个/mosquitto目录归属mosquitto:mosquitto用户组声明数据卷VOLUME [/mosquitto/data, /mosquitto/log]声明端口EXPOSE 1883入口脚本ENTRYPOINT [/docker-entrypoint.sh]默认命令CMD [/usr/sbin/mosquitto, -c, /mosquitto/config/mosquitto.conf]即以/mosquitto/config/mosquitto.conf作为配置文件启动 broker。3.5 默认配置与监听端口镜像自带的默认配置来自 docker/local/mosquitto.conf内容如下# This is a Mosquitto configuration file that creates a listener on port 1883 # that allows unauthenticated access. listener 1883 allow_anonymous true listener 9883 protocol http_api http_dir /usr/share/mosquitto/dashboard也就是说镜像默认同时提供两个监听器端口1883标准 MQTT 端口允许匿名访问allow_anonymous true端口9883HTTP API 端口protocol http_api服务http_dir指定的 Web 仪表盘。注意Dockerfile 中仅EXPOSE 18839883 端口在docker run时若需要对外访问需显式用-p映射见下文自定义配置一节。四、挂载点与数据卷约定README 明确规定了镜像内的三类路径约定这是理解镜像使用方式的关键配置挂载点Mount Point用于存放配置/mosquitto/config数据卷与日志卷Volume用于持久化存储和日志/mosquitto/data /mosquitto/log这两个目录在 Dockerfile 中以VOLUME指令声明即使用户不显式指定-vDocker 也会为它们创建匿名卷容器重建时通过挂载具名卷或宿主机目录即可实现数据复用。五、用户与组uid/gid 1883README 明确指出镜像中的 mosquitto 进程以mosquitto用户与mosquitto组运行二者创建时使用的 uid 和 gid 均为1883取自 MQTT 默认端口号便于记忆。这在 Dockerfile 中体现为addgroup -S -g 1883 mosquitto adduser -S -u 1883 -D -H -h /var/empty -s /sbin/nologin -G mosquitto -g mosquitto mosquitto配合 docker/local/docker-entrypoint.sh 入口脚本容器启动时还支持通过环境变量PUID/PGID调整/mosquitto/data的属主#!/bin/ash set -e user$(id -u) if [ $PUID ]; then PUIDmosquitto fi if [ $PGID ]; then PGIDmosquitto fi if [ $user 0 ]; then [ -d /mosquitto/data ] chown -R ${PUID}:${PGID} /mosquitto/data || true fi exec $其行为是仅当容器以 rootuser 0例如--user root或未指定--user启动时将/mosquitto/data递归 chown 为PUID:PGID指定的属主随后通过exec $将控制权交给 CMD 中的 mosquitto 进程。这意味着如果挂载宿主机目录作为数据卷通常建议把该目录的属主设置为 1883:1883或通过PUID/PGID环境变量对齐宿主机用户避免权限不一致实际运行 broker 的用户取决于 CMD 是否以--user指定用户而非该脚本本身脚本只负责数据目录权限。六、自定义配置与端口映射镜像启动时默认使用自带配置文件。若需使用自定义配置需把宿主机上的本地配置文件挂载到容器的/mosquitto/config/mosquitto.confdocker run -it -p 1883:1883 -v 绝对路径-配置文件:/mosquitto/config/mosquitto.conf eclipse-mosquitto:version例如docker run -it -p 1883:1883 \ -v /home/user/mosquitto.conf:/mosquitto/config/mosquitto.conf \ eclipse-mosquitto:local注意本指南中的镜像标签为eclipse-mosquitto:localREADME 示例中使用的version对应从 Docker Hub 拉取的官方eclipse-mosquitto镜像版本标签如2.1、2.0等。请根据实际镜像来源选择标签。README 特别用提示了一个高频坑如果修改了mosquitto.conf使 broker 使用非默认端口docker run命令必须同步更新端口映射。例如同时使用 1883MQTT与 8080WebSocket时docker run -it -p 1883:1883 -p 8080:8080 \ -v 绝对路径-配置文件:/mosquitto/config/mosquitto.conf \ eclipse-mosquitto:version同理如果配置了http_api监听器如默认配置中的 9883 端口也需要显式映射docker run -it -p 1883:1883 -p 9883:9883 \ -v 绝对路径-配置文件:/mosquitto/config/mosquitto.conf \ eclipse-mosquitto:local因为 Docker 的-p映射并不会跟随配置文件自动变化漏掉端口会导致客户端无法访问相应监听器。七、持久化与日志落盘配置README 给出了让 broker 将持久化数据与日志写入卷目录的推荐配置。在自定义mosquitto.conf中追加persistence true persistence_location /mosquitto/data/ log_dest file /mosquitto/log/mosquitto.log其含义是配置项值作用persistencetrue启用 broker 持久化将会话、订阅、retain 消息等状态保存到磁盘persistence_location/mosquitto/data/持久化数据库文件的存放目录对应镜像的数据卷log_destfile /mosquitto/log/mosquitto.log将日志写入文件路径位于镜像日志卷内从底层实现看这两个配置项与仓库源码中的处理逻辑一一对应persistence_location在 src/conf.c 中解析后最终由 src/persist_write.c 负责把mosquitto.db等状态文件写入指定目录log_dest file则由 src/logging.c 的日志模块打开对应文件句柄并写入。你可以结合这些源码文件进一步确认参数细节。结合前面第 4 节的数据卷约定这样的配置可以让容器重建后数据依然保留——README 最后明确指出For any volume used, the data will be persistent between containers.使用卷后数据将在容器之间保持持久。八、挂载卷的两种方式使用自定义配置与持久化时通常有两种挂载方式方式一挂载宿主机目录推荐用于数据持久化mkdir -p /home/user/mosquitto/data /home/user/mosquitto/log docker run -it -p 1883:1883 \ -v /home/user/mosquitto.conf:/mosquitto/config/mosquitto.conf \ -v /home/user/mosquitto/data:/mosquitto/data \ -v /home/user/mosquitto/log:/mosquitto/log \ eclipse-mosquitto:local注意宿主机数据目录的属主应与镜像内 uid/gid 1883 对齐参见第 5 节或利用PUID/PGID环境变量调整。方式二使用具名卷由 Docker 管理docker volume create mosquitto-data docker volume create mosquitto-log docker run -it -p 1883:1883 \ -v /home/user/mosquitto.conf:/mosquitto/config/mosquitto.conf \ -v mosquitto-data:/mosquitto/data \ -v mosquitto-log:/mosquitto/log \ eclipse-mosquitto:local九、与官方镜像目录的关系仓库docker/下存在多个镜像变体各司其职2.1-alpine、2.1-ubuntu等对应官方发布系列的镜像定义generic通过--build-arg VERSION基于发布 tarball 构建任意版本local本文主题基于当前工作区源码构建make localdocker一键完成打包与构建适合本地开发验证。十、快速上手总结构建本地镜像在仓库根目录执行make localdocker得到eclipse-mosquitto:local默认启动docker run -it -p 1883:1883 eclipse-mosquitto:local自定义配置把mosquitto.conf挂载到/mosquitto/config/mosquitto.conf并同步-p映射配置中的所有监听端口持久化在配置中启用persistence true与log_dest file /mosquitto/log/mosquitto.log并将/mosquitto/data、/mosquitto/log挂载为宿主机目录或具名卷权限管理牢记 uid/gid 1883 约定必要时通过PUID/PGID环境变量调整数据目录属主。通过以上步骤你可以基于当前仓库源码构建出完全可控的 Mosquitto 容器并将配置、持久化状态与日志全部收拢到标准化的卷路径之下实现可移植、可复用的 MQTT broker 部署。赞分享后端消息队列消息路由【免费下载链接】mosquittoEclipse Mosquitto - An open source MQTT broker项目地址https://gitcode.com/gh_mirrors/mos/mosquitto点击查看免费下载相关推荐Eclipse Mosquitto Docker 镜像构建与容器化部署完全指南Eclipse Mosquitto Docker 镜像构建与容器化部署完全指南 本篇指南以 docker/generic/README.md https://l后端消息队列消息路由Eclipse Mosquitto 从入门到源码构建MQTT Broker 部署、客户端工具与完整编译指南Eclipse Mosquitto 从入门到源码构建MQTT Broker 部署、客户端工具与完整编译指南 Eclipse Mosquitto 是当前开源社区后端消息队列消息路由Eclipse Mosquitto Docker部署最佳实践容器化环境配置指南Eclipse Mosquitto Docker部署最佳实践容器化环境配置指南 容器化部署优势 Docker容器化部署Eclipse MosquittoMQ物联网消息队列后端网络/通信上一篇Chrome Platform Status追踪Web技术的前沿下一篇5大实用技巧打造高效Claude应用自动化测试终极方案创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表