离线环境部署Docker及私有镜像仓库

离线环境部署Docker的挑战与核心价值

在金融、军工、能源等高安全要求的行业中,离线环境部署Docker已成为保障系统安全、实现自主可控的关键技术。与在线环境不同,离线环境需解决依赖包缺失、版本兼容性、证书验证等特殊问题,同时需兼顾镜像存储、分发效率及长期维护成本。本文将系统性拆解部署流程,提供可复用的技术方案。

一、离线环境Docker部署前准备

1.1 硬件与系统要求

  • 最小资源需求:建议CPU核心数≥4,内存≥8GB,磁盘空间≥200GB(含镜像存储区)
  • 操作系统兼容性:优先选择CentOS 7/8、Ubuntu 20.04 LTS等LTS版本,需验证内核版本≥3.10(支持OverlayFS)
  • 网络隔离设计:划分管理网段(SSH/API访问)与存储网段(镜像传输),建议使用VLAN或物理隔离

1.2 依赖包收集策略

  • 基础依赖清单
    1. # CentOS示例依赖包
    2. yum install -y device-mapper-persistent-data lvm2 btrfs-progs \
    3. container-selinux libseccomp libtool-ltdl
  • 离线包获取方法
    • 使用yumdownloaderapt-get download下载RPM/DEB包
    • 通过repotrack工具递归下载所有依赖(示例:repotrack docker-ce
    • 构建本地YUM/APT仓库:createrepo /path/to/rpms

1.3 安全基线配置

  • 禁用非必要服务:systemctl mask postfix.service
  • 配置SSH密钥认证:ssh-keygen -t ed25519
  • 启用防火墙规则:仅开放2375/2376(TCP)及5000(私有仓库端口)

二、Docker引擎离线安装

2.1 静态二进制包部署

  1. 下载官方静态包
    • 从Docker官方发布页获取对应架构的docker-XX.XX.XX.tgz
  2. 解压与安装
    1. tar -xzf docker-20.10.17.tgz
    2. cp docker/* /usr/local/bin/
    3. chmod +x /usr/local/bin/dockerd
  3. 创建服务单元文件

    1. # /etc/systemd/system/docker.service
    2. [Unit]
    3. Description=Docker Application Container Engine
    4. After=network-online.target firewalld.service
    5. [Service]
    6. Type=notify
    7. ExecStart=/usr/local/bin/dockerd --insecure-registry=192.168.1.100:5000
    8. ExecReload=/bin/kill -s HUP $MAINPID
    9. LimitNOFILE=1048576
    10. LimitNPROC=1048576
    11. TimeoutStartSec=0
    12. Restart=always
    13. [Install]
    14. WantedBy=multi-user.target

2.2 离线环境配置优化

  • 存储驱动选择:优先使用overlay2(需内核≥4.0)
    1. # 修改/etc/docker/daemon.json
    2. {
    3. "storage-driver": "overlay2",
    4. "storage-opts": ["overlay2.size=100G"]
    5. }
  • 日志轮转配置
    1. {
    2. "log-driver": "json-file",
    3. "log-opts": {
    4. "max-size": "10m",
    5. "max-file": "3"
    6. }
    7. }

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

3.1 Registry容器化部署

  1. 基础镜像准备

    • 从可信源获取registry:2.8.1镜像并导出:
      1. docker save registry:2.8.1 > registry.tar
    • 通过U盘/内网传输至目标环境
  2. 启动命令示例

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

3.2 Harbor高可用部署

3.2.1 离线组件包准备

  • 下载Harbor离线安装包(含依赖组件):
    1. wget https://github.com/goharbor/harbor/releases/download/v2.5.0/harbor-offline-installer-v2.5.0.tgz
  • 解压后包含:
    • Harbor核心组件
    • PostgreSQL 13
    • Redis 6.2
    • Notary服务组件

3.2.2 配置文件优化

  1. # harbor.yml关键配置
  2. hostname: registry.internal.com
  3. http:
  4. port: 8080
  5. https:
  6. certificate: /data/cert/harbor.crt
  7. private_key: /data/cert/harbor.key
  8. storage_driver:
  9. name: filesystem
  10. filesystem:
  11. rootdir: /data/registry
  12. database:
  13. password: StrongPassword@123

3.2.3 启动与验证

  1. # 初始化数据库
  2. ./prepare
  3. # 启动服务
  4. docker-compose up -d
  5. # 验证访问
  6. curl -I http://registry.internal.com:8080/api/v2.0/health

四、离线环境镜像管理实践

4.1 镜像导入导出流程

  1. # 导出镜像
  2. docker save -o nginx.tar nginx:alpine
  3. # 导入镜像(离线环境)
  4. docker load -i nginx.tar
  5. # 多镜像批量处理
  6. for img in $(cat images.txt); do
  7. docker save $img > ${img//:/_}.tar
  8. done

4.2 镜像签名与验证

  1. 生成签名密钥
    1. openssl genrsa -out root.key 4096
    2. openssl req -new -x509 -key root.key -out root.crt
  2. 配置Notary服务
    1. {
    2. "trust_servers": ["http://notary.internal.com"],
    3. "root_ca": "/etc/docker/certs.d/root.crt"
    4. }
  3. 镜像签名
    1. notary sign --server http://notary.internal.com myrepo/nginx:1.21

五、常见问题与解决方案

5.1 存储驱动报错处理

  • 错误现象failed to mount overlay: invalid argument
  • 解决方案
    1. 检查内核参数:cat /proc/filesystems | grep overlay
    2. 升级内核至≥4.15版本
    3. 临时回退至devicemapper驱动(需配置loop-lvm)

5.2 私有仓库认证失败

  • 排查步骤
    1. 验证证书有效性:openssl s_client -connect registry:5000 -showcerts
    2. 检查客户端配置:~/.docker/config.json中的auth字段
    3. 重启registry服务并检查日志:docker logs registry

六、最佳实践建议

  1. 版本锁定策略:固定Docker引擎、Registry及基础镜像版本,减少兼容性问题
  2. 自动化部署:使用Ansible/Puppet实现离线环境批量部署
  3. 镜像生命周期管理
    • 设置保留策略(如保留最近3个版本)
    • 定期清理未使用的镜像:docker image prune -a --filter "until=24h"
  4. 监控告警体系
    • 监控磁盘空间:df -h /var/lib/docker
    • 告警阈值设置:剩余空间<15%时触发警报

通过上述方案,企业可在完全离线的环境中构建安全、高效的容器化基础设施。实际部署时需根据具体业务场景调整配置参数,并建立完善的备份恢复机制(如定期备份registry数据目录)。