镜像仓库管理

Docker 镜像仓库的使用与管理,包括 Docker Hub、私有仓库等


📋 目录


Docker Hub 使用

注册与登录

# 注册账号
# 访问 https://hub.docker.com 注册
 
# 登录 Docker Hub
docker login
 
# 使用用户名登录
docker login -u username
 
# 使用访问令牌登录
echo $DOCKER_TOKEN | docker login -u username --password-stdin

搜索镜像

# 搜索镜像
docker search nginx
 
# 限制搜索结果
docker search --limit 5 nginx
 
# 只显示官方镜像
docker search --filter "is-official=true" nginx
 
# 只显示自动构建的镜像
docker search --filter "is-automated=true" nginx

拉取镜像

# 拉取官方镜像
docker pull nginx
 
# 拉取用户镜像
docker pull username/myapp:latest
 
# 拉取指定版本
docker pull nginx:1.21

私有仓库搭建

Docker Registry

Docker 官方提供的私有仓库实现。

快速启动

# 启动 Registry
docker run -d -p 5000:5000 --name registry registry:2
 
# 使用 HTTPS(需要证书)
docker run -d -p 5000:5000 \
  -v /path/to/certs:/certs \
  -e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/domain.crt \
  -e REGISTRY_HTTP_TLS_PRIVATE_KEY=/certs/domain.key \
  --name registry registry:2

配置认证

# 使用 htpasswd 创建认证文件
docker run --rm --entrypoint htpasswd httpd:2 \
  -Bbn username password > auth/htpasswd
 
# 启动带认证的 Registry
docker run -d -p 5000:5000 \
  -v $(pwd)/auth:/auth \
  -e "REGISTRY_AUTH=htpasswd" \
  -e "REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd" \
  -e "REGISTRY_AUTH_HTPASSWD_REALM=Registry Realm" \
  --name registry registry:2

使用私有仓库

# 标记镜像
docker tag myapp:latest localhost:5000/myapp:latest
 
# 推送镜像
docker push localhost:5000/myapp:latest
 
# 拉取镜像
docker pull localhost:5000/myapp:latest

Harbor

企业级容器镜像仓库,提供更多功能。

功能特性

  • Web UI 管理界面
  • 镜像扫描和漏洞检测
  • 镜像复制和同步
  • RBAC 权限管理
  • 审计日志

安装 Harbor

# 下载 Harbor
wget https://github.com/goharbor/harbor/releases/download/v2.7.0/harbor-offline-installer-v2.7.0.tgz
tar xvf harbor-offline-installer-v2.7.0.tgz
 
# 配置 Harbor
cd harbor
cp harbor.yml.tmpl harbor.yml
# 编辑 harbor.yml 配置文件
 
# 安装 Harbor
./install.sh

使用 Harbor

# 登录 Harbor
docker login harbor.example.com
 
# 推送镜像
docker tag myapp:latest harbor.example.com/project/myapp:latest
docker push harbor.example.com/project/myapp:latest
 
# 拉取镜像
docker pull harbor.example.com/project/myapp:latest

镜像推送与拉取

推送镜像

# 标记镜像
docker tag myapp:latest username/myapp:latest
 
# 推送镜像
docker push username/myapp:latest
 
# 推送多个标签
docker push username/myapp:latest
docker push username/myapp:v1.0.0
 
# 推送所有标签
docker push username/myapp --all-tags

拉取镜像

# 拉取最新版本
docker pull username/myapp:latest
 
# 拉取指定版本
docker pull username/myapp:v1.0.0
 
# 拉取所有标签
docker pull username/myapp --all-tags

镜像命名规范

[仓库地址/][用户名/]镜像名[:标签]

示例:

  • nginx:latest - Docker Hub 官方镜像
  • username/myapp:v1.0 - 用户自定义镜像
  • registry.example.com/project/app:latest - 私有仓库镜像

镜像版本管理

标签策略

语义化版本

# 主版本号.次版本号.修订号
docker tag myapp:latest myapp:1.0.0
docker tag myapp:latest myapp:1.1.0
docker tag myapp:latest myapp:2.0.0

环境标签

# 开发环境
docker tag myapp:latest myapp:dev
 
# 测试环境
docker tag myapp:latest myapp:test
 
# 生产环境
docker tag myapp:latest myapp:prod

Git 标签

# 使用 Git commit SHA
docker tag myapp:latest myapp:$(git rev-parse --short HEAD)
 
# 使用 Git 标签
docker tag myapp:latest myapp:$(git describe --tags)

版本管理最佳实践

  1. 使用语义化版本:遵循 SemVer 规范
  2. 保留 latest 标签:指向最新稳定版本
  3. 使用特定版本:生产环境使用具体版本号
  4. 定期清理旧版本:删除不再使用的镜像版本

镜像安全扫描

Docker Scout

Docker 官方安全扫描工具。

# 扫描镜像漏洞
docker scout cves nginx:latest
 
# 查看详细报告
docker scout cves --format json nginx:latest
 
# 比较两个镜像
docker scout compare nginx:1.20 nginx:1.21

Trivy

开源安全扫描工具。

# 安装 Trivy
brew install trivy  # macOS
# 或
wget https://github.com/aquasecurity/trivy/releases/download/v0.40.0/trivy_0.40.0_Linux-64bit.tar.gz
 
# 扫描镜像
trivy image nginx:latest
 
# 扫描并生成报告
trivy image -f json -o report.json nginx:latest

Harbor 安全扫描

Harbor 内置安全扫描功能。

  1. 在 Harbor Web UI 中选择镜像
  2. 点击”扫描”按钮
  3. 查看扫描结果和漏洞详情

仓库最佳实践

1. 镜像命名规范

  • 使用有意义的名称
  • 遵循命名约定
  • 使用版本标签而非 latest

2. 访问控制

  • 使用认证和授权
  • 限制推送权限
  • 定期审查访问权限

3. 镜像清理

# 删除未使用的镜像
docker image prune -a
 
# 删除特定标签
docker rmi username/myapp:old-tag

4. 镜像备份

# 导出镜像
docker save -o myapp.tar username/myapp:latest
 
# 导入镜像
docker load -i myapp.tar

5. 镜像同步

# 使用 Harbor 镜像复制功能
# 在 Harbor Web UI 中配置复制规则
 
# 或使用脚本同步
docker pull source-registry.com/myapp:latest
docker tag source-registry.com/myapp:latest target-registry.com/myapp:latest
docker push target-registry.com/myapp:latest

常见问题

1. 推送失败:unauthorized

问题:未登录或认证失败。

解决

# 重新登录
docker login
 
# 检查认证信息
cat ~/.docker/config.json

2. 推送失败:denied

问题:没有推送权限。

解决

  • 检查仓库权限设置
  • 确认镜像名称正确
  • 联系仓库管理员

3. 拉取速度慢

问题:网络问题或镜像源问题。

解决

# 配置镜像加速器(中国用户)
# 编辑 /etc/docker/daemon.json
{
  "registry-mirrors": [
    "https://docker.mirrors.ustc.edu.cn",
    "https://hub-mirror.c.163.com"
  ]
}
 
# 重启 Docker
sudo systemctl restart docker

📚 参考资源


相关笔记