阿里云服务器到期急救指南:Docker 镜像与数据跨服务器迁移全流程
本文最后更新于27 天前,其中的信息可能已经过时,如有错误请发送邮件到big_fw@foxmail.com

紧急提醒!阿里云试用期服务器即将到期,核心数据、Docker 镜像若不及时迁移,将面临 “一键释放” 风险!本文手把手教你用一行代码完成迁移,从原理到实操、从问题解决到注意事项,新手也能轻松上手。

一、核心迁移原理

通过 docker save(打包镜像为 tar 流)+ SSH 传输 + docker load(解压为镜像),实现不同服务器间镜像迁移,支持直接传输(无中间文件)或先存后导(保留备份),适用于阿里云等各类服务器。

二、基础前提

  1. 网络互通:源服务器与目标服务器可通过 SSH 连接(默认 22 端口),阿里云服务器建议用内网 IP(速度快、不占公网带宽)。
  2. 权限准备:
    • 源服务器:需有 docker save 权限(root 用户或加入 docker 用户组)。
    • 目标服务器:需有 docker load 权限,且提前安装 Docker(未安装则仅能传输 tar 文件,无法解析为镜像)。
  3. 安全组配置:阿里云服务器需开放 22 端口,允许源服务器 IP 访问。

三、镜像迁移

以Java:8为例

 # 本地打包镜像 → 通过 SSH 传输到远程 → 远程执行保存、导入、提示操作
 docker save java:8 | ssh root@106.12.7.225 '
   mkdir -p /root/backup/root/docker &&
   cat > /root/backup/root/docker/java_8.tar &&
  docker load < /root/backup/root/docker/java_8.tar &&
   echo "镜像 java:8 已成功导入目标服务器!"
 '

通过管道(|)将本地操作与远程操作连接,实现 “一键迁移 + 验证”。

SSH 主机真实性验证提示:首次连接目标服务器(IP 为 目标主机IP),SSH 提示需要确认主机的真实性,询问是否继续连接,要求输入 yesno 或指纹相关内容。

原因分析:第一次连接目标服务器,需确认主机密钥

解决办法:输入 yes(必须是全拼,不能只输 y),确认信任后后续不再提示

分步拆解与作用

1. 本地服务器操作:docker save java:8

  • 功能:将本地的 java:8 Docker 镜像打包为 tar 格式的数据流(不生成本地文件,直接输出到标准输出)。
  • 细节:docker save 是 Docker 内置命令,用于将镜像导出为归档文件,支持跨服务器迁移。

2. 数据传输:| ssh root@106.12.7.225 '...'

  • |(管道符):将前一步 docker save 输出的 tar 数据流,传递给后面的 ssh 命令。
  • ssh root@106.12.7.225:通过 SSH 协议登录远程服务器(IP 为 106.12.7.225,用户为 root),需要输入远程服务器的 root 密码(或已配置 SSH 免密登录)。
  • 单引号 '...' 内的内容:是在远程服务器上执行的一系列命令

3. 远程服务器操作(单引号内的 4 步)

mkdir -p /root/backup/root/docker &&
  • 功能:在远程服务器创建保存镜像的目录。
  • mkdir -p:递归创建目录(即使父目录不存在也能创建,避免 No such file or directory 错误)。
  • 路径 /root/backup/root/docker:远程服务器上用于存放镜像 tar 文件的目录。
  • &&:确保目录创建成功后,才执行后续命令。
cat > /root/backup/root/docker/java_8.tar &&
  • 功能:将通过 SSH 传输过来的 tar 数据流(即本地 java:8 镜像的打包数据),写入远程服务器的 java_8.tar 文件。
  • cat > 文件名:读取标准输入(这里是管道传来的镜像数据),并写入指定文件。
  • 结果:远程服务器的 /root/backup/root/docker/ 目录下会生成 java_8.tar 备份文件。
docker load < /root/backup/root/docker/java_8.tar &&
  • 功能:将远程服务器上的 java_8.tar 备份文件,导入为 Docker 镜像。
  • docker load < 文件名:从 tar 文件中加载镜像到 Docker 环境(与 docker save 对应,是逆向操作)。
  • 结果:远程服务器的 Docker 中会出现 java:8 镜像,可通过 docker images 查看。
echo "镜像 java:8 已成功导入目标服务器!"
  • 功能:当所有步骤完成后,输出成功提示信息,确认迁移完成。

执行流程总结

  1. 本地打包 java:8 镜像为数据流 → 2. 通过 SSH 传输到远程服务器 → 3. 远程创建目录 → 4. 保存数据流为 java_8.tar → 5. 导入 tar 文件为 Docker 镜像 → 6. 输出成功提示。

这条命令的优势是一站式完成迁移 + 备份 + 验证,无需手动登录远程服务器执行后续操作,适合自动化脚本或快速迁移场景。

3. 迁移验证(目标服务器执行)

迁移完成后,可在目标服务器查看镜像是否成功导入:

 docker images | grep java:8  # 若输出 java:8 的镜像信息,说明迁移成功

四、数据迁移

以本地 /root/mysql 目录为例,跨服务器迁移的完整脚本,通过 tar 打包目录内容、SSH 实时传输、远程创建目录并解压,实现目录从本地到远程服务器(172.20.16.117)的完整迁移。以下是逐部分的详细解释:

命令整体结构

 # 本地进入目录→打包内容→SSH传输→远程创建目录+解压
 cd /root/mysql && tar czf - . | ssh root@172.20.16.117 '
   mkdir -p ~/mysql &&
  tar xzf - -C ~/mysql
 '

通过 && 和管道符 | 串联本地操作与远程操作,实现 “一键迁移”,无需手动分步骤执行。

分步拆解与作用

1. 本地服务器操作 1:cd /root/mysql

  • 核心功能:切换本地工作目录到 /root/mysql(即要迁移的目标目录)。
  • 关键意义:后续打包命令会基于 “当前目录” 操作,避免打包时包含外层的 /root/mysql 目录路径(比如不会出现 root/mysql/xxx 的嵌套结构,确保解压后内容直接在目标目录)。
  • 示例:若本地 /root/mysql 下有 data/my.cnf,进入目录后打包,压缩包内会直接包含 data/my.cnf,而非 root/mysql/data/

2. 本地服务器操作 2:tar czf - .

  • tar 命令参数解析:
    • c:创建新的压缩包(打包操作);
    • z:用 gzip 算法压缩(减小传输体积,加快速度);
    • f -f 指定输出位置,- 表示 “输出到标准输出(stdout)”(不生成本地压缩文件,直接通过管道传输);
    • .:表示 “当前目录下的所有内容”(即 /root/mysql 内的所有文件、子目录,不包含 /root/mysql 本身)。
  • 结果:本地将 /root/mysql 内的内容打包压缩成数据流,等待传输。

3. 数据传输桥梁:| ssh root@目标主机公网 '...'

  • |(管道符):将前一步 tar 输出的压缩数据流,“实时传递” 给后面的 ssh 命令,避免本地暂存大文件(节省磁盘空间,适合大目录迁移)。
  • ssh root@172.20.16.117:通过 SSH 协议登录远程服务器,其中:
    • root:远程服务器的登录用户(需有目标目录的读写权限);
    • 172.20.16.117:远程服务器的 IP 地址;
    • 执行时需输入远程服务器 root 用户的密码(若配置了 SSH 免密登录,可跳过密码输入)。
  • 单引号 '...':包裹 “自动在远程服务器上执行的命令”,确保这些命令仅在远程生效,不被本地 Shell 解析。

4. mkdir -p ~/mysql &&

  • 功能:在远程服务器创建目标目录,避免解压时因目录不存在报错。
    • mkdir -p-p 是 “递归创建目录” 的关键参数 —— 即使 ~/mysql 的父目录(如 ~,即远程 root 的家目录 /root)已存在,或需要创建多级目录,都能正常执行(比如若 ~/mysql 不存在,直接创建;若存在,不报错);
    • ~/mysql:远程目标目录,~ 等价于远程 root 的家目录 /root,所以完整路径是 /root/mysql
    • &&:逻辑 “与”,确保 “目录创建成功” 后,才执行后续的解压命令(避免目录没创建就解压,导致失败)。
    (若你迁移到的新服务器存在你想要的目录则可以不建,按需选择~)

5. tar xzf - -C ~/mysql

  • tar 命令参数解析:
    • x:提取压缩包内容(解压操作,与本地的 c 打包对应);
    • z:用 gzip 算法解压(与本地的 z 压缩对应,确保格式匹配);
    • f -f 指定输入来源,- 表示 “从标准输入(stdin)读取数据”(即读取通过 SSH 传输过来的本地压缩数据流);
    • -C ~/mysql-C 是 “指定解压目录” 的关键参数 —— 将压缩包内的内容直接解压到 ~/mysql 目录下,不散落至其他路径。
  • 结果:远程服务器的 /root/mysql 目录下,会完整还原本地 /root/mysql 内的所有文件和子目录(结构完全一致)。

执行流程总结

  1. 本地进入 /root/mysql 目录 → 2. 打包目录内所有内容为压缩数据流 → 3. 通过 SSH 传输数据流到远程服务器 → 4. 远程创建 /root/mysql 目录 → 5. 远程将数据流解压到 /root/mysql → 6. 迁移完成。

同理要迁移其他文件,只需修改相应的目录~!

注:一些小文件可以通过xftp传输~(快)

文末附加内容
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇