简介:面向内网或无外网环境的运维人员与开发工程师,该资源提供了一套完整的 Docker 与 Docker Compose 离线安装方案,解决了无互联网连接时部署容器服务的难题。包内共计 22 个文件,包含 20 个经整理的 RPM 依赖包、1 个一键安装脚本以及 docker-compose-linux-x86_64 二进制文件,压缩包总大小约 120.91MB。资源针对 CentOS 7 环境进行了适配,覆盖 docker-ce、cli、containerd.io、rootless-extras 等核心组件及相应运行依赖。已有 4696 人学习下载,适用于企业内网、隔离网络或生产环境中的批量部署与容器环境搭建,安装脚本可帮助快速完成配置,避免手动逐个安装依赖的繁琐过程。 内网环境下装 Docker 这件事,做运维的应该都不陌生。项目跑在隔离网段,机器不能出网,而手边偏偏只有一台能上网的开发机;要装 docker 和 docker-compose,靠yum install docker-ce这种在线方式肯定走不通,网上搜到的教程全是apt install docker.io、curl -fsSL get.docker.com | sh这类,拿到内网环境就是废纸。这篇文章就把我最近一次完整的内网离线安装过程、踩过的坑、以及最后如何验证和自建仓库的细节写清楚,给后面需要在隔离环境复用的人一个参考。
1. 先理清离线安装的整体思路
1.1 为什么离线安装比在线安装更讲究方案选型
在线装 Docker,包管理器会帮我们自动处理依赖关系,一条命令就行,根本不用关心背后装了什么。但离线环境下,所有安装物料都得自己提前准备好带到现场,缺一个依赖就得回头重新折腾。所以方案选型特别关键,不能随手抄网上的办法。
我试过两条路:
- rpm/deb 离线包路线:在联网机器上用
yumdownloader --resolve或dnf download把 docker 及其依赖包全部下载下来,再拷贝到内网机器rpm -ivh *.rpm批量安装。好处是安装后走系统包管理器,卸载、升级都方便;坏处是依赖链太长了,不同系统的包版本差异大,经常出现缺containerd.io或runc某个小版本的情况,排查依赖关系很费劲。 - 官方静态二进制包路线:Docker 官方长期提供
linux/static的 tar.gz 包,一个包里面就包含docker、dockerd、containerd、runc等全部组件,解压即用,几乎不依赖系统环境的动态库。坏处是升级时得手动替换二进制文件和重新加载 systemd 配置。
最终我选了静态二进制包路线。理由很实际:包体积小、依赖少,适合用 U 盘或内网文件服务器分发;而且 tar 包里的组件版本是配套测试过的,冲突概率最低。对于内网环境“一次部署、长期稳定运行”的需求,这是性价比最高的方式。
1.2 准备工作清单:一台能联网的机器加一台内网机器
离线安装需要提前准备的内容不只是 docker 和 docker-compose 这两个安装包,还包括你要跑的镜像。这是我这次动手前整理的任务分解:
| 角色 | 用途 | 需要准备的东西 |
|---|---|---|
| 联网机器(Linux/Windows 均可) | 下载安装包、导出镜像 | docker 二进制包、docker-compose 二进制、目标应用镜像 |
| 内网目标机器 | 离线部署 | 安装包拷贝、U盘或内网共享通道、可用的系统环境 |
| 传输通道 | 将物料从联网机器转移到内网 | U盘、内网 scp/sftp、内网 ftp 或共享目录 |
另外还有几个硬性条件要提前确认:
- 内核版本:Docker 对内核要求是 3.10 以上,建议 4.x 及以上。内网机器如果还是老内核,先升内核再折腾 docker,不然后面 overlay2 存储驱动会报错。
- 系统架构:下载包之前先确认架构。绝大多数服务器是
x86_64,但 ARM 机器也不少,下载时别选错包。 - 防火墙状态:内网机器通常会跑 firewalld 或 iptables,安装 docker 后容器端口映射需要放行相应端口,建议先把策略梳理清楚,否则容器运行正常但外部访问不了,很容易误判成 docker 装坏了。
2. 核心资源准备:在联网机器上下载全部安装物料
2.1 获取 docker 二进制包并校验完整性
Docker 官方静态包下载地址是https://download.docker.com/linux/static/stable/x86_64/。如果网络情况不理想,也可以走阿里的镜像站:https://mirrors.aliyun.com/docker-ce/linux/static/stable/x86_64/。两个源的文件结构和命名规则完全一致,内容都是官方打包产物。
版本选择上我的建议是:不追新,选经过生产环境检验的主流版本。比如 24.0.x 这个系列,社区反馈稳定,各种排障资料也全;没必要一上来上 27.x,虽然功能多,但内网环境没有升级需求,稳定压倒一切。下载命令示例:
# 以 docker-24.0.7.tgz 为例 wget https://download.docker.com/linux/static/stable/x86_64/docker-24.0.7.tgz wget https://download.docker.com/linux/static/stable/x86_64/docker-24.0.7.tgz.sha256 # 校验哈希值,确认下载过程没有损坏 sha256sum -c docker-24.0.7.tgz.sha256一定要做哈希校验这一步。内网传输文件的过程中,U盘拷贝或者网络传输导致文件损坏的情况我遇到过不止一次,如果到了现场解压出来跑不起来,那才是真的绝望。
2.2 获取 docker-compose 二进制文件
现在的 docker-compose 官方推荐的是 v2 版本,它和 v1 最大的区别是:v1 依赖 Python 环境、是一个完整程序;v2 则是用 Go 写的单文件二进制,官方推荐作为 Docker 的 CLI 插件来使用。
下载地址是https://github.com/docker/compose/releases,Linux x86_64 架构对应的文件名一般是docker-compose-linux-x86_64。国内网络访问 GitHub 有时候慢,也可以到国内的一些镜像源找下载。下载后同样做一次 sha256 校验,下载命令示例:
wget https://github.com/docker/compose/releases/download/v2.23.0/docker-compose-linux-x86_64 sha256sum docker-compose-linux-x86_64注意这里下载的是单文件,不需要解压,后续到内网机器上直接赋可执行权限就行。
2.3 提前搬好镜像:docker save 导出离线镜像包
安装包只是第一步,更关键的是要用的应用镜像。内网环境无法从 Docker Hub 拉镜像,所以必须在联网机器上把镜像下载好、打包带走。
这一步的原则是:能用 docker save 就尽量别用 docker export。docker save保存的是镜像的完整层结构和历史元数据,docker load加载之后镜像跟原版一模一样;docker export导出的只是容器文件系统快照,会丢掉镜像的层信息,加载后是一个不完整镜像,无法用于后续构建和依赖继承。
举个例子,我需要在内网跑 mysql 和 redis:
# 在联网机器上拉取镜像 docker pull mysql:8.0 docker pull redis:7.0 # 导出为 tar 包,可以一次带多个镜像 docker save -o mysql-8.0.tar mysql:8.0 docker save -o redis-7.0.tar redis:7.0 # 也可以用一条命令打包多个镜像 docker save -o app-images.tar mysql:8.0 redis:7.0 # 打 tar 包时建议再压缩一层,内网拷贝能省不少时间 gzip app-images.tar导出的 tar 包是压缩的关键物料,一定要单独放在一个目录里。我一般会顺手写一个README.txt,把镜像名称、tag、对应的 tar 文件名、sha256 值都记录下来,到了现场不用临时回忆,这个习惯后面会救你一命。
3. 内网目标机器安装实操
3.1 解压 docker 二进制并配置 systemd 服务
先把所有物料上传到内网机器上,我习惯统一放在/root/docker-deploy/目录下,目录结构清晰方便排查。然后是正式安装步骤。
# 1. 进入部署目录,解压 docker 二进制包 cd /root/docker-deploy/ tar xf docker-24.0.7.tgz # 2. 解压得到 docker 目录,里面是完整的 docker 组件 # 将二进制文件复制到系统 PATH 目录 cp docker/* /usr/bin/ # 3. 验证版本 docker --version dockerd --version这里有个容易忽略的点:解压出来的目录里除了 docker 和 dockerd,还有 containerd、containerd-shim-runc-v2、runc、docker-init、docker-proxy 等文件,必须全部复制到/usr/bin下,不能只拷贝 docker 一个文件。否则 dockerd 启动时会因为这些辅助组件缺失而失败。
接着配置 systemd 管理 docker 服务,让它在开机时自动启动:
cat > /etc/systemd/system/docker.service <<EOF [Unit] Description=Docker Application Container Engine Documentation=https://docs.docker.com After=network-online.target firewalld.service containerd.service Wants=network-online.target [Service] Type=notify ExecStart=/usr/bin/dockerd ExecReload=/bin/kill -s HUP \$MAINPID LimitNOFILE=infinity LimitNPROC=infinity LimitCORE=infinity TimeoutStartSec=0 Delegate=yes KillMode=process Restart=on-failure StartLimitBurst=3 StartLimitInterval=60s [Install] WantedBy=multi-user.target EOF启动前最好先建好daemon.json配置文件。即使不配镜像加速,也可以先留一个空配置,把镜像存储目录和存储驱动固定下来,避免以后想改目录时还要迁移数据。我的习惯是:
{ "data-root": "/opt/docker", "storage-driver": "overlay2", "exec-opts": ["native.cgroupdriver=systemd"], "log-driver": "json-file", "log-opts": { "max-size": "100m", "max-file": "3" } }这里建议把>systemctl daemon-reload systemctl enable --now docker systemctl status docker
如果一切正常,status会显示active (running)。再执行docker version做客户端和守护进程的双端验证:
docker version docker infodocker info里重点看 Storage Driver 是不是 overlay2、Cgroup Driver 是不是 systemd、Server Version 是否和下载的版本一致。这些信息都对上了,说明基础环境基本可用。
3.3 安装并验证 docker-compose
docker-compose v2 作为 CLI 插件推荐放的位置是/usr/local/lib/docker/cli-plugins/,同时也可以把它放到/usr/local/bin/下走传统的docker-compose命令。为了兼容两套命令,我的做法是主文件放在 cli-plugins 目录,再做软链接:
# 1. 创建 cli-plugins 目录 mkdir -p /usr/local/lib/docker/cli-plugins # 2. 把 docker-compose 二进制放进去并赋执行权限 cp /root/docker-deploy/docker-compose-linux-x86_64 /usr/local/lib/docker/cli-plugins/docker-compose chmod +x /usr/local/lib/docker/cli-plugins/docker-compose # 3. 做软链接,让 docker-compose 老命令也能用 ln -s /usr/local/lib/docker/cli-plugins/docker-compose /usr/local/bin/docker-compose # 4. 两种方式验证 docker compose version docker-compose --version两个命令都正常输出版本信息,docker-compose 的安装就算完成了。
3.4 导入镜像并启动一个测试容器
镜像导入是最直观的验证手段。把之前导出的 tar 包上传到内网机器,然后执行:
# 可以加 --quiet 参数,导入大镜像时不会刷太多输出 docker load -i mysql-8.0.tar.gz docker load -i redis-7.0.tar.gz # 查看已导入的镜像列表 docker images光是docker images能看到还不够,我一般会跑一个真实容器,确认容器能起、端口能通、日志能输出,才敢把环境交出去。比如拿 redis 做一次快速验证:
docker run -d --name redis-test -p 6379:6379 redis:7.0 docker ps docker logs redis-test看到容器状态是 Up,日志输出正常,这套离线安装的流程才算真正走通。
4. 常见问题与排查技巧实录
4.1 依赖缺失导致 dockerd 启动失败
这是一个高发问题。很多人在第一步解压后只复制了 docker 二进制文件,漏掉了 containerd、runc 等组件,启动 dockerd 的时候报failed to start containerd或者exec: "runc": executable file not found in $PATH。
解决办法也简单:把解压出来的 docker 目录下所有二进制文件全部复制到/usr/bin,不要挑三拣四。我自己的习惯是直接cp docker/* /usr/bin/全量覆盖,省事且稳妥。
4.2 overlay2 存储驱动初始化报错
启动 dockerd 时报Failed to mount overlay2: no such file or directory或者failed to configure storage,多半是内核缺少 overlay 和 br_netfilter 模块。内网离线环境下内核模块需要预先在系统里启用:
# 临时启用 modprobe overlay modprobe br_netfilter # 永久启用,写入模块配置 cat > /etc/modules-load.d/docker.conf <<EOF overlay br_netfilter EOF # 同时开启内核转发参数 cat > /etc/sysctl.d/docker.conf <<EOF net.bridge.bridge-nf-call-iptables = 1 net.ipv4.ip_forward = 1 EOF sysctl --system改完后重新启动 docker 服务,这个问题基本就消失了。如果 modprobe 报模块找不到,那就是内核确实太老,老老实实升级内核吧。
4.3 systemd 已存在旧版本 docker 服务冲突
有些内网机器之前被用脚本部署过 docker,或者系统自带了老版本 docker。这种情况新版本起不来,而且报错还不明显。排查时先看看已有服务:
systemctl list-unit-files | grep -i docker如果有旧的 docker.service 或者旧版本 dockerd 进程,先停掉、禁用、删掉对应的 systemd 文件再重新来。残留的老配置文件daemon.json也可能导致新版本启动异常,建议检查/etc/docker/daemon.json,确认 JSON 格式合法、字段兼容。
4.4 容器端口映射后外部无法访问
docker 容器起来了,docker ps显示端口映射正常,但在不在本机上curl却不通。这个问题表面上是 docker 的问题,实际上往往是防火墙策略没放行。检查目标端口是否在 firewalld 或 iptables 里被拦截:
firewall-cmd --list-ports firewall-cmd --add-port=6379/tcp --permanent firewall-cmd --reload另外确认daemon.json里是否配置了"iptables": false,这个参数一旦被设置为 false,docker 不会自动写入 iptables 规则,端口映射大概率不生效,而且很隐蔽。
4.5 常见问题速查表
| 现象 | 常见原因 | 排查/解决方向 |
|---|---|---|
| dockerd 启动失败,提示找不到 runc | 二进制文件复制不全 | cp docker/* /usr/bin/全部复制 |
| 启动报 overlay2 挂载失败 | 内核缺少模块 | modprobe overlay br_netfilter,确认内核版本 |
| docker compose 命令找不到 | 插件路径或权限不对 | cli-plugins 目录 + chmod +x |
| 容器起不来,报端口被占用 | 端口冲突 | ss -lntp查看占用进程,换映射端口 |
| 镜像 load 报磁盘空间不足 | 根分区空间不够 | df -h查看,修改># 先在有网机器上拉取 registry 镜像并导出 docker pull registry:2 docker save -o registry-2.tar registry:2 # 在内网一台机器上导入并启动私有仓库 docker load -i registry-2.tar docker run -d \ --name registry \ --restart=always \ -p 5000:5000 \ -v /data/registry:/var/lib/registry \ registry:2部署好后,其他内网机器就可以把镜像推送到这台仓库,再通过私网地址直接拉取。对机器数量多、镜像版本要统一管理的内网环境,这比逐个拷 tar 包省力太多。如果环境更正式一点,还可以考虑 Harbor,它自带 UI、权限控制和镜像同步能力,功能强很多,但需要额外的资源,轻量场景没必要。 5.3 docker-compose 在内网使用的几个小细节用 docker-compose 编排服务时,特别注意 我还会在写完后做一次配置校验: 这个命令会解析并输出最终生效的配置,也能检查 YAML 格式和参数引用是否正确。启动时建议加上 说回这次离线安装,最大的体会就是:越是不联网的环境,越要把每个步骤标准化。下载、校验、导出、导入、验证,一个环节乱了都要付出时间代价。我建议第一次做的人把下载好的安装包连同镜像全部打好 tar,再写一个 本文还有配套的精品资源,点击获取
版权声明:
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设
2026/9/8 14:16:05
STM32实战:ADC电阻分压省IO与Modbus浮点传输2. 开头:IO不够用还硬挤,这是我这次调试的真实状态 做嵌入式调试,最怕的不是逻辑复杂,而是资源快用完了还得硬挤。最近在调一块小控制板,主控选的是STM32F103这颗老将,IO口已经排到了极限,原来面…
网站建设
2026/9/8 14:15:33
windows10卸载edge浏览器并将chrome设为默认浏览器windows10卸载edge浏览器注意禁用Edge浏览器更新服务!!!Edge高于93版本禁用Edge更新服务删除更新服务程序删除Edge更新文件卸载Edge浏览器阻止Edge重新安装取消edge别名将chrome设为默认浏览器注意 此操作方法仅适用于Windows10,Windows11 21H2已经无法卸载Edge. 可以使用这个…
网站建设
2026/9/8 14:11:46
ABAP动态SQL安全指南:语法与语义校验方法详解动态 SQL 在 ABAP 开发里一直是个让人又爱又恨的东西。爱它的人觉得它灵活,一条SELECT (lv_sql)能把静态 SQL 写不出来的复杂查询统统搞定;恨它的人踩过几次坑之后,看到动态 SELECT 就条件反射地头皮发麻。别问我是怎么知道的——线上程序半夜…
网站建设
2026/9/8 14:11:43
化学专业毕业论文降重避坑指南,别瞎改试剂参数,找对章节才是关键化学专业毕业论文降重一直是老大难。实验方法、仪器型号、试剂名称都属于固定专业表述,一经查重比对,实验章节重复率轻轻松松突破 50%。不少同学反复修改三四轮,重复率卡在 32% 就再也下不去,眼看着答辩时间一天天逼近,…
网站建设
2026/9/8 14:11:36
阿里云部署OpenClaw智能体:Docker容器化实战指南1. 部署前准备:搞清楚 OpenClaw 是什么,以及为什么要上云端 如果你最近在逛技术社区,应该会发现 OpenClaw(原 Clawdbot)突然成了高频词。简单说,这是一个开源的智能体(Agent)运行框架…
网站建设
2026/9/8 14:11:31
16GB显存跑176B模型:llama.cpp量化与推理优化实战/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … |