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

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

技术背景

在实际开发和部署过程中,有时需要将Docker镜像从一台主机传输到另一台主机,而不借助公共或私有仓库。例如,在创建基于自定义基础镜像(如Red Hat Linux)的镜像时,由于Dockerfile不易移植,无法在目标主机上重新创建镜像,因此需要一种直接的镜像传输方法。

实现步骤

方法一:使用docker savedocker load

  1. 在源主机上保存镜像为tar文件
    1
    docker save -o <path for generated tar file> <image name>
    例如:
    1
    docker save -o c:/myfile.tar centos:16
  2. 将tar文件复制到目标主机:可以使用cpscprsync等常规文件传输工具。
  3. 在目标主机上加载镜像
    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
  • 网络速度慢(如移动网络):使用xz

方法三:使用DOCKER_HOST变量

1
docker save app:1.0 | gzip | DOCKER_HOST=ssh://user@remotehost docker load

前提条件:远程主机需要设置好SSH凭证(ssh-copy-id),并且本地和远程用户都需要加入docker组(sudo usermod -aG docker $USER)。

核心代码

保存并加载单个镜像

1
2
3
4
5
6
# 保存镜像
docker save -o myimage.tar myimage:tag
# 复制文件(示例使用scp)
scp myimage.tar user@remotehost:/path/to/destination
# 加载镜像
ssh user@remotehost "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 allimages.tar user@remotehost:/path/to/destination
# 加载所有镜像
ssh user@remotehost "docker load -i /path/to/destination/allimages.tar"

最佳实践

  • 使用合适的压缩方式:根据网络速度选择合适的压缩工具,以平衡传输时间和文件大小。
  • 使用pv查看进度:在传输大镜像时,使用pv工具可以实时查看传输进度。
  • 使用标签而不是镜像ID:在保存和加载镜像时,使用repo:tag作为镜像引用,避免加载后镜像标签丢失。

常见问题

加载镜像后标签丢失

如果使用镜像ID保存和加载镜像,加载后的镜像可能没有标签。可以使用docker tag命令为镜像添加标签:

1
docker tag <IMAGE ID> <REPOSITORY>:<TAG>

docker load需要sudo权限

如果docker load需要sudo权限,可以在/etc/sudoers文件中添加Defaults:<target username> !requiretty,并将命令用引号包裹:

1
docker save <image> | ssh user@host 'bunzip2 | sudo docker load'

Windows机器上的问题

在Windows机器上使用PowerShell执行docker save <image> | ssh user@host docker load可能会失败,因为PowerShell会在输出中添加额外字符。可以使用命令提示符(CMD)执行该命令。


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