离线docker部署的核心是提前在外网构建并打包镜像、运行时文件和配置脚本为可移动交付包,再在目标机无网络加载运行;需包含镜像归档、运行时支撑文件、部署脚本三要素,并遵循构建、打包、部署、验证四步流程。

在没有外网连接的生产环境中,用 Docker 实现软件部署的关键不是“能不能跑容器”,而是“如何把镜像、依赖、配置和运行时环境完整、可靠、可复现地搬进去”。核心思路是:提前在外网环境完成所有构建与打包,生成可移动的离线交付包,再在目标机器上无网络加载运行。
一、离线部署的核心三要素
缺一不可:
-
镜像归档包:将所需镜像导出为 tar 文件(
docker save),而非仅保存 Dockerfile——后者在离线环境无法 build。 - 运行时支撑文件:Docker 二进制、systemd service 文件(如需自启)、基础依赖(如 containerd、runc,通常系统已预装,但需确认版本兼容性)。
- 部署脚本与配置模板:含镜像加载、容器创建、端口/卷/网络配置、健康检查等逻辑,避免人工逐条敲命令出错。
二、实操四步走(以 Nginx + 自定义静态页为例)
前提:有一台能联网的“构建机”(Linux,已装 Docker);目标机为同架构(如 x86_64)CentOS 7/8 或 Ubuntu 20.04+,已安装 Docker(可离线安装包提前部署)。
步骤1:构建并导出镜像
- 写好
Dockerfile(含 COPY 静态资源、暴露端口、非 root 启动等) - 构建镜像:
docker build -t my-nginx:v1.0 . - 导出为单文件:
docker save my-nginx:v1.0 > my-nginx-v1.0.tar
步骤2:打包配套内容到一个目录
- 新建
offline-deploy/目录 - 放入:
my-nginx-v1.0.tar、start.sh(含docker load和docker run命令)、nginx.conf(若需覆盖默认配置)、html/(静态文件目录) - 压缩:
tar -czf nginx-offline-v1.0.tgz offline-deploy/
步骤3:在目标机执行部署
- 解压:
tar -xzf nginx-offline-v1.0.tgz - 加载镜像:
docker load - 执行启动脚本:
chmod +x offline-deploy/start.sh && ./offline-deploy/start.sh
步骤4:验证与固化
- 检查容器:
docker ps | grep my-nginx - 访问宿主机 IP:8080(按脚本中指定端口)看页面是否正常
- 将
start.sh中的docker run命令转为 systemd service(如/etc/systemd/system/my-nginx.service),启用开机自启
三、进阶注意事项
真实生产环境常遇到这些情况,提前处理可少踩坑:
-
多镜像依赖:如应用镜像依赖 Redis、PostgreSQL。用
docker save img1 img2 img3 > all-images.tar一次性导出,或分别导出后在脚本中循环docker load。 -
镜像层缓存不生效:离线环境无法拉取 base 镜像(如
ubuntu:22.04)。务必用docker pull提前拉取所有 base 镜像并包含在 tar 包中。 -
配置与敏感信息分离:不要把密码、密钥写死在镜像里。用
docker run -v /host/config:/app/config挂载外部配置,或通过--env-file加载环境变量文件(该文件也放进离线包)。 -
镜像瘦身与合规:使用
scratch或alpine基础镜像;移除构建工具、文档、包管理器缓存(apt clean && rm -rf /var/lib/apt/lists/*);扫描漏洞(trivy image)后再导出。
四、推荐最小化交付结构示例
一个清晰可维护的离线包长这样:
nginx-offline-v1.0/ ├── images/ │ └── my-nginx-v1.0.tar # 主应用镜像 ├── configs/ │ ├── nginx.conf # 自定义 Nginx 配置 │ └── env.list # 环境变量(DB_HOST=10.0.1.10) ├── data/ │ └── html/ # 静态资源(可选,也可挂载宿主机路径) ├── scripts/ │ ├── load.sh # 加载所有 images/*.tar │ ├── start.sh # 创建并启动容器(含 --restart=always) │ └── stop.sh # 安全停止 └── README.md # 版本、端口、挂载点、升级说明
离线 Docker 部署不是黑魔法,本质是“把构建阶段前置、把不确定性锁死”。只要流程标准化、包结构清晰、每次交付带完整验证清单,就能在断网机房里稳稳跑起现代应用。










