不使用仓库将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/copy-docker-images-without-repository/