本文最后更新于27 天前,其中的信息可能已经过时,如有错误请发送邮件到big_fw@foxmail.com
紧急提醒!阿里云试用期服务器即将到期,核心数据、Docker 镜像若不及时迁移,将面临 “一键释放” 风险!本文手把手教你用一行代码完成迁移,从原理到实操、从问题解决到注意事项,新手也能轻松上手。
一、核心迁移原理
通过 docker save
(打包镜像为 tar 流)+ SSH 传输 + docker load
(解压为镜像),实现不同服务器间镜像迁移,支持直接传输(无中间文件)或先存后导(保留备份),适用于阿里云等各类服务器。
二、基础前提
- 网络互通:源服务器与目标服务器可通过 SSH 连接(默认 22 端口),阿里云服务器建议用内网 IP(速度快、不占公网带宽)。
- 权限准备:
- 源服务器:需有
docker save
权限(root 用户或加入 docker 用户组)。 - 目标服务器:需有
docker load
权限,且提前安装 Docker(未安装则仅能传输 tar 文件,无法解析为镜像)。
- 源服务器:需有
- 安全组配置:阿里云服务器需开放 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 提示需要确认主机的真实性,询问是否继续连接,要求输入 yes
、no
或指纹相关内容。
原因分析:第一次连接目标服务器,需确认主机密钥
解决办法:输入 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 已成功导入目标服务器!"
- 功能:当所有步骤完成后,输出成功提示信息,确认迁移完成。
执行流程总结
- 本地打包
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
内的所有文件和子目录(结构完全一致)。
执行流程总结
- 本地进入
/root/mysql
目录 → 2. 打包目录内所有内容为压缩数据流 → 3. 通过 SSH 传输数据流到远程服务器 → 4. 远程创建/root/mysql
目录 → 5. 远程将数据流解压到/root/mysql
→ 6. 迁移完成。
同理要迁移其他文件,只需修改相应的目录~!
注:一些小文件可以通过xftp传输~(快)