离线环境Docker与私有镜像仓库部署指南

一、离线环境部署Docker的核心挑战

在无互联网连接的环境中部署Docker,开发者需解决三大核心问题:安装包获取与版本匹配依赖项完整性验证镜像传输与存储管理。以CentOS 7系统为例,官方Docker CE安装包依赖containerd.iodocker-ce-cli等组件,且各版本间存在严格兼容性要求。例如,Docker CE 20.10.x版本需匹配containerd.io 1.4.x系列,若版本错配会导致启动失败。

解决方案

  1. 离线安装包收集:在联网环境通过yum install --downloadonly --downloaddir=/path/to/repo docker-ce命令下载完整依赖链,包含所有RPM包及其元数据。
  2. 依赖关系校验:使用rpm -qpR docker-ce-20.10.17-3.el7.x86_64.rpm命令解析依赖项,确保收集的包覆盖所有要求(如libseccomp >= 2.3)。
  3. 本地仓库搭建:通过createrepo /path/to/repo生成元数据,配置本地YUM源:
    1. [docker-offline]
    2. name=Docker Offline Repo
    3. baseurl=file:///path/to/repo
    4. enabled=1
    5. gpgcheck=0

二、Docker离线安装全流程

1. 系统环境准备

  • 内核版本要求:Linux内核需≥3.10(可通过uname -r验证),低版本需升级内核或使用静态编译的Docker二进制包。
  • 存储驱动选择:在/etc/docker/daemon.json中配置"storage-driver": "overlay2"(需内核支持),替代默认的devicemapper以提升性能。
  • 用户组管理:创建docker用户组并将当前用户加入,避免sudo权限滥用:
    1. sudo groupadd docker
    2. sudo usermod -aG docker $USER
    3. newgrp docker # 立即生效

2. 离线安装包部署

将收集的RPM包传输至离线环境后,执行批量安装:

  1. sudo rpm -ivh /path/to/repo/*.rpm --nodeps # 谨慎使用--nodeps,需确保依赖已满足

安装完成后验证服务状态:

  1. sudo systemctl status docker
  2. # 正常输出应包含:Active: active (running)

3. 基础镜像导入

通过docker load命令导入预先导出的镜像(如alpine:3.14):

  1. docker load -i alpine-3.14.tar
  2. # 输出示例:Loaded image: alpine:3.14

对于大规模镜像库,建议使用skopeo工具进行目录级同步,减少传输开销。

三、私有镜像仓库搭建方案

1. Registry容器化部署

使用官方registry:2镜像快速启动私有仓库:

  1. docker run -d \
  2. --name registry \
  3. -p 5000:5000 \
  4. --restart=always \
  5. -v /data/registry:/var/lib/registry \
  6. registry:2

关键配置

  • 存储路径:通过-v挂载持久化存储,避免容器删除导致镜像丢失。
  • 内存限制:在/etc/docker/daemon.json中添加"max-concurrent-uploads": 10防止资源耗尽。

2. 高级安全配置

HTTPS证书部署

生成自签名证书并配置Nginx反向代理:

  1. server {
  2. listen 443 ssl;
  3. server_name registry.example.com;
  4. ssl_certificate /etc/nginx/certs/registry.crt;
  5. ssl_certificate_key /etc/nginx/certs/registry.key;
  6. location / {
  7. proxy_pass http://localhost:5000;
  8. }
  9. }

认证机制实现

使用htpasswd生成密码文件:

  1. mkdir -p /auth
  2. docker run --entrypoint htpasswd httpd:2 -Bbn admin password123 > /auth/htpasswd

启动带认证的Registry:

  1. docker run -d \
  2. --name registry-auth \
  3. -p 5000:5000 \
  4. -e REGISTRY_AUTH=htpasswd \
  5. -e REGISTRY_AUTH_HTPASSWD_REALM="Registry Realm" \
  6. -e REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd \
  7. -v /auth:/auth \
  8. registry:2

四、离线环境镜像管理策略

1. 镜像传输优化

  • 分块压缩:使用tar --use-compress-program=pigz -cf images.tar.gz并行压缩镜像。
  • 增量同步:通过docker save生成清单文件,仅传输变更层。

2. 仓库高可用设计

  • 多节点复制:使用Harbor的复制功能实现跨机房同步。
  • 存储冗余:配置RAID10或分布式存储(如Ceph)保障数据安全。

3. 自动化部署脚本

示例:离线环境Docker初始化脚本

  1. #!/bin/bash
  2. # 检查依赖
  3. if ! command -v docker &> /dev/null; then
  4. echo "安装Docker..."
  5. sudo rpm -ivh /path/to/repo/*.rpm
  6. fi
  7. # 配置镜像加速(离线环境可替换为本地Registry)
  8. sudo tee /etc/docker/daemon.json <<EOF
  9. {
  10. "registry-mirrors": ["http://registry-mirror:5000"],
  11. "insecure-registries": ["registry.example.com:5000"]
  12. }
  13. EOF
  14. sudo systemctl restart docker
  15. echo "Docker部署完成"

五、常见问题处理

  1. 镜像拉取失败:检查/etc/docker/daemon.json中的insecure-registries配置是否包含私有仓库地址。
  2. 存储空间不足:通过docker system df查看占用,使用docker system prune清理无用资源。
  3. 版本冲突:使用yum list installed | grep docker确认已安装版本,通过yum downgrade回退至兼容版本。

通过系统化的离线部署方案,开发者可在无外网环境下构建完整的Docker生态,满足企业级应用对安全性、可控性的严苛要求。实际部署中需结合具体Linux发行版(如Ubuntu需使用DEB包)和业务场景调整配置参数。