简介:在无互联网连接的Ubuntu系统中离线安装Docker,需通过预下载依赖包、配置本地仓库等步骤实现。本文详解从环境准备到验证的全流程,提供可复用的脚本与配置方案。
在无互联网连接的Ubuntu服务器上部署Docker,主要面临两大挑战:依赖包缺失与版本兼容性问题。传统在线安装依赖apt自动下载依赖,而离线环境需提前准备所有依赖文件。解决方案分为三步:
# 使用docker创建临时容器收集依赖docker run --rm -it ubuntu:22.04 /bin/bash
在容器内执行:
apt updateapt install -y --download-only docker-ce docker-ce-cli containerd.io
依赖包将保存在/var/cache/apt/archives/目录
# 创建工作目录mkdir docker-offline && cd docker-offline# 下载GPG密钥(需提前下载)wget https://download.docker.com/linux/ubuntu/gpg -O docker.gpg# 获取对应版本的repo文件(示例为22.04)wget https://download.docker.com/linux/ubuntu/dists/jammy/pool/stable/amd64/ -O repo_index.html# 解析repo文件获取所有deb包URL(需编写解析脚本)
# 安装debdeps工具(需提前在联网机器安装)sudo apt install debdeps# 生成依赖树并下载debdeps --download docker-ce --output ./docker-deps
将收集的文件按以下结构组织:
/docker-offline/├── debs/│ ├── docker-ce_5%3A24.0.7-1_amd64.deb│ ├── docker-ce-cli_5%3A24.0.7-1_amd64.deb│ └── ...├── docker.gpg└── docker.list
创建本地仓库目录:
mkdir -p /var/www/html/docker-repo/debscp /path/to/docker-offline/debs/* /var/www/html/docker-repo/debs/
生成Packages索引:
dpkg-scanpackages debs /dev/null | gzip -9c > debs/Packages.gz
配置APT源:
cat > /etc/apt/sources.list.d/docker-local.list <<EOFdeb [trusted=yes] file:/var/www/html/docker-repo jammy stableEOF
# 添加GPG密钥(离线方式)apt-key add /path/to/docker.gpg# 更新本地缓存apt update# 安装Docker(指定版本避免依赖冲突)apt install -y docker-ce=5:24.0.7-1 docker-ce-cli=5:24.0.7-1 containerd.io
# 检查服务状态systemctl status docker# 运行测试容器docker run --rm hello-world
问题1:依赖冲突
dpkg -i --force-all强制安装,然后通过apt -f install修复依赖问题2:GPG密钥验证失败
gpg --import docker.gpgapt-key adv --keyserver keyserver.ubuntu.com --recv-keys 9DC858229FC7DD38854AE2D88D81803C0EBFCD88
问题3:容器启动失败
cat /etc/docker/daemon.json# 推荐配置示例{"storage-driver": "overlay2"}
diff工具比较新旧包列表
# 保存常用镜像到tar包docker save ubuntu:22.04 nginx:latest > offline-images.tar# 离线环境加载docker load -i offline-images.tar
#!/bin/bash# offline-docker-setup.sh# 参数检查if [ "$EUID" -ne 0 ]; thenecho "请使用root用户运行"exit 1fi# 配置变量DOCKER_VERSION="5:24.0.7-1"REPO_DIR="/var/www/html/docker-repo"# 创建仓库结构mkdir -p ${REPO_DIR}/debscp /path/to/debs/* ${REPO_DIR}/debs/# 生成索引dpkg-scanpackages debs /dev/null | gzip -9c > debs/Packages.gz# 配置APT源cat > /etc/apt/sources.list.d/docker-local.list <<EOFdeb [trusted=yes] file:${REPO_DIR} jammy stableEOF# 安装Dockerapt updateapt install -y docker-ce=${DOCKER_VERSION} docker-ce-cli=${DOCKER_VERSION} containerd.ioecho "Docker安装完成,版本:${DOCKER_VERSION}"
| 驱动类型 | 适用场景 | 配置方式 |
|---|---|---|
| overlay2 | 默认推荐(支持大多数内核) | 无额外配置 |
| btrfs | 需要快照功能 | "storage-driver": "btrfs" |
| zfs | 需要数据压缩 | "storage-driver": "zfs" |
{"default-ulimits": {"nofile": {"Name": "nofile","Hard": 65535,"Soft": 65535}},"exec-opts": ["native.cgroupdriver=systemd"]}
离线安装Docker的核心在于完整依赖链的管理。建议维护以下文档:
对于大规模部署,可考虑使用Puppet/Ansible实现自动化配置。最新Docker版本建议参考官方发布说明,确保兼容性与安全性。