网站首页 > 基础教程 正文
技术背景
在实际开发和部署过程中,有时需要将Docker镜像从一台主机传输到另一台主机,而不借助公共或私有仓库。例如,在创建基于自定义基础镜像(如Red Hat Linux)的镜像时,由于Dockerfile不易移植,无法在目标主机上重新创建镜像,因此需要一种直接的镜像传输方法。
实现步骤
方法一:使用docker save和docker load
- 在源主机上保存镜像为tar文件:
- docker save -o <path for generated tar file> <image name>
- 例如:
- docker save -o c:/myfile.tar centos:16
- 将tar文件复制到目标主机:可以使用cp、scp或rsync等常规文件传输工具。
- 在目标主机上加载镜像:
- docker load -i <path to image tar file>
方法二:通过SSH直接传输并加载
docker save <image> | bzip2 | ssh user@host docker load
如果想查看传输进度,可以使用pv:
docker save <image> | bzip2 | pv | ssh user@host docker load
根据网络速度选择合适的压缩方式:
- 网络速度快(上传速度10 Mb/s及以上):使用gzip。
- 网络速度慢(如移动网络):使用xz。
方法三:使用DOCKER_HOST变量
docker save app:1.0 | gzip | DOCKER_HOST=ssh://user@remotehost docker load
前提条件:远程主机需要设置好SSH凭证(ssh-copy-id),并且本地和远程用户都需要加入docker组(sudo usermod -aG docker $USER)。
核心代码
保存并加载单个镜像
# 保存镜像
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"
保存并加载所有镜像
# 保存所有镜像
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命令为镜像添加标签:
docker tag <IMAGE ID> <REPOSITORY>:<TAG>
docker load需要sudo权限
如果docker load需要sudo权限,可以在/etc/sudoers文件中添加Defaults:<target username> !requiretty,并将命令用引号包裹:
docker save <image> | ssh user@host 'bunzip2 | sudo docker load'
Windows机器上的问题
在Windows机器上使用PowerShell执行docker save <image> | ssh user@host docker load可能会失败,因为PowerShell会在输出中添加额外字符。可以使用命令提示符(CMD)执行该命令。
猜你喜欢
- 2025-05-08 掌握SpringBoot-2.3的容器探针:实战篇
- 2025-05-08 kubernetes基础知识之驱逐节点(k8s驱逐节点后恢复)
- 2025-05-08 Linux环境中制作网络哨兵Sentinel Docker镜像
- 2025-05-08 k8s之配置CNI网络(k8s 网络配置)
- 2025-05-08 docker实战之:镜像更新(docker 镜像升级替换)
- 2025-05-08 离线在docker镜像方式部署ragflow0.17.2
- 2025-05-08 Linux日常小技巧Docker打包(docker打包lnmp)
- 2025-05-08 使用dockerfile构建docker镜像(docker通过dockerfile构建镜像命令)
- 2025-05-08 「云原生」Containerd ctr,crictl 和 nerdctl 命令介绍与实战操作
- 2025-05-08 Kylin安装Dify(kylin安装部署)
- 最近发表
- 标签列表
-
- jsp (69)
- gitpush (78)
- gitreset (66)
- python字典 (67)
- dockercp (63)
- gitclone命令 (63)
- dockersave (62)
- linux命令大全 (65)
- pythonif (86)
- location.href (69)
- dockerexec (65)
- tail-f (79)
- queryselectorall (63)
- location.search (79)
- bootstrap教程 (74)
- 单例 (62)
- linuxgzip (68)
- 字符串连接 (73)
- html标签 (69)
- c++初始化列表 (64)
- mysqlinnodbmyisam区别 (63)
- arraylistadd (66)
- mysqldatesub函数 (63)
- window10java环境变量设置 (66)
- c++虚函数和纯虚函数的区别 (66)