09 · 镜像仓库与 Harbor
一句话定位:镜像要集中存储和分发——公共用 Docker Hub,企业用私有仓库 Harbor(带权限、扫描、签名)。
1. 镜像仓库的作用
镜像仓库(Registry)= 存放和分发镜像的服务:
– 开发构建镜像 → push 到仓库
– 部署时从仓库 pull 镜像
– 团队/CI/CD 共享镜像
公共仓库:Docker Hub(hub.docker.com)
私有仓库:Harbor(企业级)、registry(轻量)、云厂商(阿里云 ACR 等)
2. Docker Hub(公共仓库)
# 登录
docker login # 默认 Docker Hub
# 镜像命名规则:[仓库地址/]用户名/镜像名:tag
docker tag myapp:1.0 username/myapp:1.0
docker push username/myapp:1.0 # 推送
docker pull username/myapp:1.0 # 拉取
# 不写仓库地址默认 Docker Hub,官方镜像省略用户名(如 nginx = library/nginx)
3. 搭建轻量私有仓库(registry)
# 最简单的私有仓库
docker run -d -p 5000:5000 –name registry \\
-v registry-data:/var/lib/registry \\
registry:2
# 推送到私有仓库
docker tag myapp:1.0 localhost:5000/myapp:1.0
docker push localhost:5000/myapp:1.0
docker pull localhost:5000/myapp:1.0
registry 缺点:无 UI、无权限、无扫描 → 生产用 Harbor。
4. Harbor(企业级私有仓库)
Harbor(CNCF 项目)相比 registry 增加:
– Web UI(可视化管理镜像)
– 用户/角色权限(RBAC)、项目隔离
– 镜像漏洞扫描(Trivy/Clair)
– 镜像签名(内容信任)
– 镜像复制(多仓库同步)
– 垃圾回收、配额管理
# 安装(下载 harbor 离线包)
# 编辑 harbor.yml(配域名、端口、admin 密码、是否 HTTPS)
./install.sh
# Web UI 访问:https://harbor.example.com(admin / 配置的密码)
5. 使用 Harbor
# 登录 Harbor
docker login harbor.example.com # 输入用户名密码
# 镜像命名:harbor地址/项目名/镜像名:tag
docker tag myapp:1.0 harbor.example.com/myproject/myapp:1.0
docker push harbor.example.com/myproject/myapp:1.0
docker pull harbor.example.com/myproject/myapp:1.0
Harbor 项目(Project):
– 公开项目:任何人可拉
– 私有项目:需授权
– 按项目分配用户权限(访客/开发/维护/管理员)
6. HTTP 仓库信任配置
// 私有仓库用 HTTP(非 HTTPS)时,Docker 默认拒绝
// 配置 /etc/docker/daemon.json 信任
{
"insecure-registries": ["harbor.example.com", "192.168.1.100:5000"]
}
// 重启 docker: systemctl restart docker
⚠️ 生产用 HTTPS(配证书),别用 insecure HTTP。
7. 镜像安全
① 漏洞扫描:Harbor 集成 Trivy 扫描镜像 CVE 漏洞
→ 发现基础镜像/依赖的已知漏洞,阻止有高危漏洞的镜像部署
② 镜像签名:内容信任(Notary/Cosign)
→ 确保镜像未被篡改、来源可信
③ 最小化镜像:用 distroless/alpine,减少攻击面
④ 不放密钥:镜像里别打包密码/密钥(用环境变量/Secret)
⑤ 定期更新基础镜像:修复基础镜像漏洞
8. K8s 拉私有镜像
# 创建 imagePullSecret
kubectl create secret docker-registry harbor-secret \\
–docker-server=harbor.example.com \\
–docker-username=admin \\
–docker-password=xxx \\
-n prod
# Pod 引用
spec:
imagePullSecrets:
– name: harbor–secret
containers:
– name: app
image: harbor.example.com/myproject/myapp:1.0
9. 镜像管理最佳实践
镜像 tag 规范:
– 别只用 latest(不确定版本、无法回滚)
– 用语义化版本:1.0.0、1.0.1
– 或用 Git commit / 构建号:myapp:20260614-a1b2c3
– 可同时打 latest + 具体版本
镜像清理:
– Harbor 配保留策略(如保留最近 10 个版本)
– 定期垃圾回收释放空间
分层优化:见 02 篇(多阶段 + 分层缓存)
10. 坑与最佳实践
- ✅ 企业用 Harbor(权限、扫描、UI),别只用轻量 registry。
- ✅ 镜像 tag 用语义化版本或构建号,别只用 latest。
- ✅ 用 Harbor 漏洞扫描,阻止高危镜像部署。
- ✅ K8s 拉私有镜像配 imagePullSecrets。
- ⚠️ 生产仓库用 HTTPS(配证书),别用 insecure HTTP。
- ⚠️ 镜像里别打包密钥(用环境变量/Secret)。
- ✅ 配镜像保留策略 + 定期 GC,避免仓库占满。
- 💡 Harbor = 私有仓库 + 权限 + 扫描 + 签名,企业镜像管理标配。
11. 本篇小结
- 镜像仓库集中存储分发:公共 Docker Hub,企业 Harbor。
- Harbor 比轻量 registry 多了 UI、权限、漏洞扫描、签名、复制。
- 镜像命名:仓库地址/项目/镜像:tag;HTTP 仓库要配 insecure-registries。
- 镜像安全:漏洞扫描、签名、最小化、不放密钥、定期更新。
- K8s 拉私有镜像配 imagePullSecrets;tag 用版本号别用 latest。