1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57
| #!/bin/bash
USER=$1 HOST=$2 DEST=$3
if [ -z "$USER" ] || [ -z "$HOST" ] || [ -z "$DEST" ]; then echo "❌ 参数不足" echo "用法: $0 <目标服务器用户> <目标服务器IP> <目标目录>" exit 1 fi
mkdir -p migrate_tmp/images migrate_tmp/volumes migrate_tmp/config
echo ">>> 收集容器信息" docker ps --format '{{.ID}} {{.Names}}' | while read cid cname; do echo ">>> 处理容器: $cname" img=$(docker inspect --format '{{.Config.Image}}' $cid) echo " 镜像: $img"
if [[ "$img" == *"spg-registry"* || "$img" == *"gitlab"* ]]; then echo " ⏳ 保存镜像: $img" docker save -o migrate_tmp/images/${cname}.tar $img else echo " ✅ 公共镜像, 新服务器上直接 pull: $img" echo "$img" >> migrate_tmp/images/public_images.txt fi
docker inspect $cid > migrate_tmp/config/${cname}.json
for vol in $(docker inspect --format '{{range .Mounts}}{{.Source}} {{end}}' $cid); do if [ -d "$vol" ]; then vname=${cname}_$(basename $vol) echo " 打包数据卷: $vol" tar czf migrate_tmp/volumes/${vname}.tgz -C $(dirname $vol) $(basename $vol) fi done done
echo ">>> 打包迁移文件" tar czf docker_migrate_bundle.tgz migrate_tmp rm -rf migrate_tmp
echo ">>> 传输到目标服务器: $HOST" ssh $USER@$HOST "mkdir -p $DEST" scp docker_migrate_bundle.tgz $USER@$HOST:$DEST/
echo ">>> 在目标服务器上解压" ssh $USER@$HOST "cd $DEST && tar xzf docker_migrate_bundle.tgz"
echo "✅ 迁移完成" echo "下一步请在新服务器执行: ./docker-restore.sh $DEST/migrate_tmp"
|