由于先前的服务器虽然是高防,但是服务器出现错误太为频繁:从昨晚开始到今天中午,服务器大大小小出现了无法连接的问题。导致我有了想要迁移出服务器的想法。

宝塔面板迁移

宝塔中自带迁移功能。宝塔入口

通过填写SSH配置即可直接迁移。

但是AWMC的服务涉及到Docker。宝塔目前的工具并不能很好的兼容docker服务,需要手动迁移,在这期间会有一些问题。

Docker迁移

Docker的迁移比较麻烦,单纯复制docker的文件夹是不能够直接启动的。以下是最方便的步骤:

先备份镜像

# 1. 先查看所有镜像(确认要导出的镜像列表,可选)
docker images

# 2. 批量导出所有镜像到一个tar包(命名为all_docker_images.tar)
# $(docker images -q) 会自动获取所有镜像的ID,实现批量导出
docker save -o /tmp/all_docker_images.tar $(docker images -q)

# 3. 查看tar包大小(确认导出成功,可选)
ls -lh /tmp/all_docker_images.tar

传输镜像压缩包

# 1. 导入批量镜像包(会自动识别并导入所有镜像)
docker load -i /www/all_docker_images.tar

# 2. 验证导入结果(能看到所有原机器的镜像)
docker images

保存镜像命令

# ===== 【在原机器操作】=====
# 1. 创建一个批量生成启动命令的脚本文件(命名为 generate_run_commands.sh)
cat > generate_run_commands.sh << 'EOF'
#!/bin/bash
# 遍历所有容器(包括停止的)
for container_id in $(docker ps -aq); do
    # 获取容器基本信息
    container_name=$(docker inspect --format '{{.Name}}' $container_id | sed 's/^\///')  # 去掉容器名前的/
    image_name=$(docker inspect --format '{{.Config.Image}}' $container_id)
    cmd=$(docker inspect --format '{{.Config.Cmd}}' $container_id | sed 's/^\[//;s/\]$//;s/ //g;s/"//g')  # 提取启动命令
    created=$(docker inspect --format '{{.Created}}' $container_id)

    # 提取端口映射(格式:-p 80:80 -p 443:443)
    ports=$(docker inspect --format '{{range $p, $conf := .NetworkSettings.Ports}}{{$p}}{{end}}' $container_id)
    port_args=""
    if [ -n "$ports" ]; then
        for port in $ports; do
            # 拆分宿主机端口和容器端口(比如 80/tcp → 宿主机80:容器80)
            host_port=$(echo $port | cut -d/ -f1)
            container_port=$host_port  # 原容器默认宿主机和容器端口一致,若不一致需调整
            port_args="$port_args -p $host_port:$container_port"
        done
    fi

    # 提取数据卷挂载(格式:-v /host/path:/container/path)
    volumes=$(docker inspect --format '{{range .Mounts}}{{.Source}}:{{.Destination}} {{end}}' $container_id)
    volume_args=""
    if [ -n "$volumes" ]; then
        for vol in $volumes; do
            volume_args="$volume_args -v $vol"
        done
    fi

    # 提取环境变量(格式:-e KEY=VALUE -e KEY2=VALUE2)
    envs=$(docker inspect --format '{{range .Config.Env}}{{.}} {{end}}' $container_id)
    env_args=""
    if [ -n "$envs" ]; then
        for env in $envs; do
            env_args="$env_args -e $env"
        done
    fi

    # 生成docker run命令(-d 后台运行,--name 指定容器名,--restart=always 可选:开机自启)
    run_cmd="docker run -d --name $container_name $port_args $volume_args $env_args $image_name $cmd"
  
    # 输出命令并写入脚本
    echo "# 容器名:$container_name,创建时间:$created"
    echo "$run_cmd"
    echo "$run_cmd" >> docker_run_all.sh
done

# 给脚本添加执行权限
chmod +x docker_run_all.sh
echo "批量启动脚本已生成:docker_run_all.sh"
EOF

# 2. 执行脚本,生成批量启动命令
bash generate_run_commands.sh

# 3. 查看生成的脚本(确认参数是否正确)
cat docker_run_all.sh

在新的机器上运行这个脚本

# ===== 【在新机器操作】=====
# 1. 把原机器生成的 docker_run_all.sh 传到新机器
scp root@原机器IP:/path/to/docker_run_all.sh /www/

# 2. 执行批量启动脚本
cd /www
bash docker_run_all.sh

# 3. 验证容器是否启动成功
docker ps

即可。

确保容器UP

由于docker的网络始终是个谜,服务UP之后可能需要重新配置IP和端口,需要自行纠正。宝塔唯一的缺点就是在Docker管理这里还是非常欠缺,不太适合。

如果在访问容器列表的时候出现了 publicPort的错误,去ssh里面 docker ps找到没有映射公共端口的容器,然后执行 docker stop即可。

以上就是本次迁移的所有步骤

最后修改:2026 年 03 月 02 日
如果觉得我的文章对你有用,请随意赞赏