Docker之EMQX部署:高可用MQTT消息服务器

核心部署命令

# 创建并授权数据目录
mkdir -p /home/emqx/data /home/emqx/log
chown -R 1000:1000 /home/emqx/data /home/emqx/log

# 启动EMQX容器
docker run -d \
  --restart=always \
  --name emqx \
  -v /home/emqx/data:/opt/emqx/data \
  -v /home/emqx/log:/opt/emqx/log \
  -p 1883:1883 \
  -p 8083:8083 \
  -p 8084:8084 \
  -p 8883:8883 \
  -p 18083:18083 \
  emqx/emqx:5.10.0

端口详解

端口协议用途说明
1883MQTTTCP协议默认端口
8083MQTTWebSocket协议端口
8084MQTTSSL/TLS WebSocket端口
8883MQTTSSL/TLS TCP协议端口
18083HTTP管理控制台端口

目录权限说明

# 关键权限配置
chown -R 1000:1000 /home/emqx/data /home/emqx/log
  • 1000:1000:EMQX容器默认用户UID:GUID
  • 数据目录:存储运行状态、消息持久化数据
  • 日志目录:存储运行日志、错误日志

生产环境优化配置

1. 资源限制与网络优化

docker run -d \
  --restart=always \
  --name emqx \
  --memory=2g \
  --cpus=2 \
  --network=host \  # 高性能场景使用host模式
  -v /home/emqx/data:/opt/emqx/data \
  -v /home/emqx/log:/opt/emqx/log \
  -v /home/emqx/etc:/opt/emqx/etc \  # 挂载配置文件
  -p 1883:1883 \
  -p 18083:18083 \
  emqx/emqx:5.10.0

2. 自定义配置文件

# 创建配置目录
mkdir -p /home/emqx/etc

# 生成默认配置
docker run --rm emqx/emqx:5.10.0 cat /opt/emqx/etc/emqx.conf > /home/emqx/etc/emqx.conf

# 关键配置修改
echo "
# 允许匿名连接(生产环境建议关闭)
mqtt.allow_anonymous = true

# 最大连接数
mqtt.max_connections = 100000

# 消息大小限制(单位:字节)
mqtt.max_packet_size = 10MB
" >> /home/emqx/etc/emqx.conf

访问验证

1. 控制台访问

  • 地址:http://服务器IP:18083
  • 默认账号:admin
  • 默认密码:public

2. 服务健康检查

# 检查容器状态
docker ps | grep emqx

# 查看服务日志
docker logs -f emqx

# 测试MQTT连接
docker exec -it emqx emqx ctl status

集群部署方案

1. 多节点集群配置

# 节点1
docker run -d --name emqx1 \
  -e EMQX_NODE_NAME=emqx@node1 \
  -e EMQX_CLUSTER__DISCOVERY_STRATEGY=static \
  -e EMQX_CLUSTER__STATIC__SEEDS="[emqx@node1,emqx@node2]" \
  emqx/emqx:5.10.0

# 节点2  
docker run -d --name emqx2 \
  -e EMQX_NODE_NAME=emqx@node2 \
  -e EMQX_CLUSTER__DISCOVERY_STRATEGY=static \
  -e EMQX_CLUSTER__STATIC__SEEDS="[emqx@node1,emqx@node2]" \
  emqx/emqx:5.10.0

2. Kubernetes部署

apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: emqx
spec:
  serviceName: emqx
  replicas: 3
  template:
    spec:
      containers:
      - name: emqx
        image: emqx/emqx:5.10.0
        env:
        - name: EMQX_NODE_NAME
          value: "emqx@$(POD_NAME).emqx"

安全加固建议

1. 修改默认密码

# 进入容器修改
docker exec -it emqx emqx ctl admins passwd admin MyNewPassword123!

2. 启用SSL/TLS加密

# 挂载SSL证书
-v /path/to/ssl:/opt/emqx/certs
-e EMQX_LISTENERS__SSL__EXTERNAL__KEYFILE=/opt/emqx/certs/server.key
-e EMQX_LISTENERS__SSL__EXTERNAL__CERTFILE=/opt/emqx/certs/server.crt

3. 网络访问控制

# 只绑定内网IP
-p 192.168.1.100:1883:1883
-p 192.168.1.100:18083:18083

监控与维护

1. 关键指标监控

# 查看集群状态
docker exec -it emqx emqx ctl cluster status

# 查看连接数
docker exec -it emqx emqx ctl clients list

# 查看主题统计
docker exec -it emqx emqx ctl topics list

2. 日志管理

# 日志轮转配置
docker exec -it emqx vi /opt/emqx/etc/log.conf

# 查看实时日志
tail -f /home/emqx/log/emqx.log.1

3. 数据备份

# 备份数据和配置
tar -czvf emqx-backup-$(date +%Y%m%d).tar.gz /home/emqx/data /home/emqx/etc

# 恢复备份
tar -xzvf emqx-backup-20231201.tar.gz -C /home/emqx/

故障排查指南

1. 常见问题解决

# 端口占用检查
netstat -tulnp | grep 1883

# 权限问题修复
chown -R 1000:1000 /home/emqx/

# 容器启动失败诊断
docker logs emqx

2. 性能调优参数

# 调整系统参数
echo 'net.core.somaxconn = 1024' >> /etc/sysctl.conf
echo 'vm.overcommit_memory = 1' >> /etc/sysctl.conf
sysctl -p

通过以上部署可实现:

  • 企业级的MQTT消息服务器
  • 高可用的集群架构
  • 完善的安全控制机制
  • 便捷的监控维护能力
版本提示:EMQX 5.x 版本相比 4.x 在性能和集群管理上有显著提升,建议新项目直接使用 5.x 系列。

添加新评论