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

相关推荐
虎头金猫2 天前
4K 视频总卡在公网带宽?用 N1 + OpenList 把网盘播放链路重新理顺
运维·服务器·网络·python·容器·beautifulsoup·pandas
分布式存储与RustFS2 天前
MinIO 官方 Docker 镜像被移除:依赖它的项目该怎么办
docker·云原生·devops·对象存储·minio·分布式存储
AI职业加油站2 天前
AI智能体应用工程师证书:政策红利下的职业新风口
大数据·运维·人工智能·学习·职场发展
此冬歌咏2 天前
K8s 节点故障实战:优雅驱逐 31 秒,硬故障 331 秒,以及那个永远 Pending 的 Pod
运维·k8s
玉&心2 天前
通过Arthas在线诊断K8S中的内存及JVM等使用情况
docker·k8s·arthas
xing-xing2 天前
Docker容器中Nginx站点根目录网页配置访问
nginx·docker
-梅2 天前
linux(8) 软硬链接
linux·运维·服务器
赵文宇(温玉)2 天前
CoreDNS的hosts插件的缺行配置导致k8s集群异常
容器·kubernetes·rancher
guo_wen_qiang2 天前
上传本地镜像到harbor中
docker·容器·持续部署
张洛闻Eren2 天前
k8s云原生【第十课】:水平 Pod 自动扩缩容
运维·数据库·云原生·kubernetes·github