当前位置: 首页 > news >正文

Docker 镜像拉取与离线分发实践

Docker 镜像拉取与离线分发实践

背景

在内网部署、离线交付、跨环境迁移时,常见需求不是直接运行容器,而是先把镜像拉到本地,再导出成文件发给其他人。

这类场景下,最稳妥的流程通常是:

  1. docker pull将目标镜像拉到本地
  2. docker save将镜像导出为.tar
  3. 按统一命名规则整理文件
  4. 将导出的包分发给目标环境
  5. 对方使用docker load导入

本文整理一套可直接复用的操作方式。

核心命令

拉取镜像:

dockerpull 镜像名:tag

导出镜像:

dockersave-omyimage.tar 镜像名:tag

例如:

dockerpull nginx:latestdockersave-onginx--latest.tar nginx:latest

为什么用docker save

docker save导出的是镜像本身,适合做离线分发。

它和下面几种方式的区别需要分清:

  • docker save
    导出镜像,适合发送给别人导入。
  • docker export
    导出容器文件系统,不保留镜像层和元数据,通常不适合镜像分发。
  • 直接拷贝 Docker Desktop 的底层磁盘文件
    不适合单镜像交付,文件大且不可控。

如果目标是“把某个镜像发给别人用”,优先选docker save

命名规则

为了便于识别和批量管理,可以将导出文件命名为:

镜像名最后一个 path--tag.tar

例如:

docker.io/library/nginx:latest

导出后命名为:

nginx--latest.tar

再例如:

docker.io/library/mysql:8.0

导出后命名为:

mysql--8.0.tar

这个规则的优点很直接:

  • 文件名短,适合分发
  • 能保留服务名和版本号
  • 比把完整仓库路径塞进文件名更清晰

单个镜像导出

下面是一套最小操作:

image="nginx:latest"repo="${image%:*}"tag="${image##*:}"name="${repo##*/}"dockerpull"$image"dockersave-o"${name}--${tag}.tar""$image"

执行后会生成:

nginx--latest.tar

批量导出镜像

如果镜像很多,手工执行容易出错。更实用的做法是写一个简单脚本。

#!/usr/bin/env bashset-uout_dir="./web-images"mkdir-p"$out_dir"images=("nginx:latest""mysql:8.0""redis:7.2")forimagein"${images[@]}";dorepo="${image%:*}"tag="${image##*:}"name="${repo##*/}"tar_path="${out_dir}/${name}--${tag}.tar"echo"===$image==="dockerpull"$image"||continuedockersave-o"$tar_path""$image"||continueecho"SAVED ->$tar_path"done

这个脚本的特点是:

  • 逻辑简单,便于维护
  • 目录按用途分开,比如web-imagesdb-images
  • 文件名统一
  • 某个镜像失败不会阻塞后续镜像

实际整理方式

如果项目里存在多套业务镜像,建议按目录区分:

web-images/ nginx--latest.tar redis--7.2.tar db-images/ mysql--8.0.tar postgres--16.tar

这样比全部堆在一个目录里更好管理,尤其适合:

  • 按系统交付
  • 按环境备份
  • 按项目归档

常见问题

1.docker save生成的是不是“压缩包”

严格来说,docker save生成的是.tar包,不一定是压缩过的。

如果你还想进一步压缩,可以再执行:

gzipnginx--latest.tar

压缩后会变成:

nginx--latest.tar.gz

但很多场景下,直接保留.tar就已经够用了。

2. 为什么docker pull会提示unauthorized

这通常不是命令写错,而是仓库权限问题。常见原因有:

  • 没有执行docker login
  • 当前账号没有目标仓库拉取权限
  • 镜像路径写错
  • tag 不存在

遇到这种情况,先确认:

dockerlogin

然后再重试docker pull

3.docker save会不会带上容器运行时的数据

不会。

docker save只导出镜像,不包含容器运行过程中写入的数据卷内容。

如果你需要一起迁移业务数据,还要额外处理:

  • Docker volume
  • 挂载目录
  • 数据库备份

4. 对方如何使用导出的镜像

对方收到.tar后,直接执行:

dockerload-inginx--latest.tar

导入完成后,可通过下面命令确认:

dockerimages

推荐的交付流程

比较稳妥的一套流程如下:

  1. 整理镜像清单
  2. 创建分类目录,例如web-imagesdb-images
  3. 批量执行docker pull
  4. 服务名--版本.tar导出
  5. 校验导出文件是否齐全
  6. 如有需要,再统一压缩或打总包
  7. 交付对方使用docker load导入

一套可直接复用的模板

#!/usr/bin/env bashset-uout_dir="./images"mkdir-p"$out_dir"images=("镜像1:tag""镜像2:tag""镜像3:tag")forimagein"${images[@]}";dorepo="${image%:*}"tag="${image##*:}"name="${repo##*/}"tar_path="${out_dir}/${name}--${tag}.tar"echo"pull ->$image"dockerpull"$image"||{echo"pull failed:$image"continue}echo"save ->$tar_path"dockersave-o"$tar_path""$image"||{echo"save failed:$image"continue}done

总结

如果目标是做离线交付,最实用的办法就是:

docker pull -> docker save -> 统一命名 -> 分类归档 -> docker load

这里最关键的不是命令本身,而是两点:

  • 命名规则要统一
  • 目录结构要清晰

当镜像数量一多,规范化管理比单次执行更重要。

http://www.jsqmd.com/news/1101907/

相关文章:

  • 06.30.每日总结
  • Twitter营销如何获取精准流量?技巧分析
  • 11 收发数据的正确姿势
  • HunterPie游戏内存监控系统架构解析与插件开发实践
  • 深度解析pk3DS:打造专属宝可梦3DS游戏的终极编辑器
  • 回收化学原料单位
  • 反序列化漏洞挖掘实战:从原理到RCE利用链的完整指南
  • Keep:如何用开源AIOps平台终结运维团队的“警报疲劳“噩梦?
  • 现在制造业行业竞争这么大,机床照明灯还值得投入吗?
  • 2026年7月最新《传奇3光通版》官网正版下载指南,忆东怀旧手游官方渠道详解
  • Fan Control终极指南:免费Windows风扇控制软件完全掌控手册
  • 【GitHub Copilot 实战速成指南】:20年开发老炮亲授,7天从入门到日均提效3小时
  • 终极指南:5分钟上手HunterPie,让你的《怪物猎人:世界》体验全面升级
  • 数据库日志显示系统
  • 企业级部署必看,ChatGPT Memory配置陷阱清单,7类致命错误正在 silently corrupt your history
  • ChatGPT Enterprise vs API订阅 vs Custom Model:TCO测算表曝光,中小团队必须在Q3前完成迁移
  • Pytest UI自动化测试框架实战:从PO模型到CI/CD集成
  • 080、DCNv2 插入 Neck 的 P3 和 P4 层:对多尺度目标形状变化的鲁棒性测试
  • 顺义国医院肠胃病特色诊疗医生列表
  • Nginx 安装
  • 如何用ROFL-Player轻松播放英雄联盟旧版本回放:终极免费解决方案
  • HS2-HF Patch:一站式解决方案,让HoneySelect2汉化与MOD管理变得简单高效
  • macbook应用卡顿怎么办
  • 从写Hello World到重构微服务:Copilot渐进式学习路径图,新手→高级工程师的4阶跃迁路线
  • 会展导览电子地图怎么做?懒图科技进博会方案解析
  • Anthropic Messages API:LLM应用中间件层为何正在归零
  • Kafka-UI权限最小化实战:3种企业级安全部署模式深度解析
  • Select-Additive Learning:小数据多模态情感分析里的“身份捷径”怎么拆掉
  • 一、ThreadPoolExecutor vs ThreadPoolTaskExecutor
  • 基于甲基化芯片与靶向捕获测序的DNA甲基化分析技术综述