Ubuntu 20.04离线环境下的Docker全家桶安装指南(附镜像迁移技巧)
·
Ubuntu 20.04离线环境下的Docker全家桶部署实战
在企业内网或隔离网络环境中部署Docker生态,就像在没有导航的荒野中搭建一座现代化工厂。本文将带您绕过所有暗礁,从零构建完整的离线Docker环境,并分享生产级镜像迁移的实战技巧。
1. 离线部署前的战略准备
离线环境最大的挑战不是技术实现,而是资源依赖的连锁反应。我们首先需要建立完整的本地资源仓库:
-
操作系统适配:确认Ubuntu 20.04(focal)的架构版本(amd64/arm64)
-
依赖关系树:通过联网环境生成完整依赖清单:
apt-get download $(apt-cache depends --recurse --no-recommends --no-suggests \ --no-conflicts --no-breaks --no-replaces --no-enhances \ docker-ce docker-ce-cli containerd.io | grep "^\w" | sort -u) -
版本矩阵对照表:
组件 推荐版本 关键依赖 Docker CE 20.10.12 libseccomp2 (≥2.4.2) containerd 1.4.12 runc (≥1.0.0-rc95) docker-compose 1.29.2 PyYAML (≥3.10)
提示:使用
apt-cache policy命令验证本地仓库中依赖包的版本是否满足要求,特别是libseccomp2这种容易被忽略的基础依赖。
2. Docker核心组件离线安装
2.1 构建本地APT仓库
在内网服务器创建结构化存储:
mkdir -p /opt/offline-docker/packages/{main,depends}
# 将下载的.deb文件按功能分类存放
cp docker-ce*.deb /opt/offline-docker/packages/main
cp libseccomp2*.deb /opt/offline-docker/packages/depends
生成Packages.gz元数据:
cd /opt/offline-docker
dpkg-scanpackages . /dev/null | gzip > Packages.gz
配置本地源:
echo "deb [trusted=yes] file:/opt/offline-docker ./" > /etc/apt/sources.list.d/docker-offline.list
apt-get update
2.2 原子化安装流程
采用systemd服务管理的最佳实践:
# 按依赖顺序安装核心组件
sudo dpkg -i containerd.io_*.deb
sudo dpkg -i docker-ce-cli_*.deb
sudo dpkg -i docker-ce_*.deb
# 配置守护进程
sudo systemctl enable --now docker
sudo systemctl mask docker.socket # 禁用默认socket激活
验证安装:
sudo docker info --format '{{.ServerVersion}}'
3. Docker-Compose离线部署方案
3.1 静态二进制部署法
对于无法使用pip的环境,推荐官方静态二进制:
sudo curl -L "https://github.com/docker/compose/releases/download/v2.20.0/docker-compose-$(uname -s)-$(uname -m)" \
-o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
注意:在完全离线的环境中,需先在联网机器下载后传输到目标系统
3.2 完整性校验方案
创建验证脚本verify-compose.sh:
#!/bin/bash
EXPECTED_SHA256="$(curl -s https://github.com/docker/compose/releases/download/v2.20.0/docker-compose-$(uname -s)-$(uname -m).sha256)"
ACTUAL_SHA256="$(sha256sum /usr/local/bin/docker-compose | cut -d' ' -f1)"
if [ "$EXPECTED_SHA256" != "$ACTUAL_SHA256" ]; then
echo "校验失败!可能存在文件损坏" >&2
exit 1
fi
4. 生产级镜像迁移工程
4.1 批量导出优化方案
使用并行导出加速大型镜像仓库迁移:
# 生成导出脚本
docker images --format 'docker save {{.Repository}}:{{.Tag}} | gzip > {{.Repository}}-{{.Tag}}.tar.gz' > export-all.sh
# 并行执行(根据CPU核心数调整)
parallel -j 4 < export-all.sh
4.2 增量迁移策略
创建镜像清单CSV:
docker images --format '{{.Repository}},{{.Tag}},{{.ID}}' > image-manifest.csv
使用rsync进行增量同步:
rsync -avz --progress --files-from=<(find . -name "*.tar.gz" -mtime -1) \
/source/path/ /target/path/
4.3 导入验证自动化
编写导入验证脚本import-verify.sh:
#!/bin/bash
for img in *.tar.gz; do
docker load -i "$img"
loaded_id=$(docker inspect --format '{{.Id}}' "${img%.tar.*}")
original_id=$(grep "${img%.tar.*}" image-manifest.csv | cut -d, -f3)
if [ "$loaded_id" != "$original_id" ]; then
echo "校验失败: $img" >&2
exit 1
fi
done
5. 离线环境运维锦囊
5.1 系统服务调优
创建/etc/docker/daemon.json优化配置:
{
"storage-driver": "overlay2",
"log-driver": "json-file",
"log-opts": {
"max-size": "100m",
"max-file": "3"
},
"iptables": false,
"live-restore": true
}
5.2 应急恢复方案
制作快速恢复包:
# 备份关键配置
tar czvf docker-backup-$(date +%Y%m%d).tgz \
/etc/docker/ \
/var/lib/docker/volumes/ \
/usr/local/bin/docker-compose
5.3 版本升级路线
设计滚动升级方案:
- 在新环境部署测试集群
- 使用
docker-compose config验证配置兼容性 - 通过
docker swarm实现蓝绿部署 - 最终一致性检查脚本:
diff <(docker inspect service1 | jq '.[].Spec') <(docker inspect service1-new | jq '.[].Spec')
在内网服务器上部署完整个Docker生态后,记得用docker system prune -f定期清理构建缓存。曾经有次因为忘记清理,导致磁盘被占满引发服务故障,这个教训让我养成了设置每周自动清理的习惯。
更多推荐
所有评论(0)