不使用仓库将Docker镜像从一台主机复制到另一台主机的方法
不使用仓库将Docker镜像从一台主机复制到另一台主机的方法
技术背景
在实际开发和部署过程中,有时需要将Docker镜像从一台主机传输到另一台主机,而不借助公共或私有仓库。例如,在创建基于自定义基础镜像(如Red Hat Linux)的镜像时,由于Dockerfile不易移植,无法在目标主机上重新创建镜像,因此需要一种直接的镜像传输方法。
实现步骤
方法一:使用docker save
和docker load
- 在源主机上保存镜像为tar文件:例如:
1
docker save -o <path for generated tar file> <image name>
1
docker save -o c:/myfile.tar centos:16
- 将tar文件复制到目标主机:可以使用
cp
、scp
或rsync
等常规文件传输工具。 - 在目标主机上加载镜像:
1
docker load -i <path to image tar file>
方法二:通过SSH直接传输并加载
1 |
|
如果想查看传输进度,可以使用pv
:
1 |
|
根据网络速度选择合适的压缩方式:
- 网络速度快(上传速度10 Mb/s及以上):使用
gzip
。 - 网络速度慢(如移动网络):使用
xz
。
方法三:使用DOCKER_HOST
变量
1 |
|
前提条件:远程主机需要设置好SSH凭证(ssh-copy-id
),并且本地和远程用户都需要加入docker
组(sudo usermod -aG docker $USER
)。
核心代码
保存并加载单个镜像
1 |
|
保存并加载所有镜像
1 |
|
最佳实践
- 使用合适的压缩方式:根据网络速度选择合适的压缩工具,以平衡传输时间和文件大小。
- 使用
pv
查看进度:在传输大镜像时,使用pv
工具可以实时查看传输进度。 - 使用标签而不是镜像ID:在保存和加载镜像时,使用
repo:tag
作为镜像引用,避免加载后镜像标签丢失。
常见问题
加载镜像后标签丢失
如果使用镜像ID保存和加载镜像,加载后的镜像可能没有标签。可以使用docker tag
命令为镜像添加标签:
1 |
|
docker load
需要sudo
权限
如果docker load
需要sudo
权限,可以在/etc/sudoers
文件中添加Defaults:<target username> !requiretty
,并将命令用引号包裹:
1 |
|
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/