04 - 阿里云 ACR(容器镜像服务)
ACR 是什么?
ACR(Alibaba Cloud Container Registry)是阿里云提供的容器镜像托管服务,类似 Docker Hub 但更适合国内使用和企业场景。
┌──────────────────────────────────────────────────────────────┐
│ │
│ 开发者本地 ACR │
│ ┌──────────┐ docker push ┌─────────────────┐ │
│ │ 构建镜像 │ ───────────────► │ 镜像仓库 │ │
│ │ docker │ │ │ │
│ │ build │ docker pull │ - 个人版 (免费) │ │
│ │ │ ◄─────────────── │ - 企业版 (高级) │ │
│ └──────────┘ └────────┬────────┘ │
│ │ │
│ ACK 集群 │
│ ┌────────┴────────┐ │
│ │ imagePullSecret │ │
│ │ 自动拉取镜像 │ │
│ └─────────────────┘ │
└──────────────────────────────────────────────────────────────┘ACR 版本对比
| 特性 | 个人版 | 企业版 |
|---|---|---|
| 价格 | 免费 | 按量付费 |
| 命名空间 | 3 个 | 无限 |
| 仓库数 | 300 个 | 无限 |
| 镜像扫描 | 基础 | 高级 + 自动阻断 |
| 多地域同步 | 不支持 | 支持 |
| P2P 加速 | 不支持 | 支持(大规模拉取) |
| 制品管理 | 镜像 | 镜像 + Helm Chart |
| 网络访问 | 公网 | 公网 + VPC 内网 |
| 适用场景 | 个人/学习 | 生产环境 |
ACR 个人版使用
1. 创建实例和仓库
- 登录阿里云控制台 → 容器镜像服务
- 创建个人版实例
- 设置 Registry 登录密码
- 创建命名空间(如
my-ml-project) - 创建镜像仓库(如
training)
2. 登录 ACR
bash
# 登录(选择就近地域)
docker login --username=<阿里云账号> registry.cn-hangzhou.aliyuncs.com
# 输入 Registry 密码(不是阿里云密码)
# 常用地域 Registry 地址
# 杭州: registry.cn-hangzhou.aliyuncs.com
# 上海: registry.cn-shanghai.aliyuncs.com
# 北京: registry.cn-beijing.aliyuncs.com
# 深圳: registry.cn-shenzhen.aliyuncs.com3. 推送镜像
bash
# 构建镜像
docker build -t my-training:v1 .
# 打 tag(格式:registry地址/命名空间/仓库名:tag)
docker tag my-training:v1 \
registry.cn-hangzhou.aliyuncs.com/my-ml-project/training:v1
# 推送
docker push registry.cn-hangzhou.aliyuncs.com/my-ml-project/training:v14. 拉取镜像
bash
# 直接拉取
docker pull registry.cn-hangzhou.aliyuncs.com/my-ml-project/training:v1在 ACK 中使用 ACR 镜像
方式 1:创建 imagePullSecret
bash
# 创建 Secret
kubectl create secret docker-registry acr-secret \
--docker-server=registry.cn-hangzhou.aliyuncs.com \
--docker-username=<阿里云账号> \
--docker-password=<Registry密码> \
--docker-email=<邮箱>
# 在 Pod 中使用yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-app
spec:
template:
spec:
imagePullSecrets:
- name: acr-secret # 引用 Secret
containers:
- name: app
image: registry.cn-hangzhou.aliyuncs.com/my-ml-project/training:v1方式 2:ACK 免密拉取(推荐)
ACK 集群可以配置免密拉取同地域 ACR 镜像,无需 imagePullSecret:
- ACK 控制台 → 集群设置 → 免密插件
- 安装
aliyun-acr-credential-helper组件 - 配置允许拉取的 ACR 命名空间
安装后,Pod 直接引用 ACR 镜像即可:
yaml
containers:
- name: app
image: registry.cn-hangzhou.aliyuncs.com/my-ml-project/training:v1方式 3:使用 VPC 内网地址(生产推荐)
同地域 ACK 拉取 ACR 镜像应使用VPC 内网地址,速度更快且不收公网流量费:
yaml
# 公网地址
image: registry.cn-hangzhou.aliyuncs.com/my-ns/app:v1
# VPC 内网地址(推荐)
image: registry-vpc.cn-hangzhou.aliyuncs.com/my-ns/app:v1
# 经典网络内网地址
image: registry-internal.cn-hangzhou.aliyuncs.com/my-ns/app:v1镜像构建最佳实践
使用 ACR 自动构建(CI/CD)
ACR 支持绑定 GitHub/GitLab/Gitee 代码仓库,代码推送后自动构建镜像:
- ACR 控制台 → 镜像仓库 → 构建
- 绑定代码源(GitHub/Gitee)
- 配置构建规则:
- 代码分支 / Tag 触发
- Dockerfile 路径
- 构建上下文
镜像 Tag 规范
bash
# ✗ 不推荐
my-app:latest # 不知道是哪个版本
# ✓ 推荐:语义化版本
my-app:1.2.3
# ✓ 推荐:Git commit hash(CI/CD 中常用)
my-app:abc1234
# ✓ 推荐:日期 + 短 hash
my-app:20260315-abc1234镜像安全扫描
bash
# ACR 控制台开启自动扫描
# 每次推送镜像后自动扫描漏洞
# 也可以使用开源工具本地扫描
# Trivy(推荐)
brew install trivy
trivy image registry.cn-hangzhou.aliyuncs.com/my-ns/app:v1
# 扫描结果示例:
# CRITICAL: 0
# HIGH: 2
# MEDIUM: 5镜像加速
拉取国外镜像的加速方案
很多 K8s 依赖镜像在 registry.k8s.io 或 docker.io,国内直接拉取很慢或失败。
bash
# 方案 1:配置 Docker 镜像加速器
# Docker Desktop → Settings → Docker Engine
{
"registry-mirrors": [
"https://<你的ID>.mirror.aliyuncs.com"
]
}
# 方案 2:通过 ACR 转存
# 在 ACR 中创建镜像仓库,选择"海外"源镜像,自动同步
# 方案 3:手动转存
docker pull registry.k8s.io/ingress-nginx/controller:v1.10.0
docker tag registry.k8s.io/ingress-nginx/controller:v1.10.0 \
registry.cn-hangzhou.aliyuncs.com/my-ns/ingress-nginx-controller:v1.10.0
docker push registry.cn-hangzhou.aliyuncs.com/my-ns/ingress-nginx-controller:v1.10.0ACR 企业版特性
Helm Chart 托管
bash
# 登录 OCI Registry
helm registry login registry.cn-hangzhou.aliyuncs.com
# 推送 Chart
helm push my-chart-0.1.0.tgz oci://registry.cn-hangzhou.aliyuncs.com/my-ns
# 安装
helm install my-release oci://registry.cn-hangzhou.aliyuncs.com/my-ns/my-chart --version 0.1.0多地域镜像同步
企业版支持配置同步规则,自动将镜像同步到多个地域:
杭州 ACR ──同步──► 北京 ACR
│ │
▼ ▼
杭州 ACK 北京 ACK适用于多地域部署的生产环境。
常用命令总结
bash
# === 登录 ===
docker login registry.cn-hangzhou.aliyuncs.com
# === Tag 和推送 ===
docker tag <local-image> registry.cn-hangzhou.aliyuncs.com/<ns>/<repo>:<tag>
docker push registry.cn-hangzhou.aliyuncs.com/<ns>/<repo>:<tag>
# === 拉取 ===
docker pull registry.cn-hangzhou.aliyuncs.com/<ns>/<repo>:<tag>
# VPC 内网
docker pull registry-vpc.cn-hangzhou.aliyuncs.com/<ns>/<repo>:<tag>
# === K8s Secret ===
kubectl create secret docker-registry acr-secret \
--docker-server=registry.cn-hangzhou.aliyuncs.com \
--docker-username=<user> \
--docker-password=<pass>
# === 镜像扫描 ===
trivy image registry.cn-hangzhou.aliyuncs.com/<ns>/<repo>:<tag>分布式训练中的 ACR 工作流
1. 本地开发训练代码
│
▼
2. 构建训练镜像
docker build -t registry.cn-hangzhou.aliyuncs.com/ml/training:v1 .
│
▼
3. 推送到 ACR
docker push registry.cn-hangzhou.aliyuncs.com/ml/training:v1
│
▼
4. ACK 集群拉取(VPC 内网)
image: registry-vpc.cn-hangzhou.aliyuncs.com/ml/training:v1
│
▼
5. PyTorchJob 运行分布式训练