emqx持久化 Docker 容器中生成的数据并打包新镜像,迁移至新机器运行

emqx官方文档:

http://docs.emqx.com/zh/emqx/latest/deploy/install-docker.html

1、初始化运行脚本emqx.sh(运行后已经在镜像部署装载了一系列数据,包含更改密码)

bash 复制代码
#!/bin/bash
set -e

# 镜像名和容器名
IMAGE=docker.1ms.run/emqx/emqx-enterprise:6.1.0
CONTAINER=emqx-enterprise

# 宿主机挂载目录(当前目录下的 data 和 log 文件夹)
HOST_DATA_DIR="$PWD/data"
HOST_LOG_DIR="$PWD/log"

# 如果目录不存在,先创建
mkdir -p "$HOST_DATA_DIR" "$HOST_LOG_DIR"

# 如果容器已存在,直接启动
if docker ps -a --format '{{.Names}}' | grep -q "^${CONTAINER}$"; then
    echo "容器 ${CONTAINER} 已存在,启动中..."
    docker start ${CONTAINER}
else
    echo "创建并运行容器 ${CONTAINER},挂载数据目录..."
    docker run -d \
      --name ${CONTAINER} \
      --hostname node1.emqx.com \
      -e "EMQX_NODE_NAME=emqx@node1.emqx.com" \
      --restart unless-stopped \
      -p 1883:1883 \
      -p 8083:8083 \
      -p 8084:8084 \
      -p 8883:8883 \
      -p 18083:18083 \
      -v "${HOST_DATA_DIR}:/opt/emqx/data" \
      -v "${HOST_LOG_DIR}:/opt/emqx/log" \
      ${IMAGE}
fi

echo "EMQX 容器启动完成。Dashboard 地址:http://<本机IP>:18083"

2、原机器上打包新镜像

docker exec emqx-enterprise mkdir -p /tmp/data_backup /tmp/log_backup

docker cp ./data emqx-enterprise:/tmp/data_backup

docker cp ./log emqx-enterprise:/tmp/log_backup

docker commit emqx-enterprise emqx-enterprise-custom:6.1.0

docker save emqx-enterprise-custom:6.1.0 > emqx-enterprise-custom.tar

或者直接脚本一键执行:pack.sh

bash 复制代码
#!/bin/bash
set -e

# 配置
CONTAINER_NAME="emqx-enterprise"
IMAGE_NAME="emqx-enterprise-custom:6.1.0"
TAR_FILE="emqx-enterprise-custom.tar"

echo "=== EMQX 备份脚本 ==="

# 检查容器是否存在
if ! docker ps -a --format '{{.Names}}' | grep -q "^${CONTAINER_NAME}$"; then
   echo "错误:容器 ${CONTAINER_NAME} 不存在"
   exit 1
fi

# 1. 从容器复制数据到本地
echo "[1/4] 正在从容器复制数据到 ./data ..."
mkdir -p ./data
docker cp ${CONTAINER_NAME}:/opt/emqx/data ./data
echo "✓ 数据复制完成"

# 2. 复制本地日志到容器(如果本地log目录存在)
if [ -d "./log" ]; then
   echo "[2/4] 正在复制本地日志到容器 /tmp/log_backup ..."
   docker cp ./log ${CONTAINER_NAME}:/tmp/log_backup
   echo "✓ 日志复制完成"
else
   echo "[2/4] 跳过:本地 ./log 目录不存在"
fi

# 3. 提交容器为新镜像
echo "[3/4] 正在提交容器为镜像 ${IMAGE_NAME} ..."
docker commit ${CONTAINER_NAME} ${IMAGE_NAME}
echo "✓ 镜像提交完成"

# 4. 保存镜像为 tar 文件
echo "[4/4] 正在保存镜像到 ${TAR_FILE} ..."
docker save ${IMAGE_NAME} > ${TAR_FILE}
echo "✓ 镜像保存完成,文件大小:$(du -h ${TAR_FILE} | cut -f1)"

echo "=== 全部完成 ==="
echo "数据目录:./data"
echo "镜像文件:${TAR_FILE}"

3、新机器上加载原机器上打包的新镜像

先copy持久化的数据目录和镜像压缩包

scp -r Biu@192.168.0.207:/home/Biu/Linux/emqx/data .

scp -r Biu@192.168.0.207:/home/Biu/Linux/emqx/log

scp Biu@192.168.0.207:/home/Biu/Linux/emqx-enterprise-custom.tar .

加载镜像

sudo docker load < emqx-enterprise-custom.tar
运行镜像

sudo docker run -d --name emqx-enterprise -p 1883:1883 -p 8083:8083 -p 8084:8084 -p 8883:8883 -p 18083:18083 -v ./data:/opt/emqx/data emqx-enterprise-custom:6.1.0

相关推荐
Access开发易登软件2 小时前
Access 窗体中实现数字滚动动画:Timer + Easing 的技术实现
运维·数据库·nginx·microsoft·access
hweiyu002 小时前
Linux 命令:split
linux·运维·服务器
tomiatomia2 小时前
MinIO docker 部署使用的几个坑
运维·docker·容器
lihe7582 小时前
每天凌晨3点自动同步UBUNTU源
linux·运维·ubuntu·本地源
86Eric3 小时前
Vagrant 镜像打包与新环境部署全流程实操(避坑指南)
运维·vagrant·virtualbox·vagrantfile
广然3 小时前
EVE-NG 镜像管理工具 1.1 Web 版本正式发布!
运维·服务器·前端
祁鱼鱼鱼鱼鱼3 小时前
DNS 笔记记录
运维·服务器·网络
tod1133 小时前
Makefile进阶(上)
linux·运维·服务器·windows·makefile·进程
阳光九叶草LXGZXJ3 小时前
达梦数据库-学习-50-分区表指定分区清理空洞率(交换分区方式)
linux·运维·数据库·sql·学习