前段时间做一个项目交付时,我又遇到了那个熟悉的问题:
客户现场是内网环境,服务器不能直接访问外部镜像仓库。
这句话看起来轻飘飘,但真正做过现场部署的人都知道,这意味着很多平时习以为常的命令,在现场都失效了。
平时在开发环境里,我们习惯了:
docker pull xxx
docker compose up -d
镜像拉下来,服务起起来,很多问题都能在线解决。

但一旦到了客户现场,现实就完全不一样了:
- 服务器不通公网
- 镜像仓库无法访问
- 依赖镜像多,手工处理很容易漏
- 文件大,传输慢,还可能中途损坏
- 现场时间紧,部署窗口有限,容错率极低
这种时候,真正考验的不是"会不会写 Docker 命令",而是:
你有没有一套适合内网交付的、稳定可复用的离线部署方案。
现场最怕的,不是不会部署,而是部署过程不可控
一开始,很多人会觉得这事简单:
没网就提前把镜像导出来,拷过去再
docker load不就行了吗?
听起来没毛病,但真落到实际操作,问题一个接一个:
1. 镜像多,手工导出很容易出错
如果一个系统涉及 Web、存储、中间件、检索、消息队列、文档预览、模型服务等多个组件,镜像数量往往不是 1 个,而是一组。
只靠手工一条一条执行:
erlang
docker save ...
docker save ...
docker save ...
很容易漏掉某个依赖镜像,现场才发现服务起不来。
2. 文件太大,不方便传输
有些镜像压缩后依然很大,直接传一个整包既慢又不稳定。 一旦拷贝过程中损坏,到了目标机器再发现,时间就浪费掉了。
3. 到了目标机器,不知道镜像是否完整
很多部署事故,不是因为命令不会,而是因为:
- 包损坏了但没发现
- 分卷文件少了一段
- 导入顺序混乱
- 导入完成后没有统一校验
最后表现出来就是: "明明 load 过了,怎么服务还是起不来?"

后来我换了思路:把"镜像交付"当成一套标准流程来做
从那之后,我不再把镜像导出导入当成临时操作,而是把它当成一套可标准化、可重复执行、可交付复用的流程。
我的思路很简单:
导出端做四件事
- 自动整理需要的镜像
- 统一导出并压缩
- 超过阈值自动分卷
- 自动生成校验文件
导入端也做四件事
- 自动校验包完整性
- 自动合并分卷
- 自动导入镜像
- 自动检查导入结果
这样做的好处非常直接:
- 减少手工操作
- 避免遗漏镜像
- 提升内网现场部署成功率
- 让交付过程更可控
- 同一套方案可以复用到不同项目环境
说白了,客户现场最需要的不是"你会不会命令",而是:
你能不能把复杂、易错、重复的操作,收敛成一套稳定的一键化流程。

为什么内网部署场景下,镜像导入导出一定要"标准化"?
因为内网部署最怕三件事:
第一,环境不可重来
很多客户现场没有那么多试错机会。 你今天部署失败,未必还有第二个完整窗口给你慢慢排查。
第二,信息传递容易失真
如果交付依赖"口口相传":
- 哪几个镜像要导出
- 哪几个包要先传
- 哪个镜像大于 2G 要分卷
- 导入前先不先校验
只要换个人接手,过程就容易变形。
第三,现场最缺的是时间
到了现场,最有价值的不是"继续手搓命令",而是:
把部署动作压缩到最短,把风险降到最低。
所以我后来越来越坚持一个观点:
内网环境下的 Docker 部署,本质上不是技术炫技,而是工程交付能力。
我的做法:把离线镜像交付做成"一键导出 + 一键导入"
后来我把整个流程整理成了两部分:
一套一键导出方案
在有网或已有镜像的环境中,自动完成:
- 镜像存在性检查
- 缺失镜像自动拉取
- 导出为标准 tar 包
- 压缩
- 大文件自动分卷
- 生成校验文件
- 输出清晰日志
一套一键导入方案
在目标内网机器中,自动完成:
- 包校验
- 分卷合并
- 镜像导入
- 结果检查
这套方式最让我满意的点,不是"命令更短了",而是:
部署过程从"靠人记忆"变成了"靠流程执行"。
这对交付来说非常关键。

为什么我更推荐离线镜像包,而不是现场临时处理?
因为离线镜像包有几个天然优势:
1. 通用性强
Docker 标准镜像包几乎在任何 Linux 服务器上都能处理,不依赖复杂环境。
2. 可验证
做完压缩和校验后,文件在传输过程是否损坏,一眼就能看出来。
3. 适合大文件传输
大于阈值自动分卷后,无论是移动硬盘、局域网拷贝,还是其他离线传输方式,都更稳。
4. 恢复简单
到目标机器后,只需要按标准流程执行即可,不需要临场重新组织一遍思路。
这也是为什么我现在做内网项目时,几乎都会提前把镜像交付链路准备好。
这套方案最适合哪些场景?
我觉得至少适合下面几类场景:
1. 客户现场完全不通公网
这是最典型的情况,也是最刚需的情况。
2. 金融、政企、制造等隔离网络环境
这类环境往往对外网访问控制严格,镜像拉取能力受限,提前准备离线部署方案非常有必要。
3. 多组件服务交付
当你的系统不是单一服务,而是一整套组件协同运行时,镜像导出导入就更应该做成标准流程。
4. 需要重复交付、跨环境复用
同一套系统可能部署在测试环境、预生产环境、生产环境,甚至多个客户现场。 这时候,一套可复制的一键方案价值就出来了。
技术之外,我越来越在意"交付体验"
以前我更关注的是:
- 服务能不能跑起来
- 接口能不能调通
- 容器是不是 healthy
但后来做项目多了,我开始更在意另一件事:
交付体验。
什么叫交付体验?
就是客户在看你部署的时候,感受到的是:
- 过程清晰
- 操作可解释
- 风险可控
- 出问题能快速定位
- 整体不像"现场拼命救火",而像"已经准备好了标准方案"
这种感受其实很重要。 因为它不只是影响一次部署是否成功,也影响对方对你技术能力、工程能力、项目成熟度的判断。
而内网 Docker 镜像一键导入导出,本质上就是在提升这种交付体验。
我没有公开完整脚本,但核心思路可以分享
出于项目交付和实际使用场景考虑,文中就不直接贴完整的一键脚本了。
原因也很简单:
- 每家公司环境不一样
- 每个客户现场网络策略不同
- 镜像规模不同
- 存储路径、分卷策略、校验方式也可能不同
所以我更建议把它理解成一套方法论 + 工程化脚本方案,而不是单纯复制几行命令。
如果你自己做过内网交付,其实会知道,真正有价值的往往不是某一条命令,而是:
怎么把整个过程设计得更稳、更省时间、更不容易出错。
最后
如果你也经常遇到下面这些问题:
- 客户现场没有外网,镜像拉不下来
- Docker 镜像太大,传输和分发麻烦
- 多组件部署容易漏镜像
- 现场交付压力大,想提升部署成功率
- 想把镜像导入导出做成一键化、标准化流程
那这套思路应该会对你有帮助。
我自己踩过不少坑,后来才慢慢把这件事收敛成了可复用方案。 现在回头看,真正有价值的不是"会不会导镜像",而是:
能不能在复杂受限的环境里,把部署这件事做得又稳又快。
如果你也在做类似的内网部署、离线交付、Docker 镜像批量导入导出方案,欢迎交流。 完整的一键化脚本和现场落地经验,我这边目前只做定向沟通。