15.9.1 镜像仓库类型与选型(Docker Hub/私有仓库/云厂商)
镜像仓库按部署与服务形态可分为公共仓库、私有仓库与云厂商托管仓库。公共仓库以 Docker Hub 为代表,适合开源与小规模团队使用;私有仓库(Registry/Harbor)适合中大型企业与内网合规要求;云厂商托管仓库(ACR/ECR/GCR 等)适合云上生产与多地域分发。选型需综合安全合规、性能可用性、成本运维、生态集成与网络访问策略。
原理草图(镜像分发路径)
选型对比要点(带示例)#
- 安全与合规:私有仓库可在内网部署并配合审计/扫描,云托管可集成 KMS、审计与扫描;Docker Hub 权限与合规能力相对弱。
- 性能与可用性:云托管支持跨地域加速;私有仓库需自建高可用;公共仓库受公网与限速影响。
- 成本与运维:自建需运维投入;云托管按量计费;Docker Hub 适合轻量与开源项目。
- 生态集成:云托管/私有仓库更易与 CI/CD、K8s、镜像签名集成。
快速示例:三类仓库的使用体验#
1) 公共仓库(Docker Hub)#
# 登录 Docker Hub(首次使用)
docker login
# 拉取官方镜像
docker pull nginx:1.25
# 标记并推送到自己的仓库
docker tag nginx:1.25 yourname/nginx:1.25
docker push yourname/nginx:1.25
命令解释
- docker login:保存凭据到本地,后续 push/pull 免密或使用 token。
- docker tag:给本地镜像加上目标仓库与版本。
- docker push:上传镜像层到远端仓库。
2) 私有仓库(Registry 最小化体验)#
用于理解私有仓库基本流程,生产建议 Harbor。
# 1. 启动私有 Registry
docker run -d --name registry -p 5000:5000 \
-v /data/registry:/var/lib/registry \
registry:2
# 2. 标记镜像并推送到私有仓库
docker tag nginx:1.25 10.0.0.10:5000/nginx:1.25
docker push 10.0.0.10:5000/nginx:1.25
# 3. 其他节点拉取
docker pull 10.0.0.10:5000/nginx:1.25
预期效果
- /data/registry 中出现镜像层数据;
- 其他节点可拉取 10.0.0.10:5000/nginx:1.25。
3) 云托管仓库(以通用流程示意)#
# 假设仓库地址为 registry.cn-example.com/project/app
docker login registry.cn-example.com
docker tag nginx:1.25 registry.cn-example.com/project/nginx:1.25
docker push registry.cn-example.com/project/nginx:1.25
命令解释
- docker login 通常使用云账号或临时 token;
- registry.cn-example.com 为云厂商镜像仓库域名。
安装与配置要点(私有/云托管)#
私有仓库基础配置(HTTP 示例,生产建议 HTTPS)#
# /etc/docker/daemon.json 允许不安全仓库(仅测试)
{
"insecure-registries": ["10.0.0.10:5000"]
}
# 使配置生效
systemctl restart docker
说明
- 仅用于内网测试;生产必须配置 TLS 证书并关闭 insecure-registries。
云托管网络加速(示意)#
# 通过镜像加速器提高拉取速度(以国内镜像加速为例)
# /etc/docker/daemon.json
{
"registry-mirrors": ["https://mirror.example.com"]
}
systemctl restart docker
排错与诊断(常见问题)#
1) Push 失败:denied: requested access to the resource is denied#
# 检查登录状态
docker info | grep -i "Username"
# 重新登录
docker login registry.cn-example.com
原因:未登录或无权限;私有仓库需项目/命名空间授权。
2) Pull 慢或超时#
# 检查 DNS/网络
ping registry.cn-example.com
curl -I https://registry.cn-example.com/v2/
# 配置镜像加速(如前所示)
原因:公网链路慢或仓库未启用加速。
3) 私有仓库被拒绝:http: server gave HTTP response to HTTPS client#
# 原因:仓库是 HTTP,客户端以 HTTPS 访问
# 解决:配置 insecure-registries 或为仓库配置 TLS
练习#
- 使用 Docker Hub 上传一个自定义镜像,并在另一台机器成功拉取。
- 在内网启动 Registry,配置
insecure-registries,完成 push/pull 验证。 - 对比拉取速度:启用与不启用镜像加速器,并记录拉取时间。
- 编写一份选型说明:基于安全、成本、可用性与集成,给出你所在团队的推荐仓库类型与理由。