由于先前的服务器虽然是高防,但是服务器出现错误太为频繁:从昨晚开始到今天中午,服务器大大小小出现了无法连接的问题。导致我有了想要迁移出服务器的想法。
宝塔面板迁移
宝塔中自带迁移功能。
通过填写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即可。
以上就是本次迁移的所有步骤
