16. 镜像仓库1. 镜像仓库概述镜像仓库Registry是存储和分发 Docker 镜像的服务。Docker Hub 是默认的公共仓库企业通常搭建私有仓库来存储内部镜像。┌─────────────────────────────────────────────────────────────┐ │ 镜像仓库架构 │ ├─────────────────────────────────────────────────────────────┤ │ │ │ ┌─────────────┐ push/pull ┌─────────────────┐ │ │ │ 开发者 A │ ──────────────────▶ │ │ │ │ └─────────────┘ │ │ │ │ │ Docker Hub │ │ │ ┌─────────────┐ push/pull │ 私有仓库 │ │ │ │ 开发者 B │ ──────────────────▶ │ Harbor │ │ │ └─────────────┘ │ │ │ │ │ │ │ │ ┌─────────────┐ pull │ │ │ │ │ 生产服务器 │ ──────────────────▶ │ │ │ │ └─────────────┘ └─────────────────┘ │ │ │ │ 镜像命名规范 │ │ [registry/][namespace/]repository[:tag] │ │ │ │ 示例 │ │ - nginx # Docker Hub 官方镜像 │ │ - myuser/myapp:v1 # Docker Hub 用户镜像 │ │ - myregistry.com/myapp:latest # 私有仓库 │ │ │ └─────────────────────────────────────────────────────────────┘2. Docker Hub2.1 基本操作# 登录 Docker Hubdockerlogin# 输入用户名和密码# 登出dockerlogout# 搜索镜像dockersearch nginxdockersearch--limit10nginxdockersearch--filterstars100nginx# 拉取镜像dockerpull nginx:latestdockerpull ubuntu:20.04# 推送镜像# 首先标记镜像dockertag myapp:latest username/myapp:v1dockerpush username/myapp:v1# 同时推送多个标签dockertag myapp:latest username/myapp:latestdockertag myapp:latest username/myapp:1.0.0dockerpush username/myapp:latestdockerpush username/myapp:1.0.02.2 镜像标签规范# 标签命名建议# 版本号标签dockertag myapp username/myapp:1.0.0dockertag myapp username/myapp:1.0dockertag myapp username/myapp:1# 环境标签dockertag myapp username/myapp:devdockertag myapp username/myapp:testdockertag myapp username/myapp:prod# 构建标签dockertag myapp username/myapp:${CI_COMMIT_SHA}dockertag myapp username/myapp:${BUILD_NUMBER}# 日期标签dockertag myapp username/myapp:$(date%Y%m%d)3. 私有仓库部署3.1 Docker Registry# 运行私有仓库dockerrun-d\--nameregistry\-p5000:5000\-v/data/registry:/var/lib/registry\registry:2# 推送到私有仓库dockertag myapp localhost:5000/myappdockerpush localhost:5000/myapp# 从私有仓库拉取dockerpull localhost:5000/myapp# 查看仓库中的镜像curlhttp://localhost:5000/v2/_catalogcurlhttp://localhost:5000/v2/myapp/tags/list3.2 配置 HTTPS# 生成自签名证书mkdir-p/data/certs openssl req-newkeyrsa:4096-nodes-sha256-keyout/data/certs/domain.key\-x509-days365-out/data/certs/domain.crt# 运行带 TLS 的仓库dockerrun-d\--nameregistry\-p5000:5000\-v/data/registry:/var/lib/registry\-v/data/certs:/certs\-eREGISTRY_HTTP_TLS_CERTIFICATE/certs/domain.crt\-eREGISTRY_HTTP_TLS_KEY/certs/domain.key\registry:2# 配置 Docker 信任证书# 将证书复制到 /etc/docker/certs.d/yourdomain.com:5000/ca.crt3.3 配置认证# 创建认证目录mkdir/data/auth# 生成 htpasswd 文件dockerrun--entrypointhtpasswd registry:2-Bbnusername password/data/auth/htpasswd# 运行带认证的仓库dockerrun-d\--nameregistry\-p5000:5000\-v/data/registry:/var/lib/registry\-v/data/auth:/auth\-eREGISTRY_AUTHhtpasswd\-eREGISTRY_AUTH_HTPASSWD_REALMRegistry\-eREGISTRY_AUTH_HTPASSWD_PATH/auth/htpasswd\registry:2# 登录私有仓库dockerlogin localhost:50004. Harbor4.1 安装 Harbor# 下载 Harborgitclone https://github.com/goharbor/harbor.gitcdharbor# 复制配置cpharbor.yml.tmpl harbor.yml# 编辑配置vimharbor.yml# hostname: harbor.example.com# https:# certificate: /data/ssl/harbor.crt# private_key: /data/ssl/harbor.key# 安装./install.sh --with-notary --with-trivy --with-chartmuseum4.2 Harbor 操作# 登录 Harbordockerlogin harbor.example.com# 标记并推送镜像dockertag myapp harbor.example.com/project/myapp:v1dockerpush harbor.example.com/project/myapp:v1# 拉取镜像dockerpull harbor.example.com/project/myapp:v1# 使用 Harbor API# 获取项目列表curl-uadmin:password https://harbor.example.com/api/v2.0/projects# 获取镜像标签curl-uadmin:password https://harbor.example.com/api/v2.0/projects/project/repositories/myapp/tags5. 镜像管理策略5.1 清理策略# 手动删除远程标签dockerpush myrepo/myapp:oldtag# 推送空覆盖# 使用 Harbor 自动清理# 设置镜像保留规则保留最近 N 个版本# 使用脚本清理旧镜像#!/bin/bash# 删除除最近5个外的所有标签IMAGE$1KEEP5tags$(curl-shttps://hub.docker.com/v2/repositories/$IMAGE/tags?page_size100|jq-r.results[].name)count0fortagin$tags;docount$((count1))if[$count-gt$KEEP];thenechoDeleting tag:$tag# 删除逻辑fidone5.2 镜像复制# 使用 skopeo 复制镜像skopeo copy docker://source/image:tag docker://dest/image:tag# 使用 crane 复制crane copy source/image:tag dest/image:tag# Docker 方式dockerpull source/image:tagdockertag source/image:tag dest/image:tagdockerpush dest/image:tagdockerrmi source/image:tag dest/image:tag5.3 镜像缓存策略# GitLab CI 缓存配置cache:paths:-cache/# 使用镜像缓存docker pull $CI_REGISTRY_IMAGE:cache||true docker build--cache-from $CI_REGISTRY_IMAGE:cache-t $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA . docker push $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA docker tag $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA $CI_REGISTRY_IMAGE:cache docker push $CI_REGISTRY_IMAGE:cache6. 常用仓库对比仓库类型特点适用场景Docker Hub公共镜像丰富、免费开源项目、学习阿里云 ACR公共/私有国内加速、稳定国内生产腾讯云 TCR私有与云产品集成腾讯云用户Harbor私有功能全面企业内部Registry私有轻量简单小规模7. 安全最佳实践7.1 镜像扫描# Docker Scandockerscan myapp:latest# Trivy 扫描trivy image--severityHIGH,CRITICAL myapp:latest# Clair 扫描clair-scanner myapp:latest# Harbor 自动扫描# 在 Harbor 配置中启用漏洞扫描7.2 镜像签名# 启用 Docker Content TrustexportDOCKER_CONTENT_TRUST1# 推送签名镜像dockerpush myapp:latest# 拉取验证签名dockerpull myapp:latest# 查看签名信息dockertrust inspect myapp:latest7.3 访问控制# Harbor RBAC# 项目级别权限# - 项目管理员# - 开发者推送/拉取# - 访客只读# 创建机器人账户# 用于 CI/CD 系统8. 性能优化8.1 镜像加速# 配置镜像加速器# /etc/docker/daemon.json{registry-mirrors:[https://docker.mirrors.ustc.edu.cn,https://hub-mirror.c.163.com]}# 重启 Dockersudosystemctl restartdocker8.2 拉取优化# 并行拉取dockerpull--parallelmyapp:latest# 只拉取特定平台的镜像dockerpull--platformlinux/amd64 myapp:latest9. CI/CD 集成9.1 GitLab CIbuild:stage:buildscript:-docker login-u $CI_REGISTRY_USER-p $CI_REGISTRY_PASSWORD $CI_REGISTRY-docker build-t $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA .-docker push $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA-docker tag $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA $CI_REGISTRY_IMAGE:latest-docker push $CI_REGISTRY_IMAGE:latest9.2 GitHub Actions-name:Login to Docker Hubuses:docker/login-actionv1with:username:${{secrets.DOCKER_USERNAME}}password:${{secrets.DOCKER_TOKEN}}-name:Build and pushuses:docker/build-push-actionv2with:push:truetags:username/myapp:latest10. 常用命令速查操作命令登录docker login登出docker logout搜索docker search拉取docker pull推送docker push标记docker tag私有仓库docker run -d -p 5000:5000 registry:2查看标签curl -X GET https://hub.docker.com/v2/repositories/library/nginx/tags11. 常见问题Q1: 推送镜像失败怎么办检查登录状态、镜像标签格式、网络连接。Q2: 如何删除 Docker Hub 上的镜像登录 Docker Hub 网页在 Repository 页面删除。Q3: 私有仓库如何配置存储# 使用 S3 存储dockerrun-d\-eREGISTRY_STORAGEs3\-eREGISTRY_STORAGE_S3_REGIONus-west-1\-eREGISTRY_STORAGE_S3_BUCKETmybucket\registry:212. 小结Docker Hub公共仓库默认镜像源私有仓库Registry、Harbor 等镜像命名[registry/][namespace/]repository[:tag]安全措施镜像扫描、签名、RBAC性能优化镜像加速、并行拉取CI/CD 集成自动构建和推送清理策略保留版本数量限制