Docker Universal Installer
全系列 Linux 兼容的 Docker 最新版 离线一键安装包。
解决"离线包部署到目标机器后报
GLIBC_2.xx not found"的常见坑。
特性
- ✅ 不依赖系统 glibc 版本 — Docker 29.7.2 + Compose v5.5.0 均为静态链接二进制
- ✅ Docker 29.7.2(最新版) + containerd 2.x + runc 1.x
- ✅ 覆盖两大主流架构 —
x86_64(含 Kylin V10 / CentOS 7+ / Ubuntu 16.04+ / OpenEuler 等)与aarch64(含华为 Kunpeng / 飞腾 / AWS Graviton) - ✅ 覆盖主流 init 系统 —
systemd(CentOS 7+、Ubuntu 16.04+、Kylin V10、OpenEuler、AnolisOS、UOS、Deepin 等) - ✅ 预装常用配置 — DaoCloud 镜像加速、
overlay2存储、json-file日志轮转 - ✅ 安全 — 自动备份现有二进制、支持一键回滚
- ✅ 可重入 —
install.sh --force重装;install.sh --uninstall卸载;install.sh --rollback回滚 - ✅ 可观测 — 日志写到
/var/log/docker-universal-installer-install.log
支持的系统
理论上支持任何运行 Linux 3.10+ 内核 + systemd 的发行版。已实测/验证兼容:
| 发行版 | glibc | 状态 |
|---|---|---|
| Kylin Linux Advanced Server V10 (Tercel) | 2.28 | ✅ 实测 |
| CentOS 7 / RHEL 7 | 2.17 | ✅ |
| CentOS 8 / RHEL 8 | 2.28 | ✅ |
| CentOS 9 / RHEL 9 / Rocky 9 / Alma 9 | 2.34 | ✅ |
| Ubuntu 16.04 / 18.04 / 20.04 / 22.04 / 24.04 | 2.23+ | ✅ |
| Debian 9 / 10 / 11 / 12 | 2.24+ | ✅ |
| OpenEuler 20.03 / 22.03 / 24.03 | 2.28+ | ✅ |
| Anolis OS 7 / 8 | 2.17/2.28 | ✅ |
| UOS / Deepin | 2.28+ | ✅ |
| openSUSE Leap 15 | 2.26+ | ✅ |
不适配:CentOS 6 及更早(内核 < 3.10)、所有非 systemd 发行版。
包含的组件(v2.0.0 最新版)
| 组件 | 版本 | 备注 |
|---|---|---|
| docker (CLI) | 29.7.2 | 静态二进制(最新稳定版) |
| dockerd | 29.7.2 | 静态二进制 |
| containerd | 2.x | 静态二进制(与 docker 29.7.2 配套) |
| runc | 1.x | 静态二进制 |
| docker-init / docker-proxy / ctr | 29.7.2 | 静态二进制 |
| containerd-shim-runc-v2 | 29.7.2 | 静态二进制 |
| Docker Compose plugin | v5.5.0 | 静态 Go 二进制(通过 docker compose 调用) |
为什么用静态二进制? Docker 官方从某个版本开始,package manager 渠道(yum/apt)的 docker 二进制对系统的 glibc 有要求(28.x+ 要求 glibc ≥ 2.34)。而 Docker 官方在 download.docker.com/linux/static/stable/ 同时提供完全静态的 tarball(不依赖系统 glibc),这正是"全系列兼容"的关键。
目录结构
docker-universal-installer/
├── install.sh # 主安装脚本(一键安装)
├── uninstall.sh # 独立卸载脚本
├── README.md # 本文件
├── VERSION # 2.0.0
├── bin/ # x86_64 静态二进制(8 个,Docker 29.7.2)
├── bin-arm64/ # aarch64 静态二进制(8 个,Docker 29.7.2)
├── compose/
│ └── docker-compose # Compose v5.5.0 静态插件
├── systemd/
│ ├── containerd.service
│ ├── docker.service
│ └── docker.socket
└── config/
└── daemon.json # 默认配置(含 DaoCloud 国内镜像)
使用方法
1. 拷贝包到目标机器
任选一种方式:
# scp
scp -r docker-universal-installer root@<host>:/root/
# 或压缩后传
tar czf docker-universal-installer.tar.gz docker-universal-installer
scp docker-universal-installer.tar.gz root@<host>:/root/
ssh root@<host> 'cd /root && tar xzf docker-universal-installer.tar.gz'
2. 一键安装
cd /root/docker-universal-installer
sudo bash install.sh # 基础安装
sudo bash install.sh --with-compose # 同时装 docker compose 插件
sudo bash install.sh --no-mirror # 不用国内镜像(用默认 registry)
安装过程会:
- 检测 OS / 架构 / 内核 / systemd / overlay
- 备份已有 docker 二进制(到
/var/lib/docker-universal-installer/backup/<时间戳>/) - 停掉旧服务
- 安装新二进制到
/usr/bin/ - 安装 systemd 单元到
/lib/systemd/system/ - 写入
/etc/docker/daemon.json(含 DaoCloud 国内镜像) - 启动并自启
containerd+docker - 跑冒烟测试
3. 验证
docker --version # Docker version 29.7.2
docker info # 看 Server Version、Storage Driver
docker ps # 容器列表
docker run --rm hello-world # 端到端测试
4. 其它命令
sudo bash install.sh --uninstall # 卸载(保留 /var/lib/docker 镜像数据)
sudo bash install.sh --rollback # 回滚到上次安装前的状态
sudo bash install.sh --force # 强制重装
sudo bash install.sh --help
常见问题
Q1: 安装后 docker info 显示 registry-mirrors 是空的?
说明 /etc/docker/daemon.json 已有配置(被保留)。可用 sudo bash install.sh --force --with-compose 覆盖。
Q2: docker pull 拉不到镜像?
检查 /etc/docker/daemon.json 里的 registry-mirrors。若你的网络可达 docker.io,可加 --no-mirror 重装去掉镜像配置。
Q3: 报 failed to start daemon: Error initializing network controller: error obtaining controller instance
通常是 iptables 缺失。在 RHEL/CentOS 系列:yum install -y iptables。在 Debian/Ubuntu:apt install -y iptables。
Q4: 报 containerd: failed to load TOML config
确认 /etc/docker/daemon.json 是合法 JSON(用 python3 -m json.tool < /etc/docker/daemon.json 校验)。
Q5: 报 drivr overlay2: unsupported backing filesystem
文件系统不支持 overlay2(如某些网络存储)。可改成 devicemapper 或 vfs:
{ "storage-driver": "vfs" }
Q6: 报 cannot connect to the Docker daemon at unix:///var/run/docker.sock
服务没起来:systemctl status docker,再 systemctl restart docker。
Q7: docker.service 启动失败但 journalctl 看不到错误?
99% 是缺 Delegate=yes(在 [Service] 段)——这是 systemd 允许 dockerd 接管 cgroup 必需的。在我们的包里已经处理好了,如果是自己写 unit,不要漏这个。
给打包者的说明
如果你需要重建本包(更新 Docker / Compose 版本):
- 改
VERSION - 替换
bin/和bin-arm64/里的二进制
- 来源:
https://mirrors.aliyun.com/docker-ce/linux/static/stable/{x86_64,aarch64}/docker-X.Y.Z.tgz
- 替换
compose/docker-compose
- 来源:
https://github.com/docker/compose/releases/download/vX.Y.Z/docker-compose-linux-x86_64(注意 v2.20+ 之后要求 glibc 2.31,已不"通用"。推荐 v5.x 静态版)
- 用
tar czf docker-universal-installer.tar.gz docker-universal-installer打包
本包用 Docker 官方静态二进制,正是为了避免不同 glibc 环境的坑——可以放心在任何 Linux 3.10+ + systemd 的机器上用。
版本历史
- v2.0.0 — 升级到 Docker 29.7.2(最新版),仍然零 GLIBC 依赖
- v1.0.0 — 首版,Docker 20.10.23 + Compose v5.5.0
License
本包内 Docker 二进制遵循 Apache 2.0(Docker, Inc.)。Compose 遵循 Apache 2.0(Docker, Inc.)。
本安装脚本与文档遵循 MIT。