网站首页 > 文章精选 正文
技术背景
在实际开发和部署过程中,有时需要将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)执行该命令。
- 上一篇: Docker镜像瘦身
- 下一篇: 一文带你学会 Docker 导出和导入本地镜像的方法
猜你喜欢
- 2025-05-22 离线在docker镜像方式部署ragflow0.17.2
- 2025-05-22 【Docker 新手入门指南】第七章:镜像使用
- 2025-05-22 使用Docker制作OpenJDK镜像
- 2025-05-22 使用Dockerfile build镜像
- 2025-05-22 一文详解Docker轻量级虚拟化,镜像和容器
- 2025-05-22 三 docker 镜像命令
- 2025-05-22 Docker-使用Dockerfile 定制镜像
- 2025-05-22 Linux日常小技巧Docker打包
- 2025-05-22 使用Dockerfile制作自己的docker镜像
- 2025-05-22 使用dockerfile构建docker镜像
- 05-22离线在docker镜像方式部署ragflow0.17.2
- 05-22【Docker 新手入门指南】第七章:镜像使用
- 05-22使用Docker制作OpenJDK镜像
- 05-22使用Dockerfile build镜像
- 05-22一文详解Docker轻量级虚拟化,镜像和容器
- 05-22三 docker 镜像命令
- 05-22Docker-使用Dockerfile 定制镜像
- 05-22Linux日常小技巧Docker打包
- 最近发表
- 标签列表
-
- newcoder (56)
- 字符串的长度是指 (45)
- drawcontours()参数说明 (60)
- unsignedshortint (59)
- postman并发请求 (47)
- python列表删除 (50)
- 左程云什么水平 (56)
- 计算机网络的拓扑结构是指() (45)
- 编程题 (64)
- postgresql默认端口 (66)
- 数据库的概念模型独立于 (48)
- 产生系统死锁的原因可能是由于 (51)
- 数据库中只存放视图的 (62)
- 在vi中退出不保存的命令是 (53)
- 哪个命令可以将普通用户转换成超级用户 (49)
- noscript标签的作用 (48)
- 联合利华网申 (49)
- swagger和postman (46)
- 结构化程序设计主要强调 (53)
- 172.1 (57)
- apipostwebsocket (47)
- 唯品会后台 (61)
- 简历助手 (56)
- offshow (61)
- mysql数据库面试题 (57)