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

相关推荐
vin_zheng20 小时前
破解企业安全软件网络拦截实战记录
运维
林姜泽樾1 天前
Linux入门第十二章,创建用户、用户组、主组附加组等相关知识详解
linux·运维·服务器·centos
xiaokangzhe1 天前
Linux系统安全
linux·运维·系统安全
xiaokangzhe1 天前
Nginx核心功能
运维·nginx
松果1771 天前
以本地时钟为源的时间服务器
运维·chrony·时间服务器
Highcharts.js1 天前
Highcharts React v4.2.1 正式发布:更自然的React开发体验,更清晰的数据处理
linux·运维·javascript·ubuntu·react.js·数据可视化·highcharts
青木9601 天前
封装成开箱即用的docker
docker·容器
还在忙碌的吴小二1 天前
k8s是啥?
云原生·容器·kubernetes
ayaya_mana1 天前
快速安装Nginx-UI:让Nginx管理可视化的高效方案
运维·nginx·ui
爱丽_1 天前
Docker 从原理到项目落地(镜像 / 容器 / 网络 / 卷 / Dockerfile)
网络·docker·容器