Featured image of post EMQX5.8 Docker 单机部署和迁移还原

EMQX5.8 Docker 单机部署和迁移还原

EMQX 是一款开源的 MQTT 服务器,体验一年下来非常稳定。我使用的是社区自托管版本(开源版),对于个人需求来说,开源版功能已经足够使用,无需购买商业收费版。

搭建采用的服务器是一台 1C1G 的服务器,内存只有 1G 属于勉强够用,偶尔会出现告警日志 high_system_memory_usage。近期考虑服务器迁移,顺便将内存升级到 2G。迁移过程中遇到了一些问题,在此记录下来。

发生了什么问题?

一言以蔽之,就是迁移后无法正常还原实例。讲道理这应该是一个很简单的问题,但无论我翻阅官方文档,还是和 AI 不断拉扯,实例虽然正常启动,但里面的数据却不对。索性我只能纯手工慢慢排查,最后总结出了正确的还原步骤。

我的环境是 Debian 12+、Docker,作为读者的你如果按我的操作执行,或许需要酌情调整。

快捷部署

1
2
3
4
5
6
7
8
docker volume create emqx
docker run -d \
  --name emqx \
  --hostname mqtt \
  --network host \
  --restart unless-stopped \
  -v emqx:/opt/emqx \
  emqx/emqx:5.8.5

可以看出来非常简单,这条命令是一年多以前的搭建部署命令。因为当时就考虑到后期会迁移,所以使用了 volume 挂载到容器内部;其次网络类型直接使用 host,是为了简化网络管理,后期还要考虑反向代理和防火墙 UFW 策略。

部署成功后,默认启动的管理面板端口是 18083,默认账号密码 admin/public

备份数据

备份配置数据

来到旧服务器,找到对应的 emqx 容器,执行以下命令:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
# 执行备份命令
docker exec -it emqx emqx ctl data export

# Exporting data to "data/backup/emqx-export-2026-01-20-06-37-42.695.tar.gz"...
# Exporting cluster configuration...
# Exporting additional files from EMQX data_dir: "data"...
# Exporting built-in database...
# Exporting emqx_admin database table...
# Exporting emqx_app database table...
# Exporting emqx_psk database table...
# Exporting emqx_authn_mnesia database table...
# Exporting emqx_authn_scram_mnesia database table...
# Exporting emqx_acl database table...
# Exporting emqx_banned_rules database table...
# Exporting emqx_banned database table...
# Data has been successfully exported to data/backup/emqx-export-2026-01-20-06-37-42.695.tar.gz.

可以看到备份成功,容器内部的保存路径为:/opt/emqx/data/backup/emqx-export-2026-01-20-06-37-42.695.tar.gz,随后通过 docker cp 命令将其下载到本地。

备份卷数据

1
2
# 执行压缩打包,并把最后的 emqx-volume-data.tar.gz 文件下载到本地
tar -cvzf ./emqx-volume-data.tar.gz -C /var/lib/docker/volumes/emqx/_data .

至此备份成功,你的本地应该有了两个文件,请将它们上传到新服务器:

  • emqx-volume-data.tar.gz
  • emqx-export-2026-01-20-06-37-42.695.tar.gz

迁移还原

1. 确保主机名一致

需要确保迁移前后的主机名完全一致,否则后期实例启动无法识别主节点数据。我的旧服务器主机名是 mqtt,所以在新服务器执行以下命令:

1
2
3
4
# 执行后需重启才能完全生效
hostnamectl set-hostname mqtt

# 编辑文件 /etc/hosts,找到 127.0.0.1 对应的主机名,统一改为 mqtt

此步骤其实非必须,可以在部署时通过环境变量透传指定主机名,但我的建议还是确保一致,否则会增加部署命令的复杂度。

2. 还原 volume 启动实例

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
# 创建卷数据
docker volume create emqx
# 还原数据
tar -xzvf ./emqx-volume-data.tar.gz -C /var/lib/docker/volumes/emqx/_data
# 启动实例
docker run -d \
  --name emqx \
  --hostname mqtt \
  --network host \
  --restart unless-stopped \
  -v emqx:/opt/emqx \
  emqx/emqx:5.8.5

此时你应该通过 docker logs -f emqx 观察容器是否启动成功。

3. 还原配置数据

通过 docker cp 命令将 emqx-export-2026-01-20-06-37-42.695.tar.gz 复制到容器内部,放到路径 /opt/emqx 即可:

1
2
3
4
5
6
7
8
# 进入容器内部
docker exec -it emqx bash

# 执行还原
emqx ctl data import /opt/emqx/emqx-export-2026-01-20-06-37-42.695.tar.gz

# 退出容器
exit

最后执行 docker restart emqx 重启容器,迁移完成。随后上线检查一下数据是否正确。

总结

部署非常简单,配置好数据卷后一条命令即可启动成功。

迁移还原的话,要考虑到三个方面,且执行先后顺序不能乱:

  • 确保主机名一致
  • 打包迁移还原 volume 数据
  • CLI 命令备份还原配置数据

参考

本站采用 CC BY 4.0 协议 | 转载请注明作者及来源
使用 Hugo 构建
主题 StackJimmy 设计