DevOps 入门系列:镜像仓库(Docker Registry)
镜像仓库(Docker Registry):让你的镜像无处不达
前置知识:掌握
docker build镜像构建、docker run本地容器运行;本章目标:掌握镜像仓库分层概念、阿里云 ACR 全流程、镜像标签规范、国内网络分层优化、故障排查。
第一周你学会了用 docker build 构建镜像,用 docker run 本地运行。但如果想把镜像部署到另一台服务器(比如云服务器),就需要一个中间仓库来存储和分发镜像。这个仓库就是 Docker Registry。
1.1 为什么需要镜像仓库?
业务场景
在个人笔记本构建 Flask 应用镜像 myapp:v1,需要部署至阿里云 ECS 云服务器。
-
备选方案:
docker save+docker load打包镜像文件传输,方式原始、不利于自动化、版本管理; -
标准方案:镜像推送至中心仓库,远端服务器从仓库拉取镜像运行,适配 CI/CD 自动化发布。
| Docker 术语 | 说明 |
|---|---|
| Registry(镜像仓库) | 整体平台,承载海量项目镜像 |
| Repository(仓库) | 单个应用项目目录,同一项目所有版本存放处 |
| Tag(标签) | 镜像版本别名,指针映射真实镜像哈希 ID |
| Image ID | 镜像内容哈希,内容不变 ID 永久固定 |
开发者:打包镜像上传仓库;运维 / 服务端:从远端仓库拉取镜像部署。
1.2 核心概念分层图解
Docker Registry(如 Docker Hub、阿里云 ACR)
│
├── Repository: my-flask-app
│ ├── Tag: v1.0.0 ────→ Image ID: sha256:abc123...
│ ├── Tag: v1.0.1 ────→ Image ID: sha256:def456...
│ └── Tag: latest ────→ 指向 v1.0.1(浮动指针)
│
├── Repository: my-nginx
│ └── Tag: 1.21
│
└── ...
层级规则
-
一个 Registry 可包含多个 Repository,Repository 以项目 / 应用名称区分;
-
一个 Repository 可包含多个 Tag,代表同一个应用的不同迭代版本;
-
Tag 仅为指向 Image ID 的软指针,可被重新指向、删除;生产环境禁止随意变更已有 Tag 指向;
-
Image ID 由镜像文件内容 SHA256 哈希生成,镜像内容不变,ID 永远不变。
1.3 国内可用的镜像仓库选择
| 仓库方案 | 地址示例 | 优点 | 缺点 |
|---|---|---|---|
| Docker Hub | [docker.io/library/nginx](docker.io/library/nginx) | 全球镜像最全、海量官方公共镜像 | 国内拉取速率极低、频繁超时失败 |
| 阿里云 ACR(个人免费版) | registry.cn-hangzhou.aliyuncs.com/命名空间 / 仓库名 | 国内 CDN 加速、免费额度充足、生态完善 | 需要阿里云实名认证 |
| 腾讯云 TCR | ccr.ccs.tencentyun.com/命名空间 / 仓库名 | 同阿里云,云服务器内网拉取免费高速 | 需要账号实名 |
| Harbor(自建私有化) | 自定义服务器 IP + 端口 | 企业内网私有部署、数据不外流 | 自行部署、运维维护成本高 |
下文所有实操命令基于阿里云 ACR。
1.4 准备工作:创建阿里云 ACR 仓库
-
登录阿里云【容器镜像服务 ACR】控制台;
-
创建命名空间(例:
devops-demo):账号级分组目录,统一管理同项目组镜像; -
在命名空间内新建镜像仓库(例:
my-flask-app),仓库类型选择私有仓库(学习首选,免费); -
进入【访问凭证】→设置固定登录密码(禁用临时 Token,不利于 CI 流水线自动化);
-
记录 Registry 域名:
registry.cn-hangzhou.aliyuncs.com。
最终完整仓库地址格式
<registry域名>/<命名空间>/<仓库名>
# 示例
registry.cn-hangzhou.aliyuncs.com/devops-demo/my-flask-app
1.5 命令实操:登录→打标→推送→拉取全流程
1.5.1 登录远端镜像仓库
docker login --username=你的阿里云账号 registry.cn-hangzhou.aliyuncs.com
执行后输入 ACR 固定密码(输入无回显,正常现象),登录成功凭证存放路径:~/.docker/config.json。
⚠️ 安全警告:config.json 中账号密码为 Base64 编码(非加密),严禁提交至 Git 代码仓库,防止凭证泄露。
1.5.2 准备本地测试镜像
若无自定义 Flask 镜像,直接拉取 Nginx 作为测试镜像:
docker pull nginx:1.24
1.5.3 镜像打 Tag(重命名绑定私有仓库)
打标原理
原生 nginx:1.24 默认归属 Docker Hub 官方仓库,无法直接推送阿里云私有仓库;必须通过docker tag为镜像新增别名,格式对齐私有仓库地址。
docker tag不会复制镜像文件,仅新增别名映射,新旧标签共用同一个 Image ID。
# 语法:docker tag 原镜像名:原tag 私有仓库地址:版本号
docker tag nginx:1.24 registry.cn-hangzhou.aliyuncs.com/devops-demo/my-flask-app:1.0.0
执行docker images可查询到两条镜像记录,IMAGE ID 完全一致。
1.5.4 推送镜像至阿里云 ACR
docker push registry.cn-hangzhou.aliyuncs.com/devops-demo/my-flask-app:1.0.0
推送完毕后,可在阿里云 ACR 控制台查看已上传镜像。
1.5.5 跨服务器拉取 + 启动容器
在任意装有 Docker 的云服务器执行如下命令:
# 1.登录同域名ACR仓库
docker login --username=你的阿里云账号 registry.cn-hangzhou.aliyuncs.com
# 2.拉取私有镜像
docker pull registry.cn-hangzhou.aliyuncs.com/devops-demo/my-flask-app:1.0.0
# 3.启动容器
docker run -d -p 80:80 registry.cn-hangzhou.aliyuncs.com/devops-demo/my-flask-app:1.0.0
1.6 镜像标签规范
1.6.1 不推荐:latest 标签(生产环境禁用)
latest是浮动指针标签,弊端:
-
重复推送同名
latest会直接覆盖原有标签指向; -
今日
latest指向 v1.0,下次推送直接改为 v1.1;服务器重启拉取镜像会意外升级版本; -
故障回滚无历史版本溯源,无法确认上一稳定版本对应的镜像 ID。
1.6.2 生产环境不可变标签三种规范方案
方案 1:语义化版本 + Git 短 Commit 哈希
# 主版本+commit短哈希,可读+唯一可溯源
docker build -t myapp:1.0.0 -t myapp:1.0.0-abc123 .
-
1.0.0:语义化版本(主版本。次版本。补丁),人工识别; -
1.0.0-abc123:附加 Git 提交哈希,绑定源码提交记录,全链路追溯。
方案 2:CI 流水线编号标签(自动化流水线场景)
# CI流水线变量生成唯一标签,每条流水线构建版本不重复
docker build -t myapp:ci-$CI_PIPELINE_ID .
方案 3:纯 Git Commit 短哈希标签
docker build -t myapp:$CI_COMMIT_SHORT_SHA .
1.7 国内 Docker 三层网络分层优化方案
国内 Docker 构建 / 拉取慢分三类网络请求,三层问题独立,需分层针对性优化。
第一层:Dockerfile FROM 基础镜像拉取加速
问题:FROM python:3.9从 Docker Hub 拉取基础镜像超时
解决方案:配置 Docker 守护进程镜像加速器
# Linux路径:/etc/docker/daemon.json
{
"registry-mirrors": ["https://docker.m.daocloud.io"]
}
重启 Docker 生效:
sudo systemctl restart docker
Windows/Mac Docker Desktop:设置→Docker Engine 内填入相同 json 配置;可选加速器:DaoCloud 公共加速、阿里云个人专属加速、中科大镜像源。
第二层:构建时依赖包下载加速(pip/npm/maven)
构建阶段RUN执行包管理器下载依赖,走国外源速度差,在 Dockerfile 内指定国内源:
# Python pip 国内源示例
RUN pip install -i https://mirrors.aliyun.com/pypi/simple/ -r requirements.txt
# Node npm国内源示例
RUN npm config set registry https://registry.npmmirror.com && npm install
# Java Maven示例(指定settings.xml配置阿里云maven源)
RUN mvn clean package -Dmaven.repo.local=/cache/m2 -s /path/to/settings.xml
第三层:构建中 git clone 源码加速
构建脚本拉取 GitHub/GitLab 国外源码缓慢:
-
备选:代码同步至 Gitee / 极狐 GitLab 国内镜像仓库;
-
备选:Git 客户端配置代理。
三层加速互不干扰,配置镜像加速器≠pip 下载变快,需逐层配置。
1.8 常见故障排查速查表
| 报错现象 | 根因分析 | 解决步骤 |
|---|---|---|
| dial tcp: lookup ... timeout | 网络受限 / 加速器配置失效 | 校验 daemon.json 加速器地址,替换国内 Registry 域名 |
| unauthorized: authentication required | 登录域名和 push 域名不一致、登录失效 | docker login 域名必须和 push 镜像前缀域名完全一致(不要带 https://),重新登录 |
| denied: requested access to the resource is denied | 命名空间 / 仓库名错误、账号无仓库权限 | 核对 ACR 控制台命名空间、仓库名称,确认仓库已创建、账号具备读写权限 |
| no such image | docker tag 源镜像名称书写错误 | docker images 查看本地真实镜像名与 Tag,重新执行 tag 打标 |
openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构
更多推荐


所有评论(0)