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 CE20.10.12libseccomp2 (≥2.4.2)
    containerd1.4.12runc (≥1.0.0-rc95)
    docker-compose1.29.2PyYAML (≥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 版本升级路线

设计滚动升级方案:

  1. 在新环境部署测试集群
  2. 使用docker-compose config验证配置兼容性
  3. 通过docker swarm实现蓝绿部署
  4. 最终一致性检查脚本:
    diff <(docker inspect service1 | jq '.[].Spec') <(docker inspect service1-new | jq '.[].Spec')
    

在内网服务器上部署完整个Docker生态后,记得用docker system prune -f定期清理构建缓存。曾经有次因为忘记清理,导致磁盘被占满引发服务故障,这个教训让我养成了设置每周自动清理的习惯。

更多推荐