不使用仓库将 Docker 镜像从一台主机复制到另一台主机的方法

不使用仓库将 Docker 镜像从一台主机复制到另一台主机的方法

技术背景

在实际开发和运维过程中,有时无法使用 Docker 仓库来共享镜像,例如在离线环境或网络受限的情况下。这时就需要将 Docker 镜像从一台主机复制到另一台主机。

实现步骤

基本步骤

  1. 保存镜像为 tar 文件

    1
    docker save -o <path for generated tar file> <image name>

    示例:

    1
    docker save -o c:/myfile.tar centos:16

    若镜像有仓库前缀,示例如下:

    1
    docker save -o C:\path\to\file.tar repository/imagename
  2. 复制镜像文件:使用 cpscprsync(大文件推荐)等工具将 tar 文件复制到新系统。

  3. 加载镜像到 Docker

    1
    docker load -i <path to image tar file>

其他传输方式

通过 SSH 传输并压缩

1
docker save <image> | bzip2 | ssh user@host docker load

若要查看传输进度,可加入 pv

1
docker save <image> | bzip2 | pv | ssh user@host docker load

根据网络情况选择压缩方式

  • 网络速度快(上传速度达 10 Mb/s 及以上),使用 gzip
    1
    docker save <image> | gzip | ssh user@host docker load
  • 网络较慢(如移动网络),使用 xz
    1
    docker save <image> | xz | ssh user@host docker load

使用 DOCKER_HOST 变量

1
docker save <image> | gzip | DOCKER_HOST=ssh://user@remotehost docker load

保存和加载所有镜像

保存所有镜像:

1
docker save $(docker images --format '{{.Repository}}:{{.Tag}}') -o allimages.tar

加载所有镜像:

1
docker load -i allimages.tar

使用 docker-machine 复制镜像

mach1mach2 之间复制镜像:

1
docker $(docker-machine config <mach1>) save <image> | docker $(docker-machine config <mach2>) load

查看进度:

1
docker $(docker-machine config <mach1>) save <image> | pv | docker $(docker-machine config <mach2>) load

从本地 Docker 安装复制到 minikube VM

1
docker save <image> | (eval $(minikube docker-env) && docker load)

使用 docker-machine scp

  1. 保存镜像:
1
docker save -o docker-images.tar app-web
  1. 复制镜像:
1
docker-machine scp ./docker-images.tar remote-machine:/home/ubuntu
  1. 加载镜像:
1
docker-machine ssh remote-machine sudo docker load -i docker-images.tar

核心代码

保存和加载单个镜像

1
2
3
4
5
6
# 保存镜像
docker save -o myimage.tar myimage:latest
# 复制文件(示例:scp)
scp myimage.tar user@newhost:/path/to/destination
# 加载镜像
docker load -i /path/to/destination/myimage.tar

保存和加载所有镜像

1
2
3
4
5
6
# 保存所有镜像
docker save $(docker images --format '{{.Repository}}:{{.Tag}}') -o allimages.tar
# 复制文件(示例:scp)
scp allimages.tar user@newhost:/path/to/destination
# 加载所有镜像
docker load -i /path/to/destination/allimages.tar

最佳实践

  • 对于大文件,使用 rsync 进行复制,它能更高效地处理大文件传输。
  • 根据网络速度选择合适的压缩方式,以提高传输效率。
  • 使用 pv 工具查看传输进度,便于监控。

常见问题

  • Windows 机器使用 PowerShell 传输问题:在 Windows 机器上使用 PowerShell 执行 docker save <image> | ssh user@host docker load 可能会添加额外字符导致失败,可使用 cmd(命令提示符)。
  • docker-push-ssh 使用问题:使用 docker-push-ssh 时,需要手动将 localhost 添加到 Docker 的 insecure_registries 配置中。运行工具时若出现错误提示,可参考相关文档进行配置。

不使用仓库将 Docker 镜像从一台主机复制到另一台主机的方法
https://119291.xyz/posts/2025-05-15.copy-docker-images-between-hosts-without-repo/
作者
ww
发布于
2025年5月15日
许可协议