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