Docker部署Mosquitto:自定义配置未加载及地址占用故障排查
问题概述
- Mosquitto未加载
docker-compose.yml中挂载的自定义mosquitto.conf配置文件,日志显示使用默认配置 - 启动容器时提示
Error: Address in use,但通过netstat -tunlp和docker ps -a检查,主机及其他容器均无Mosquitto服务运行
相关日志
1681677658: mosquitto version 2.0.15 starting 1681677658: Using default config. 1681677658: Starting in local only mode. Connections will only be possible from clients running on this machine. 1681677658: Create a configuration file which defines a listener to allow remote access. 1681677658: Opening ipv4 listen socket on port 1883. 1681677658: Error: Address in use 1681677658: Opening ipv6 listen socket on port 1883. 1681677658: Error: Address not available
当前配置文件
docker-compose.yml
--- version: '3.7' services: mosquitto: image: eclipse-mosquitto container_name: mosquitto restart: always volumes: - /opt/mosquitto/config:/mosquitto/config - /opt/mosquitto/mosquitto/data:/mosquitto/data - /opt/mosquitto/mosquitto/log:/mosquitto/log ports: - 1883:1883 - 9001:9001
mosquitto.conf
persistence true persistence_location /mosquitto/data/ log_dest file /mosquitto/log/mosquitto.log listener 1883 ## Authentication ## allow_anonymous true
排查与解决步骤
一、解决自定义配置未加载问题
确认配置文件命名与路径
eclipse-mosquitto镜像默认会加载/mosquitto/config/mosquitto.conf,如果你的配置文件名不是这个,需要在docker-compose.yml的services.mosquitto下添加启动命令指定配置路径:command: mosquitto -c /mosquitto/config/你的配置文件名.conf或者将配置文件重命名为
mosquitto.conf。检查挂载文件的权限与SELinux限制
- 给主机上的配置文件添加可读权限:
chmod 644 /opt/mosquitto/config/mosquitto.conf - CentOS默认开启SELinux,可能会阻止容器访问挂载的文件,临时关闭SELinux测试:
setenforce 0,如果生效,可永久修改/etc/selinux/config将SELINUX=enforcing改为SELINUX=permissive,或者给挂载目录添加SELinux上下文:chcon -Rt svirt_sandbox_file_t /opt/mosquitto/
- 给主机上的配置文件添加可读权限:
验证容器内配置文件的可用性
进入容器执行cat /mosquitto/config/mosquitto.conf,确认文件能正常读取,若提示权限错误,需调整主机侧的文件权限。
二、解决端口占用问题
精准排查端口占用情况
使用ss -tulpn | grep 1883替代netstat,该命令能更准确显示占用端口的进程PID与名称,排查是否有隐藏进程占用1883端口。检查Docker端口映射冲突
执行docker ps --format "{{.Names}}: {{.Ports}}" | grep 1883,确认是否有其他容器也映射了1883端口到主机。处理IPv6绑定错误
日志显示IPv6地址不可用,可在mosquitto.conf中明确指定绑定IPv4地址:listener 1883 0.0.0.0或者在
docker-compose.yml中禁用容器的IPv6:sysctls: - net.ipv6.conf.all.disable_ipv6=1调整network_mode后的端口检查
当使用network_mode: host时,容器会直接使用主机网络,此时需确保主机的1883端口未被占用,同时mosquitto.conf中的listener配置应为0.0.0.0:1883以允许外部访问。
验证步骤
- 修改配置后,删除原有容器并重新创建:
docker-compose down && docker-compose up -d - 查看容器日志:
docker logs mosquitto,确认显示Loaded config file /mosquitto/config/mosquitto.conf - 测试外部设备连接:使用MQTT客户端订阅/发布主题,确认网络连通性
内容的提问来源于stack exchange,提问作者dubbobobo

