客户现场没有外网,Docker 服务怎么部署?

0 阅读8分钟

前段时间做一个项目交付时,我又遇到了那个熟悉的问题:

客户现场是内网环境,服务器不能直接访问外部镜像仓库。

这句话看起来轻飘飘,但真正做过现场部署的人都知道,这意味着很多平时习以为常的命令,在现场都失效了。

平时在开发环境里,我们习惯了:

docker pull xxx
docker compose up -d

镜像拉下来,服务起起来,很多问题都能在线解决。

但一旦到了客户现场,现实就完全不一样了:

  • 服务器不通公网
  • 镜像仓库无法访问
  • 依赖镜像多,手工处理很容易漏
  • 文件大,传输慢,还可能中途损坏
  • 现场时间紧,部署窗口有限,容错率极低

这种时候,真正考验的不是“会不会写 Docker 命令”,而是:

你有没有一套适合内网交付的、稳定可复用的离线部署方案。


现场最怕的,不是不会部署,而是部署过程不可控

一开始,很多人会觉得这事简单:

没网就提前把镜像导出来,拷过去再 docker load 不就行了吗?

听起来没毛病,但真落到实际操作,问题一个接一个:

1. 镜像多,手工导出很容易出错

如果一个系统涉及 Web、存储、中间件、检索、消息队列、文档预览、模型服务等多个组件,镜像数量往往不是 1 个,而是一组。

只靠手工一条一条执行:

docker save ...
docker save ...
docker save ...

很容易漏掉某个依赖镜像,现场才发现服务起不来。

2. 文件太大,不方便传输

有些镜像压缩后依然很大,直接传一个整包既慢又不稳定。 一旦拷贝过程中损坏,到了目标机器再发现,时间就浪费掉了。

3. 到了目标机器,不知道镜像是否完整

很多部署事故,不是因为命令不会,而是因为:

  • 包损坏了但没发现
  • 分卷文件少了一段
  • 导入顺序混乱
  • 导入完成后没有统一校验

最后表现出来就是: “明明 load 过了,怎么服务还是起不来?”


后来我换了思路:把“镜像交付”当成一套标准流程来做

从那之后,我不再把镜像导出导入当成临时操作,而是把它当成一套可标准化、可重复执行、可交付复用的流程。

我的思路很简单:

导出端做四件事

  1. 自动整理需要的镜像
  2. 统一导出并压缩
  3. 超过阈值自动分卷
  4. 自动生成校验文件

导入端也做四件事

  1. 自动校验包完整性
  2. 自动合并分卷
  3. 自动导入镜像
  4. 自动检查导入结果

这样做的好处非常直接:

  • 减少手工操作
  • 避免遗漏镜像
  • 提升内网现场部署成功率
  • 让交付过程更可控
  • 同一套方案可以复用到不同项目环境

说白了,客户现场最需要的不是“你会不会命令”,而是:

你能不能把复杂、易错、重复的操作,收敛成一套稳定的一键化流程。


为什么内网部署场景下,镜像导入导出一定要“标准化”?

因为内网部署最怕三件事:

第一,环境不可重来

很多客户现场没有那么多试错机会。 你今天部署失败,未必还有第二个完整窗口给你慢慢排查。

第二,信息传递容易失真

如果交付依赖“口口相传”:

  • 哪几个镜像要导出
  • 哪几个包要先传
  • 哪个镜像大于 2G 要分卷
  • 导入前先不先校验

只要换个人接手,过程就容易变形。

第三,现场最缺的是时间

到了现场,最有价值的不是“继续手搓命令”,而是:

把部署动作压缩到最短,把风险降到最低。

所以我后来越来越坚持一个观点:

内网环境下的 Docker 部署,本质上不是技术炫技,而是工程交付能力。


我的做法:把离线镜像交付做成“一键导出 + 一键导入”

后来我把整个流程整理成了两部分:

一套一键导出方案

在有网或已有镜像的环境中,自动完成:

  • 镜像存在性检查
  • 缺失镜像自动拉取
  • 导出为标准 tar 包
  • 压缩
  • 大文件自动分卷
  • 生成校验文件
  • 输出清晰日志

一套一键导入方案

在目标内网机器中,自动完成:

  • 包校验
  • 分卷合并
  • 镜像导入
  • 结果检查

这套方式最让我满意的点,不是“命令更短了”,而是:

部署过程从“靠人记忆”变成了“靠流程执行”。

这对交付来说非常关键。


为什么我更推荐离线镜像包,而不是现场临时处理?

因为离线镜像包有几个天然优势:

1. 通用性强

Docker 标准镜像包几乎在任何 Linux 服务器上都能处理,不依赖复杂环境。

2. 可验证

做完压缩和校验后,文件在传输过程是否损坏,一眼就能看出来。

3. 适合大文件传输

大于阈值自动分卷后,无论是移动硬盘、局域网拷贝,还是其他离线传输方式,都更稳。

4. 恢复简单

到目标机器后,只需要按标准流程执行即可,不需要临场重新组织一遍思路。

这也是为什么我现在做内网项目时,几乎都会提前把镜像交付链路准备好。


这套方案最适合哪些场景?

我觉得至少适合下面几类场景:

1. 客户现场完全不通公网

这是最典型的情况,也是最刚需的情况。

2. 金融、政企、制造等隔离网络环境

这类环境往往对外网访问控制严格,镜像拉取能力受限,提前准备离线部署方案非常有必要。

3. 多组件服务交付

当你的系统不是单一服务,而是一整套组件协同运行时,镜像导出导入就更应该做成标准流程。

4. 需要重复交付、跨环境复用

同一套系统可能部署在测试环境、预生产环境、生产环境,甚至多个客户现场。 这时候,一套可复制的一键方案价值就出来了。


技术之外,我越来越在意“交付体验”

以前我更关注的是:

  • 服务能不能跑起来
  • 接口能不能调通
  • 容器是不是 healthy

但后来做项目多了,我开始更在意另一件事:

交付体验。

什么叫交付体验?

就是客户在看你部署的时候,感受到的是:

  • 过程清晰
  • 操作可解释
  • 风险可控
  • 出问题能快速定位
  • 整体不像“现场拼命救火”,而像“已经准备好了标准方案”

这种感受其实很重要。 因为它不只是影响一次部署是否成功,也影响对方对你技术能力、工程能力、项目成熟度的判断。

而内网 Docker 镜像一键导入导出,本质上就是在提升这种交付体验。


我没有公开完整脚本,但核心思路可以分享

出于项目交付和实际使用场景考虑,文中就不直接贴完整的一键脚本了。

原因也很简单:

  • 每家公司环境不一样
  • 每个客户现场网络策略不同
  • 镜像规模不同
  • 存储路径、分卷策略、校验方式也可能不同

所以我更建议把它理解成一套方法论 + 工程化脚本方案,而不是单纯复制几行命令。

如果你自己做过内网交付,其实会知道,真正有价值的往往不是某一条命令,而是:

怎么把整个过程设计得更稳、更省时间、更不容易出错。


最后

如果你也经常遇到下面这些问题:

  • 客户现场没有外网,镜像拉不下来
  • Docker 镜像太大,传输和分发麻烦
  • 多组件部署容易漏镜像
  • 现场交付压力大,想提升部署成功率
  • 想把镜像导入导出做成一键化、标准化流程

那这套思路应该会对你有帮助。

我自己踩过不少坑,后来才慢慢把这件事收敛成了可复用方案。 现在回头看,真正有价值的不是“会不会导镜像”,而是:

能不能在复杂受限的环境里,把部署这件事做得又稳又快。

如果你也在做类似的内网部署、离线交付、Docker 镜像批量导入导出方案,欢迎交流。 完整的一键化脚本和现场落地经验,我这边目前只做定向沟通。