一个适合 Linux 命令行操作的 Docker 镜像迁移工具。
当目标服务器无法直接 docker pull 镜像时,可以用它在服务器之间迁移 Docker 镜像:自动 docker save、传输镜像包、并在目标服务器执行 docker load。
- 目标服务器网络受限,无法拉取 Docker Hub / GHCR / 私有仓库镜像
- 你有一台 A 服务器能拉镜像,另一台 B 服务器不能拉镜像
- 你希望在 Linux 命令行中用更短、更直观的方式迁移镜像
- 想通过编号选择镜像,而不是手动复制完整镜像名
- 命令行友好:直接输入
dim,按提示选编号即可 - 支持本机镜像推送到远端服务器
- 支持在 B 服务器上远程查看 A 服务器镜像,并拉取到 B
- 支持多镜像批量迁移
- 支持 SSH 密码登录,也支持密钥登录
- 使用 SSH 连接复用,避免同一次迁移反复输入密码
- 默认上传到远端
/mnt - 远端镜像包默认保留,方便后续手动处理
- 本地临时包默认自动清理
推荐一条命令安装,并创建全局 dim 命令:
mkdir -p /mnt && cd /mnt && git clone https://github.com/youpingfang/docker-images-move.git && cd docker-images-move && chmod +x images.sh && ln -sf "$(pwd)/images.sh" /usr/local/bin/dim之后任意目录都可以直接使用:
dim如果不想创建全局命令,也可以只克隆项目后直接运行:
mkdir -p /mnt && cd /mnt && git clone https://github.com/youpingfang/docker-images-move.git && cd docker-images-move && chmod +x images.sh
bash images.sh直接输入:
dim流程:
- 自动列出本机 Docker 镜像编号
- 输入要迁移的编号,例如
1或1 3 5 - 输入目标服务器 IP,例如
1.2.3.4 - 如需密码,按 SSH 提示输入密码
- 自动打包镜像并上传到目标服务器
/mnt - 自动在目标服务器执行
docker load - 远端
/mnt/*.tar.gz默认保留,本地临时包默认删除
dim:查看当前这台 Linux 服务器上的 Docker 镜像,选择编号后推送到目标服务器。dim p:从另一台源容器服务器拉取镜像到当前服务器;如果不带 IP,会提示你输入源容器服务器 IP。
适合:你正在 A 服务器上,想把 A 的镜像传到 B。
dim不知道镜像名时:
dim m 1.2.3.4脚本会列出本机镜像编号,让你选择。
知道镜像名时:
dim m 1.2.3.4 nginx:alpine多个镜像:
dim m 1.2.3.4 nginx:alpine redis:7 mysql:8指定 SSH 端口:
dim m 1.2.3.4:2222 nginx:alpine指定 SSH 用户:
dim m admin@1.2.3.4 nginx:alpine适合:你正在 B 服务器上,想远程查看 A 服务器的镜像,然后拉到 B。
dim p脚本会提示你输入源容器服务器 IP。
也可以直接带上源服务器 IP:
dim p A服务器IP示例:
dim p
dim p 1.2.3.4流程:
- B 通过 SSH 连接 A
- 列出 A 上的 Docker 镜像编号
- 输入编号选择镜像
- A 执行
docker save - 镜像通过 SSH 流式传回 B
- B 保存到
/mnt/docker-images-move - B 执行
docker load
指定端口:
dim p 1.2.3.4:2222指定用户:
dim p admin@1.2.3.4如果知道 A 上的镜像名,也可以直接写:
dim p 1.2.3.4 nginx:alpinedim ls # 编号查看本机镜像
dim s IMAGE # 保存镜像到本机
dim l FILE # 加载 tar/tar.gz 镜像包
dim m IP # 本机镜像迁移到远端服务器
dim p # 提示输入源服务器 IP,再从远端拉镜像到本机
dim p IP # 从远端服务器拉镜像到本机dim move -H 1.2.3.4 nginx:alpine参数:
-H, --host IP 目标服务器 IP/域名
-u, --user USER SSH 用户,默认 root
-p, --port PORT SSH 端口,默认 22
-r, --remote-dir DIR 远端目录,默认 /mnt
-o, --output-dir DIR 本地临时目录,默认 /mnt/docker-images-move
--no-load 只上传,不在远端 docker load
--keep-local 保留本地 tar.gz
--remove-remote 远端加载后删除 tar.gz,默认保留
--no-compress 不压缩,保存为 .tar
--ssh-opts OPTS 额外 SSH/SCP 参数
dim pull -H 1.2.3.4参数:
-H, --host IP 源服务器 IP/域名
-u, --user USER SSH 用户,默认 root
-p, --port PORT SSH 端口,默认 22
-o, --output-dir DIR 本地保存目录,默认 /mnt/docker-images-move
--no-load 只保存,不在本机 docker load
--remove-local 本机 docker load 后删除 tar.gz,默认保留
--ssh-opts OPTS 额外 SSH 参数
跳过首次 SSH 指纹确认:
dim move -H 1.2.3.4 nginx:alpine --ssh-opts "-o StrictHostKeyChecking=no"只上传镜像包,不远端加载:
dim move -H 1.2.3.4 nginx:alpine --no-load远端加载后删除 /mnt 下的镜像包:
dim move -H 1.2.3.4 nginx:alpine --remove-remote从 A 拉镜像到当前服务器,但只保存不加载:
dim pull -H 1.2.3.4 nginx:alpine --no-load默认目录:
远端临时目录:/mnt
本地临时目录:/mnt/docker-images-move
推送模式下:
- 本地临时包默认删除
- 远端
/mnt/*.tar.gz默认保留
拉取模式下:
- 本地
/mnt/docker-images-move/*.tar.gz默认保留 - 镜像默认会自动
docker load
源服务器和目标服务器建议都有:
- Linux
- Bash
- Docker
- SSH
- gzip
推送模式需要:
- 当前服务器:Docker、ssh、scp、gzip
- 目标服务器:Docker、ssh、gzip
拉取模式需要:
- 当前服务器:Docker、ssh、gzip
- 远端服务器:Docker、gzip
直接运行:
dim或:
dim ls脚本会用编号列出镜像,按数字选择即可。
MIT
