离线内网部署Docker核心是“装得稳、管得住、用得久”:需先完成环境摸底(内核≥3.10、架构/系统识别、资源核查),再预置校验包、分层安装(底层依赖先行+静默强制)、适配SELinux策略,最后配置内网registry-mirrors、锁定overlay2驱动、设置shm-size,并通过本地镜像导入或离线多阶段构建部署Java应用。

在离线内网环境中部署 Docker,核心不是“能不能装”,而是“装得稳、管得住、用得久”。金融、政务、军工类系统常见这类环境,不能联网下载、不能自动更新、权限和审计要求极高。高效的关键在于:提前预置、精准匹配、最小依赖、一次到位。
一、环境摸底与物料清单必须做全
别跳过这步——90%的失败源于前期信息不准。先在目标服务器上执行三组命令确认基线:
-
内核与模块:运行
uname -r确认 ≥3.10;lsmod | grep overlay检查 overlay2 支持;若无,需提前准备内核模块 RPM 包并加载 -
架构与系统:用
uname -m和cat /etc/os-release明确是 x86_64 还是 aarch64、CentOS 7.9 还是统信UOS V20,不同组合对应不同安装包 -
硬件资源:
free -h查内存(建议 ≥4GB),df -h /var/lib/docker查磁盘(建议 ≥20GB,生产环境推荐挂独立分区)
所有安装包(Docker CE RPM、containerd、runc、selinux-policy、libseccomp)、验证脚本、启动模板,统一打包为 docker-offline-pkg-v24.0.7-202607.tar.gz 命名,带 SHA256 校验值,避免传输损坏。
二、离线安装必须绕过依赖陷阱
直接 rpm -ivh 很容易报 “failed dependencies”。正确做法是分两层安装:
立即学习“Java免费学习笔记(深入)”;
-
底层依赖先行:提前在同版本测试机上运行
rpm -qpR docker-ce-*.rpm | grep "not found",导出缺失依赖列表(如 libseccomp-2.5.4-1.el7.x86_64.rpm),一并拷入内网 -
静默强制安装:用
rpm -ivh --nodeps --force *.rpm安装主包,再用rpm -Uvh --force补齐依赖,最后systemctl daemon-reload && systemctl enable docker -
SELinux 处理:若启用了 SELinux,不建议直接 disable,改用
setsebool -P container_manage_cgroup on+ 加载container-selinux策略包,兼顾安全与兼容
三、启动配置要适配内网实际场景
默认配置在离线环境易出问题,关键项必须显式设置:
-
镜像仓库代理:编辑
/etc/docker/daemon.json,添加"registry-mirrors": ["https://harbor.internal:8443"](指向内网 Harbor),禁用live-restore避免守护进程异常时容器失控 -
存储驱动锁定:明确指定
"storage-driver": "overlay2",避免首次启动时自动选错驱动导致数据目录初始化失败 -
shm 分区大小:Selenium 或 Java 应用常因共享内存不足崩溃,务必加
"default-runtime": "runc", "runtimes": { "runc": { "path": "runc" } }, "shm-size": "2g"
配置完执行 systemctl restart docker && docker info | grep -E "(Storage|Registry|Shm)" 验证生效。
四、Java 应用部署要避开常见坑
离线环境下,Java 镜像构建不能依赖网络拉取基础镜像。推荐两种可靠路径:
-
本地镜像导入法:在跳板机拉取
eclipse-temurin:17-jre-jammy,docker save -o openjdk17.tar,内网docker load -i openjdk17.tar,Dockerfile 中直接 FROM 该镜像名 -
多阶段构建离线化:把 Maven 构建阶段也做成离线——提前下载好
maven-3.8.6-bin.zip和完整~/.m2/repository本地仓库,COPY 进构建阶段容器复用 -
JVM 参数必加容器感知:启动命令中写死
-XX:+UseContainerSupport -XX:MaxRAMPercentage=75.0,防止 Java 错估可用内存引发 OOM
验证时用 docker run --rm openjdk17:latest java -version 和 docker run --rm -v /proc:/hostproc:ro openjdk17:latest cat /hostproc/meminfo | head -2 确认容器内内存可见性正常。


















