简介:这是一套面向运维工程师、后端开发及需要在无外网环境中部署容器服务的技术人员准备的离线安装资源,重点解决内网服务器无法通过 yum 在线拉取 Docker 及 Docker Compose 的痛点。压缩包内共 22 个文件,以 20 个 rpm 依赖包为主,涵盖 docker-ce、docker-ce-cli、containerd.io、container-selinux、fuse-overlayfs 等核心组件及其依赖,另附 1 个 install.sh 一键安装脚本和 1 个 docker-compose-Linux-x86_64 二进制文件,整体约 120.91MB,覆盖 CentOS 7 环境下从依赖补齐到服务启动的完整链路。目前已有 4706 人学习下载,说明该方案在离线部署场景中具备较高参考价值。借助安装脚本与配套 rpm 包,读者可跳过繁琐的依赖排查,快速完成 Docker 与 Docker Compose 的离线安装,并理解各组件之间的依赖关系,适合作为内网环境容器化部署的实用工具包。
1. 内网离线安装 Docker 与 Docker Compose:一次把依赖、版本和源都理清
在内网环境里装 Docker,最让人头疼的不是 Docker 本身,而是它背后那一串依赖包。我见过太多人拿着yum install docker-ce直接敲,结果卡在cannot find a valid baseurl或者package docker-ce is not available,一卡就是一下午。内网机器没有外网出口,yum 源、apt 源全都指不到公网,所有 rpm 包必须提前在外网机器上下好,再通过 U 盘或者内部文件服务器传进去。这套流程在金融、制造、政务类内网里非常常见,装一次能管很久,但第一次装的时候,版本选错、依赖漏掉、Compose 二进制权限没给对,每一个都是能让你加班到深夜的坑。这篇笔记记录的是我在 CentOS 7 和 Ubuntu 20.04 两套内网环境里反复验证过的离线安装流程,从版本选择、依赖下载、安装配置到最后的验证跑通,每一步都有命令和参数说明,照着走能少踩很多坑。
2. 离线安装前的环境盘点:版本、依赖与下载清单
2.1 先确认系统版本和内核,别急着下包
内网机器五花八门,有 CentOS 7.6、7.9,也有 Ubuntu 18.04、20.04,甚至还有麒麟、统信这类国产化系统。Docker 对内核有硬性要求,CentOS 7 需要内核 3.10 以上,Ubuntu 20.04 自带 5.4 内核完全没问题。先跑这两条命令把底摸清:
# 查看系统发行版和版本号 cat /etc/os-release # 查看内核版本,Docker 要求 3.10 以上 uname -r/etc/os-release里的ID和VERSION_ID决定了你后面下哪个平台的 rpm 包。CentOS 7 对应el7,CentOS 8 对应el8,Ubuntu 20.04 对应focal,Ubuntu 18.04 对应bionic。我一般会在外网机器上建一个目录,按系统-版本-架构命名,比如centos7-x86_64、ubuntu2004-amd64,把对应的包分开放,传进内网的时候不容易搞混。
注意:如果内网机器是 ARM 架构(比如鲲鹏、飞腾),下载的 rpm 或 deb 包必须是
aarch64或arm64版本,x86_64 的包装不上,会报package architecture does not match。
2.2 Docker 版本怎么选:稳定优先,别追新
Docker 的版本号规则是年份.月份.补丁,比如20.10.24、24.0.7。内网环境我一般推荐两个版本:CentOS 7 用20.10.24,Ubuntu 20.04 用24.0.7。为什么这么选?20.10.x是 Docker 最后一个支持 CentOS 7 的长期维护版本,再往上23.x、24.x对 CentOS 7 的内核和containerd版本要求更高,容易出兼容问题。Ubuntu 20.04 内核够新,直接上24.0.7没问题,docker compose插件也能直接用。
下载的时候需要三个核心组件:docker-ce、docker-ce-cli、containerd.io。如果是 CentOS,还需要docker-ce-rootless-extras和docker-buildx-plugin,但内网环境一般用不上 rootless,可以不下。Compose 单独下二进制文件docker-compose-linux-x86_64,版本选v2.24.5,这个版本稳定,支持docker compose和docker-compose两种调用方式。
2.3 依赖包清单:用yumdownloader或apt-get download一次拉全
CentOS 下最省事的办法是在一台能联网的 CentOS 7 机器上装yum-utils,然后用yumdownloader把依赖一起拉下来:
# 安装 yum-utils,提供 yumdownloader 和 repotrack 工具 yum install -y yum-utils # 下载 docker-ce 及其所有依赖到当前目录 yumdownloader --resolve --destdir=./docker-offline \ docker-ce-20.10.24 \ docker-ce-cli-20.10.24 \ containerd.io-1.6.28--resolve是关键参数,它会自动把依赖树里的包全部下载下来,不用你一个个手动找。--destdir指定输出目录,下载完你会看到docker-ce-20.10.24-3.el7.x86_64.rpm、containerd.io-1.6.28-3.1.el7.x86_64.rpm以及libcgroup、policycoreutils-python等依赖包。Ubuntu 下用apt-get download配合apt-cache depends手动拉依赖,稍微麻烦一点,但思路一样:先apt-get install --download-only把包缓存到/var/cache/apt/archives/,再一起拷走。
提示:下载完记得核对文件数量和大小,我一般会
ls -lh看一眼,再md5sum生成校验文件一起带进内网,防止传输过程中文件损坏。
3. 离线安装 Docker:rpm 与 deb 两种装法及参数取舍
3.1 CentOS 7 离线安装:rpm -ivh与yum localinstall的区别
把下载好的 rpm 包传到内网机器上,比如放在/opt/docker-offline/目录。安装有两种方式:
# 方式一:直接用 rpm 安装,按依赖顺序一个个装 cd /opt/docker-offline rpm -ivh containerd.io-1.6.28-3.1.el7.x86_64.rpm rpm -ivh docker-ce-cli-20.10.24-3.el7.x86_64.rpm rpm -ivh docker-ce-20.10.24-3.el7.x86_64.rpm # 方式二:用 yum localinstall,自动处理依赖关系 yum localinstall -y *.rpm我一般推荐方式二,yum localinstall会自动分析 rpm 包之间的依赖关系,按正确顺序安装,省得你手动排顺序。方式一如果顺序错了,会报Failed dependencies,比如先装docker-ce再装containerd.io就会失败。-y参数是自动确认,内网环境不用交互。
安装完成后验证一下:
# 查看 docker 版本信息 docker version # 查看 docker 服务状态 systemctl status docker如果docker version只显示 Client 不显示 Server,说明dockerd没起来,先systemctl start docker再试。
3.2 Ubuntu 20.04 离线安装:dpkg -i的依赖坑
Ubuntu 下用dpkg -i安装 deb 包,但dpkg不会自动解决依赖,缺依赖会报dependency problems。正确的做法是先把所有 deb 包放一个目录,然后:
# 进入 deb 包目录 cd /opt/docker-offline # 用 dpkg 批量安装,-i 表示 install,-R 表示递归目录 dpkg -i -R ./ # 如果报依赖错误,用 apt-get 修复 apt-get install -f -yapt-get install -f会尝试修复缺失的依赖,但内网环境如果 apt 源不可用,这一步会失败。所以更稳妥的办法是在外网机器上就把依赖拉全,用apt-get download把libc6、libdevmapper1.02.1、libsystemd0这些底层依赖一起下好。我踩过一次坑:内网 Ubuntu 机器缺libdevmapper1.02.1,dpkg -i装完 Docker 起不来,报error while loading shared libraries: libdevmapper.so.1.02.1,最后从外网机器上单独下了这个包才解决。
3.3 配置 Docker 守护进程:daemon.json里三个必改项
装完 Docker 只是第一步,默认配置在内网环境里基本不能用。需要改/etc/docker/daemon.json:
{ "data-root": "/data/docker", "log-driver": "json-file", "log-opts": { "max-size": "100m", "max-file": "3" }, "insecure-registries": ["registry.internal.local:5000"], "exec-opts": ["native.cgroupdriver=systemd"] }>systemctl daemon-reload systemctl restart docker systemctl enable docker
daemon-reload是让 systemd 重新加载配置文件,enable是设置开机自启,内网机器重启后 Docker 自动起来,省得每次手动敲。
4. 离线安装 Docker Compose:二进制文件与插件两种方式
4.1 二进制安装:docker-compose独立命令
Compose 的离线安装最简单,因为它就是一个静态编译的二进制文件。把docker-compose-linux-x86_64传到内网,然后:
# 移动到系统 PATH 目录,改名为 docker-compose mv docker-compose-linux-x86_64 /usr/local/bin/docker-compose # 赋予可执行权限,这一步漏了会报 Permission denied chmod +x /usr/local/bin/docker-compose # 验证版本 docker-compose --version/usr/local/bin/默认在PATH里,放这里全局都能调用。chmod +x是必须的,我见过有人传完文件直接敲docker-compose,报bash: /usr/local/bin/docker-compose: Permission denied,查了半天以为是文件损坏,其实就是没给执行权限。
4.2 插件安装:docker compose子命令方式
Docker 24.x 开始推荐用docker compose插件方式,安装路径不一样:
# 创建 cli-plugins 目录 mkdir -p /usr/local/lib/docker/cli-plugins # 把二进制文件放进去,命名规则必须是 docker-compose mv docker-compose-linux-x86_64 /usr/local/lib/docker/cli-plugins/docker-compose # 赋予执行权限 chmod +x /usr/local/lib/docker/cli-plugins/docker-compose # 验证,注意是 docker compose 中间有空格 docker compose version插件方式的目录是/usr/local/lib/docker/cli-plugins/,文件名必须是docker-compose,Docker 启动时会自动扫描这个目录。两种方式可以共存,但建议只用一种,避免版本混乱。我一般在内网统一用二进制方式,因为兼容性好,CentOS 7 和 Ubuntu 20.04 都能跑。
4.3 配置 Compose 环境变量与默认文件
Compose 默认读取当前目录的docker-compose.yml,也支持.env文件定义变量。内网环境经常需要改镜像地址,可以在.env里统一配:
# .env 文件内容 REGISTRY=registry.internal.local:5000 TAG=20240101然后在docker-compose.yml里引用:
services: web: image: ${REGISTRY}/myapp:${TAG} ports: - "8080:80"这样换环境只需要改.env,不用动docker-compose.yml。docker-compose --env-file custom.env up -d可以指定自定义环境文件,-d是后台运行。内网部署我习惯把docker-compose.yml和.env放在/opt/app/下,权限设成600,避免敏感信息泄露。
5. 避坑与排查:内网离线安装最常见的五个翻车现场
5.1 现象:docker pull报x509: certificate signed by unknown authority
原因:内网私有仓库用的是自签名证书,Docker 默认不信任。解决:把 CA 证书放到/etc/docker/certs.d/registry.internal.local:5000/ca.crt,然后systemctl restart docker。如果仓库连 HTTPS 都没配,就在daemon.json里加insecure-registries,但生产环境不建议这么干。
5.2 现象:docker-compose up报Cannot connect to the Docker daemon
原因:当前用户不在docker组里,没有权限访问/var/run/docker.sock。解决:usermod -aG docker $USER把用户加进 docker 组,然后重新登录终端。或者临时用sudo docker-compose up,但长期这么干不安全。
5.3 现象:CentOS 7 装完 Docker 后systemctl start docker卡住
原因:daemon.json里配了native.cgroupdriver=systemd,但 CentOS 7 的 systemd 版本和 Docker 20.10 有兼容问题。解决:把exec-opts那行去掉,或者改成cgroupfs。如果后面要接 Kubernetes,再单独调 kubelet 的 cgroup 驱动。
5.4 现象:Ubuntu 下dpkg -i装完 Docker,docker version只显示 Client
原因:containerd.io没装或者版本不匹配。解决:dpkg -l | grep containerd看一下,如果没有就单独装containerd.io的 deb 包。Ubuntu 20.04 需要containerd.io 1.6.28以上,低版本和 Docker 24.x 不兼容。
5.5 现象:Compose 文件里写了version: "3.8",启动报Unsupported config option
原因:Docker Compose v2 已经废弃了version字段,写了会警告但不报错,但如果写了不支持的版本号比如"4.0"就会直接报错。解决:删掉version行,Compose v2 会自动识别最新的 Compose 规范。
6. 装完怎么验证:从hello-world到 Compose 编排跑通
装完 Docker 和 Compose,别急着上业务容器,先用最小化例子验证整条链路。第一步,跑官方hello-world镜像:
# 拉取并运行 hello-world,验证 Docker 引擎和镜像拉取是否正常 docker run --rm hello-world--rm表示容器退出后自动删除,不留垃圾。如果看到Hello from Docker!说明引擎、镜像、容器运行时都没问题。如果卡在Unable to find image然后报错,检查daemon.json里的insecure-registries或者镜像加速地址。
第二步,验证 Compose 编排。写一个最简单的docker-compose.yml:
services: web: image: nginx:alpine ports: - "8080:80" restart: unless-stopped然后:
# 后台启动服务 docker-compose up -d # 查看服务状态,确认 State 是 running docker-compose ps # 访问测试,返回 nginx 欢迎页说明端口映射正常 curl http://localhost:8080 # 清理环境 docker-compose downrestart: unless-stopped表示容器退出时自动重启,除非手动docker-compose stop。docker-compose ps看State列,如果是Exit状态,用docker-compose logs web看日志。curl返回 HTML 说明端口映射和网络都没问题。
第三步,检查 Docker 开机自启和 Compose 文件权限:
# 确认 docker 服务开机自启 systemctl is-enabled docker # 确认 compose 文件权限,避免其他用户篡改 ls -l /opt/app/docker-compose.ymlsystemctl is-enabled docker返回enabled才算配置到位。docker-compose.yml权限建议600,属主是部署用户。我一般还会把整个离线安装包和安装步骤写成一个install.sh脚本,放在/opt/docker-offline/下,下次换机器直接跑脚本,省得重新翻笔记。
从那以后我每次在内网装完 Docker,都强制走一遍hello-world加nginx的 Compose 验证,确认引擎、网络、端口映射、文件权限全都没问题才交给业务方。这套流程帮我省掉了至少三次「装完看着没问题,一上业务就翻车」的返工。希望帮到你。
本文还有配套的精品资源,点击获取