一行命令,几秒钟,一个完整的 Redis 服务就跑在本地了。这是 Docker 的日常,也是无数开发者第一次体验容器化时留下的印象。但 docker pull 背后那个默默运转的镜像仓库,很多人从没认真看过——它到底怎么工作的?镜像怎么从本地打包发布出去?团队协作时怎么统一管理镜像版本?
这些问题,本文逐一讲清楚。
Docker Hub 在整个工作流中的位置
理解 Docker Hub 之前,先看清楚它在整个容器化流程里扮演的角色:
#mermaid-svg-uwpC9EFslJi4y6PI{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-uwpC9EFslJi4y6PI .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-uwpC9EFslJi4y6PI .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-uwpC9EFslJi4y6PI .error-icon{fill:#552222;}#mermaid-svg-uwpC9EFslJi4y6PI .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-uwpC9EFslJi4y6PI .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-uwpC9EFslJi4y6PI .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-uwpC9EFslJi4y6PI .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-uwpC9EFslJi4y6PI .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-uwpC9EFslJi4y6PI .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-uwpC9EFslJi4y6PI .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-uwpC9EFslJi4y6PI .marker{fill:#333333;stroke:#333333;}#mermaid-svg-uwpC9EFslJi4y6PI .marker.cross{stroke:#333333;}#mermaid-svg-uwpC9EFslJi4y6PI svg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-uwpC9EFslJi4y6PI p{margin:0;}#mermaid-svg-uwpC9EFslJi4y6PI .label{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;color:#333;}#mermaid-svg-uwpC9EFslJi4y6PI .cluster-label text{fill:#333;}#mermaid-svg-uwpC9EFslJi4y6PI .cluster-label span{color:#333;}#mermaid-svg-uwpC9EFslJi4y6PI .cluster-label span p{background-color:transparent;}#mermaid-svg-uwpC9EFslJi4y6PI .label text,#mermaid-svg-uwpC9EFslJi4y6PI span{fill:#333;color:#333;}#mermaid-svg-uwpC9EFslJi4y6PI .node rect,#mermaid-svg-uwpC9EFslJi4y6PI .node circle,#mermaid-svg-uwpC9EFslJi4y6PI .node ellipse,#mermaid-svg-uwpC9EFslJi4y6PI .node polygon,#mermaid-svg-uwpC9EFslJi4y6PI .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-uwpC9EFslJi4y6PI .rough-node .label text,#mermaid-svg-uwpC9EFslJi4y6PI .node .label text,#mermaid-svg-uwpC9EFslJi4y6PI .image-shape .label,#mermaid-svg-uwpC9EFslJi4y6PI .icon-shape .label{text-anchor:middle;}#mermaid-svg-uwpC9EFslJi4y6PI .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-uwpC9EFslJi4y6PI .rough-node .label,#mermaid-svg-uwpC9EFslJi4y6PI .node .label,#mermaid-svg-uwpC9EFslJi4y6PI .image-shape .label,#mermaid-svg-uwpC9EFslJi4y6PI .icon-shape .label{text-align:center;}#mermaid-svg-uwpC9EFslJi4y6PI .node.clickable{cursor:pointer;}#mermaid-svg-uwpC9EFslJi4y6PI .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-uwpC9EFslJi4y6PI .arrowheadPath{fill:#333333;}#mermaid-svg-uwpC9EFslJi4y6PI .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-uwpC9EFslJi4y6PI .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-uwpC9EFslJi4y6PI .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-uwpC9EFslJi4y6PI .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-uwpC9EFslJi4y6PI .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-uwpC9EFslJi4y6PI .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-uwpC9EFslJi4y6PI .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-uwpC9EFslJi4y6PI .cluster text{fill:#333;}#mermaid-svg-uwpC9EFslJi4y6PI .cluster span{color:#333;}#mermaid-svg-uwpC9EFslJi4y6PI div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-uwpC9EFslJi4y6PI .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-uwpC9EFslJi4y6PI rect.text{fill:none;stroke-width:0;}#mermaid-svg-uwpC9EFslJi4y6PI .icon-shape,#mermaid-svg-uwpC9EFslJi4y6PI .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-uwpC9EFslJi4y6PI .icon-shape p,#mermaid-svg-uwpC9EFslJi4y6PI .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-uwpC9EFslJi4y6PI .icon-shape .label rect,#mermaid-svg-uwpC9EFslJi4y6PI .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-uwpC9EFslJi4y6PI .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-uwpC9EFslJi4y6PI .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-uwpC9EFslJi4y6PI :root{–mermaid-font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}
docker build
docker tag
docker push
docker pull
docker run
本地代码
本地镜像
打仓库标签
Docker Hub
服务器/协作者
运行中的容器
Docker Hub 本质上是一个镜像注册中心(Registry)。开发者在本地构建好镜像后,推送到 Hub,服务器或团队成员再从 Hub 拉取。这个模式跟 Git 托管代码的逻辑完全一致:本地开发 → push 到远端 → 其他地方 pull 使用。
官方地址:hub.docker.com
免费账号权限:
| 公共仓库 | 无限 | 无限 |
| 私有仓库 | 1 个 | 无限 |
| 拉取次数(匿名) | 100次/6h | 不限 |
| 拉取次数(已登录) | 200次/6h | 不限 |
个人学习和小型项目,免费版完全够用。
账号注册与本地登录
注册账号去 hub.docker.com 完成邮件验证即可。注意:必须验证邮箱,否则推送镜像时会报权限拒绝错误。
本地登录命令:
docker login
执行后输入用户名和密码,Docker 会把凭证写入 ~/.docker/config.json,后续的 pull/push 操作无需重复验证。
退出登录:
docker logout
也支持直接在命令行传参,适合 CI/CD 脚本中使用(密码建议走环境变量,不要硬编码):
echo "$DOCKER_PASSWORD" | docker login -u "$DOCKER_USERNAME" –password-stdin
搜索与拉取镜像
命令行搜索
docker search nginx
输出结果示例:
NAME DESCRIPTION STARS OFFICIAL
nginx Official build of Nginx. 15000 [OK]
linuxserver/nginx Nginx container images … 500
bitnami/nginx Bitnami nginx container 200
[OK] 标记代表 Docker 官方维护的镜像,安全性和稳定性有保障,优先选这类。
指定版本拉取
# 拉取最新版
docker pull nginx
# 拉取指定版本(推荐生产环境使用,避免 latest 带来的不确定性)
docker pull nginx:1.25-alpine
标签 alpine 代表基于 Alpine Linux 构建的轻量版本,体积通常比普通版小 60% 以上。
拉取完成后查看本地镜像列表:
docker images
输出:
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest a6bd7102f7ej 2 weeks ago 187MB
nginx 1.25-alpine 8d3c4f92a1b3 3 weeks ago 41MB
redis 7.0-alpine 3d4d4e5f6fa8 3 weeks ago 30MB
镜像大小差距明显——能用 Alpine 版的场景,尽量用,部署速度和存储成本都有改善。
构建镜像并推送到 Docker Hub
这是 Docker Hub 使用中最核心的操作链,完整流程如下:
服务器/协作者
Docker Hub
开发者本地
服务器/协作者
Docker Hub
开发者本地
#mermaid-svg-nD8UFbDDLMP3NNbg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-nD8UFbDDLMP3NNbg .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-nD8UFbDDLMP3NNbg .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-nD8UFbDDLMP3NNbg .error-icon{fill:#552222;}#mermaid-svg-nD8UFbDDLMP3NNbg .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-nD8UFbDDLMP3NNbg .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-nD8UFbDDLMP3NNbg .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-nD8UFbDDLMP3NNbg .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-nD8UFbDDLMP3NNbg .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-nD8UFbDDLMP3NNbg .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-nD8UFbDDLMP3NNbg .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-nD8UFbDDLMP3NNbg .marker{fill:#333333;stroke:#333333;}#mermaid-svg-nD8UFbDDLMP3NNbg .marker.cross{stroke:#333333;}#mermaid-svg-nD8UFbDDLMP3NNbg svg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-nD8UFbDDLMP3NNbg p{margin:0;}#mermaid-svg-nD8UFbDDLMP3NNbg .actor{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-nD8UFbDDLMP3NNbg text.actor>tspan{fill:black;stroke:none;}#mermaid-svg-nD8UFbDDLMP3NNbg .actor-line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-nD8UFbDDLMP3NNbg .innerArc{stroke-width:1.5;stroke-dasharray:none;}#mermaid-svg-nD8UFbDDLMP3NNbg .messageLine0{stroke-width:1.5;stroke-dasharray:none;stroke:#333;}#mermaid-svg-nD8UFbDDLMP3NNbg .messageLine1{stroke-width:1.5;stroke-dasharray:2,2;stroke:#333;}#mermaid-svg-nD8UFbDDLMP3NNbg #arrowhead path{fill:#333;stroke:#333;}#mermaid-svg-nD8UFbDDLMP3NNbg .sequenceNumber{fill:white;}#mermaid-svg-nD8UFbDDLMP3NNbg #sequencenumber{fill:#333;}#mermaid-svg-nD8UFbDDLMP3NNbg #crosshead path{fill:#333;stroke:#333;}#mermaid-svg-nD8UFbDDLMP3NNbg .messageText{fill:#333;stroke:none;}#mermaid-svg-nD8UFbDDLMP3NNbg .labelBox{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-nD8UFbDDLMP3NNbg .labelText,#mermaid-svg-nD8UFbDDLMP3NNbg .labelText>tspan{fill:black;stroke:none;}#mermaid-svg-nD8UFbDDLMP3NNbg .loopText,#mermaid-svg-nD8UFbDDLMP3NNbg .loopText>tspan{fill:black;stroke:none;}#mermaid-svg-nD8UFbDDLMP3NNbg .loopLine{stroke-width:2px;stroke-dasharray:2,2;stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-nD8UFbDDLMP3NNbg .note{stroke:#aaaa33;fill:#fff5ad;}#mermaid-svg-nD8UFbDDLMP3NNbg .noteText,#mermaid-svg-nD8UFbDDLMP3NNbg .noteText>tspan{fill:black;stroke:none;}#mermaid-svg-nD8UFbDDLMP3NNbg .activation0{fill:#f4f4f4;stroke:#666;}#mermaid-svg-nD8UFbDDLMP3NNbg .activation1{fill:#f4f4f4;stroke:#666;}#mermaid-svg-nD8UFbDDLMP3NNbg .activation2{fill:#f4f4f4;stroke:#666;}#mermaid-svg-nD8UFbDDLMP3NNbg .actorPopupMenu{position:absolute;}#mermaid-svg-nD8UFbDDLMP3NNbg .actorPopupMenuPanel{position:absolute;fill:#ECECFF;box-shadow:0px 8px 16px 0px rgba(0,0,0,0.2);filter:drop-shadow(3px 5px 2px rgb(0 0 0 / 0.4));}#mermaid-svg-nD8UFbDDLMP3NNbg .actor-man line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-nD8UFbDDLMP3NNbg .actor-man circle,#mermaid-svg-nD8UFbDDLMP3NNbg line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;stroke-width:2px;}#mermaid-svg-nD8UFbDDLMP3NNbg :root{–mermaid-font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}
镜像存储至仓库
docker build -t my-app .
docker tag my-app username/my-app:v1.0
docker push username/my-app:v1.0
Push 成功确认
docker pull username/my-app:v1.0
返回镜像层数据
docker run username/my-app:v1.0
第一步:在 Docker Hub 创建仓库
登录后依次点击:Repositories → Create Repository,填写仓库名称和可见性(Public/Private)。
仓库命名规则:全小写字母、数字和连字符,不支持空格。
第二步:给本地镜像打标签
Docker 镜像推送时必须携带完整的 Registry 地址前缀,Docker Hub 的格式是:
用户名/仓库名:标签
打标签命令:
docker tag my-app:latest username/my-app:v1.0
可以同时打多个标签,比如同时打 v1.0 和 latest:
docker tag my-app:latest username/my-app:v1.0
docker tag my-app:latest username/my-app:latest
第三步:推送
docker push username/my-app:v1.0
第一次推送耗时较长,Docker 会按层上传。相同内容的层只上传一次,后续更新只传变更层,速度很快。
第四步:拉取使用
docker pull username/my-app:v1.0
仓库管理:标签策略与版本规范
镜像标签不只是版本号,还是一种约定。常见的几种标签策略:
#mermaid-svg-Uizy26MnYa4S2Oxi{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-Uizy26MnYa4S2Oxi .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-Uizy26MnYa4S2Oxi .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-Uizy26MnYa4S2Oxi .error-icon{fill:#552222;}#mermaid-svg-Uizy26MnYa4S2Oxi .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-Uizy26MnYa4S2Oxi .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-Uizy26MnYa4S2Oxi .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-Uizy26MnYa4S2Oxi .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-Uizy26MnYa4S2Oxi .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-Uizy26MnYa4S2Oxi .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-Uizy26MnYa4S2Oxi .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-Uizy26MnYa4S2Oxi .marker{fill:#333333;stroke:#333333;}#mermaid-svg-Uizy26MnYa4S2Oxi .marker.cross{stroke:#333333;}#mermaid-svg-Uizy26MnYa4S2Oxi svg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-Uizy26MnYa4S2Oxi p{margin:0;}#mermaid-svg-Uizy26MnYa4S2Oxi .label{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;color:#333;}#mermaid-svg-Uizy26MnYa4S2Oxi .cluster-label text{fill:#333;}#mermaid-svg-Uizy26MnYa4S2Oxi .cluster-label span{color:#333;}#mermaid-svg-Uizy26MnYa4S2Oxi .cluster-label span p{background-color:transparent;}#mermaid-svg-Uizy26MnYa4S2Oxi .label text,#mermaid-svg-Uizy26MnYa4S2Oxi span{fill:#333;color:#333;}#mermaid-svg-Uizy26MnYa4S2Oxi .node rect,#mermaid-svg-Uizy26MnYa4S2Oxi .node circle,#mermaid-svg-Uizy26MnYa4S2Oxi .node ellipse,#mermaid-svg-Uizy26MnYa4S2Oxi .node polygon,#mermaid-svg-Uizy26MnYa4S2Oxi .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-Uizy26MnYa4S2Oxi .rough-node .label text,#mermaid-svg-Uizy26MnYa4S2Oxi .node .label text,#mermaid-svg-Uizy26MnYa4S2Oxi .image-shape .label,#mermaid-svg-Uizy26MnYa4S2Oxi .icon-shape .label{text-anchor:middle;}#mermaid-svg-Uizy26MnYa4S2Oxi .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-Uizy26MnYa4S2Oxi .rough-node .label,#mermaid-svg-Uizy26MnYa4S2Oxi .node .label,#mermaid-svg-Uizy26MnYa4S2Oxi .image-shape .label,#mermaid-svg-Uizy26MnYa4S2Oxi .icon-shape .label{text-align:center;}#mermaid-svg-Uizy26MnYa4S2Oxi .node.clickable{cursor:pointer;}#mermaid-svg-Uizy26MnYa4S2Oxi .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-Uizy26MnYa4S2Oxi .arrowheadPath{fill:#333333;}#mermaid-svg-Uizy26MnYa4S2Oxi .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-Uizy26MnYa4S2Oxi .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-Uizy26MnYa4S2Oxi .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-Uizy26MnYa4S2Oxi .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-Uizy26MnYa4S2Oxi .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-Uizy26MnYa4S2Oxi .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-Uizy26MnYa4S2Oxi .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-Uizy26MnYa4S2Oxi .cluster text{fill:#333;}#mermaid-svg-Uizy26MnYa4S2Oxi .cluster span{color:#333;}#mermaid-svg-Uizy26MnYa4S2Oxi div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-Uizy26MnYa4S2Oxi .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-Uizy26MnYa4S2Oxi rect.text{fill:none;stroke-width:0;}#mermaid-svg-Uizy26MnYa4S2Oxi .icon-shape,#mermaid-svg-Uizy26MnYa4S2Oxi .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-Uizy26MnYa4S2Oxi .icon-shape p,#mermaid-svg-Uizy26MnYa4S2Oxi .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-Uizy26MnYa4S2Oxi .icon-shape .label rect,#mermaid-svg-Uizy26MnYa4S2Oxi .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-Uizy26MnYa4S2Oxi .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-Uizy26MnYa4S2Oxi .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-Uizy26MnYa4S2Oxi :root{–mermaid-font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}
镜像标签策略
语义版本号
Git commit hash
构建日期
环境标识
v1.0.0 / v1.2.3
abc1234(短 hash)
20260503
prod / staging / dev
生产环境建议同时维护两类标签:
- 精确版本号(如 v1.2.3):用于追溯和回滚
- latest:始终指向最新稳定版,方便快速部署
避免在生产中只用 latest,一旦镜像更新出问题,回滚需要知道上一个版本号,latest 无法提供这个信息。
团队协作:Organization 与权限管理
个人账号下的仓库命名空间是 username/repo,团队场景下建议创建 Organization:
#mermaid-svg-LT9uM5M4vgtKMnVd{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-LT9uM5M4vgtKMnVd .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-LT9uM5M4vgtKMnVd .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-LT9uM5M4vgtKMnVd .error-icon{fill:#552222;}#mermaid-svg-LT9uM5M4vgtKMnVd .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-LT9uM5M4vgtKMnVd .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-LT9uM5M4vgtKMnVd .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-LT9uM5M4vgtKMnVd .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-LT9uM5M4vgtKMnVd .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-LT9uM5M4vgtKMnVd .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-LT9uM5M4vgtKMnVd .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-LT9uM5M4vgtKMnVd .marker{fill:#333333;stroke:#333333;}#mermaid-svg-LT9uM5M4vgtKMnVd .marker.cross{stroke:#333333;}#mermaid-svg-LT9uM5M4vgtKMnVd svg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-LT9uM5M4vgtKMnVd p{margin:0;}#mermaid-svg-LT9uM5M4vgtKMnVd .label{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;color:#333;}#mermaid-svg-LT9uM5M4vgtKMnVd .cluster-label text{fill:#333;}#mermaid-svg-LT9uM5M4vgtKMnVd .cluster-label span{color:#333;}#mermaid-svg-LT9uM5M4vgtKMnVd .cluster-label span p{background-color:transparent;}#mermaid-svg-LT9uM5M4vgtKMnVd .label text,#mermaid-svg-LT9uM5M4vgtKMnVd span{fill:#333;color:#333;}#mermaid-svg-LT9uM5M4vgtKMnVd .node rect,#mermaid-svg-LT9uM5M4vgtKMnVd .node circle,#mermaid-svg-LT9uM5M4vgtKMnVd .node ellipse,#mermaid-svg-LT9uM5M4vgtKMnVd .node polygon,#mermaid-svg-LT9uM5M4vgtKMnVd .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-LT9uM5M4vgtKMnVd .rough-node .label text,#mermaid-svg-LT9uM5M4vgtKMnVd .node .label text,#mermaid-svg-LT9uM5M4vgtKMnVd .image-shape .label,#mermaid-svg-LT9uM5M4vgtKMnVd .icon-shape .label{text-anchor:middle;}#mermaid-svg-LT9uM5M4vgtKMnVd .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-LT9uM5M4vgtKMnVd .rough-node .label,#mermaid-svg-LT9uM5M4vgtKMnVd .node .label,#mermaid-svg-LT9uM5M4vgtKMnVd .image-shape .label,#mermaid-svg-LT9uM5M4vgtKMnVd .icon-shape .label{text-align:center;}#mermaid-svg-LT9uM5M4vgtKMnVd .node.clickable{cursor:pointer;}#mermaid-svg-LT9uM5M4vgtKMnVd .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-LT9uM5M4vgtKMnVd .arrowheadPath{fill:#333333;}#mermaid-svg-LT9uM5M4vgtKMnVd .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-LT9uM5M4vgtKMnVd .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-LT9uM5M4vgtKMnVd .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-LT9uM5M4vgtKMnVd .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-LT9uM5M4vgtKMnVd .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-LT9uM5M4vgtKMnVd .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-LT9uM5M4vgtKMnVd .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-LT9uM5M4vgtKMnVd .cluster text{fill:#333;}#mermaid-svg-LT9uM5M4vgtKMnVd .cluster span{color:#333;}#mermaid-svg-LT9uM5M4vgtKMnVd div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-LT9uM5M4vgtKMnVd .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-LT9uM5M4vgtKMnVd rect.text{fill:none;stroke-width:0;}#mermaid-svg-LT9uM5M4vgtKMnVd .icon-shape,#mermaid-svg-LT9uM5M4vgtKMnVd .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-LT9uM5M4vgtKMnVd .icon-shape p,#mermaid-svg-LT9uM5M4vgtKMnVd .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-LT9uM5M4vgtKMnVd .icon-shape .label rect,#mermaid-svg-LT9uM5M4vgtKMnVd .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-LT9uM5M4vgtKMnVd .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-LT9uM5M4vgtKMnVd .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-LT9uM5M4vgtKMnVd :root{–mermaid-font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}
Organization 团队
yourteam
yourteam/frontend
yourteam/backend
yourteam/infra
yourteam/data-pipeline
个人账号
username
username/project-a
username/project-b
Organization 支持:
- 邀请多个成员
- 设置成员角色(Owner / Member)
- 按仓库分配读写权限
创建路径:Docker Hub → Settings → Organizations → Create Organization
免费版 Organization 私有仓库数量有限。团队规模较大时,可以考虑使用 GitHub Packages(已有 GitHub 订阅的情况下)或阿里云容器镜像服务(ACR,国内访问速度更快)作为补充。
国内访问加速
国内直连 Docker Hub 经常出现拉取超时的情况,配置镜像加速器可以改善。
Linux 系统(修改 /etc/docker/daemon.json):
{
"registry-mirrors": [
"https://docker.1ms.run",
"https://docker.xuanyuan.me"
]
}
修改完重启 Docker 服务:
sudo systemctl daemon-reload
sudo systemctl restart docker
Docker Desktop(Windows / macOS):
进入 Settings → Docker Engine,在 JSON 配置里添加 registry-mirrors 字段,点击 Apply & Restart 生效。
验证加速是否生效:
docker info | grep -A5 "Registry Mirrors"
常见报错与处理
denied: requested access to the resource is denied
最常见的推送错误。原因通常是:
- 未登录,或登录的账号与仓库 namespace 不匹配
- 镜像标签里的用户名写错了
排查步骤:
# 检查当前登录状态
cat ~/.docker/config.json | grep auths
# 检查本地镜像标签是否正确
docker images | grep my-app
# 重新登录后推送
docker login
docker push username/my-app:v1.0
toomanyrequests: You have reached your pull rate limit
触碰了免费版拉取频率限制(匿名 100次/6小时,登录用户 200次/6小时)。
解决方案:登录账号后再拉取,或配置国内加速镜像。
私有仓库拉取失败
拉取私有镜像前必须先登录,且账号需要有对应仓库的读取权限。
小结
Docker Hub 的核心操作链:
#mermaid-svg-DjbE45U1C8npi4D2{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-DjbE45U1C8npi4D2 .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-DjbE45U1C8npi4D2 .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-DjbE45U1C8npi4D2 .error-icon{fill:#552222;}#mermaid-svg-DjbE45U1C8npi4D2 .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-DjbE45U1C8npi4D2 .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-DjbE45U1C8npi4D2 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-DjbE45U1C8npi4D2 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-DjbE45U1C8npi4D2 .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-DjbE45U1C8npi4D2 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-DjbE45U1C8npi4D2 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-DjbE45U1C8npi4D2 .marker{fill:#333333;stroke:#333333;}#mermaid-svg-DjbE45U1C8npi4D2 .marker.cross{stroke:#333333;}#mermaid-svg-DjbE45U1C8npi4D2 svg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-DjbE45U1C8npi4D2 p{margin:0;}#mermaid-svg-DjbE45U1C8npi4D2 .label{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;color:#333;}#mermaid-svg-DjbE45U1C8npi4D2 .cluster-label text{fill:#333;}#mermaid-svg-DjbE45U1C8npi4D2 .cluster-label span{color:#333;}#mermaid-svg-DjbE45U1C8npi4D2 .cluster-label span p{background-color:transparent;}#mermaid-svg-DjbE45U1C8npi4D2 .label text,#mermaid-svg-DjbE45U1C8npi4D2 span{fill:#333;color:#333;}#mermaid-svg-DjbE45U1C8npi4D2 .node rect,#mermaid-svg-DjbE45U1C8npi4D2 .node circle,#mermaid-svg-DjbE45U1C8npi4D2 .node ellipse,#mermaid-svg-DjbE45U1C8npi4D2 .node polygon,#mermaid-svg-DjbE45U1C8npi4D2 .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-DjbE45U1C8npi4D2 .rough-node .label text,#mermaid-svg-DjbE45U1C8npi4D2 .node .label text,#mermaid-svg-DjbE45U1C8npi4D2 .image-shape .label,#mermaid-svg-DjbE45U1C8npi4D2 .icon-shape .label{text-anchor:middle;}#mermaid-svg-DjbE45U1C8npi4D2 .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-DjbE45U1C8npi4D2 .rough-node .label,#mermaid-svg-DjbE45U1C8npi4D2 .node .label,#mermaid-svg-DjbE45U1C8npi4D2 .image-shape .label,#mermaid-svg-DjbE45U1C8npi4D2 .icon-shape .label{text-align:center;}#mermaid-svg-DjbE45U1C8npi4D2 .node.clickable{cursor:pointer;}#mermaid-svg-DjbE45U1C8npi4D2 .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-DjbE45U1C8npi4D2 .arrowheadPath{fill:#333333;}#mermaid-svg-DjbE45U1C8npi4D2 .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-DjbE45U1C8npi4D2 .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-DjbE45U1C8npi4D2 .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-DjbE45U1C8npi4D2 .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-DjbE45U1C8npi4D2 .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-DjbE45U1C8npi4D2 .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-DjbE45U1C8npi4D2 .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-DjbE45U1C8npi4D2 .cluster text{fill:#333;}#mermaid-svg-DjbE45U1C8npi4D2 .cluster span{color:#333;}#mermaid-svg-DjbE45U1C8npi4D2 div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-DjbE45U1C8npi4D2 .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-DjbE45U1C8npi4D2 rect.text{fill:none;stroke-width:0;}#mermaid-svg-DjbE45U1C8npi4D2 .icon-shape,#mermaid-svg-DjbE45U1C8npi4D2 .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-DjbE45U1C8npi4D2 .icon-shape p,#mermaid-svg-DjbE45U1C8npi4D2 .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-DjbE45U1C8npi4D2 .icon-shape .label rect,#mermaid-svg-DjbE45U1C8npi4D2 .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-DjbE45U1C8npi4D2 .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-DjbE45U1C8npi4D2 .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-DjbE45U1C8npi4D2 :root{–mermaid-font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}
拉取官方镜像
推送自己的镜像
团队协作
注册账号 & 验证邮箱
本地 docker login
操作类型
docker pull 镜像名:标签
docker tag + docker push
在 Hub 创建仓库
创建 Organization
邀请成员 & 设权限
Docker Hub 只是镜像仓库的起点。随着项目规模扩大,私有 Registry(Harbor)、CI/CD 自动化推送、多架构镜像构建这些话题会接踵而来。把基础操作练熟,后面的进阶内容才有根基。
下一篇:Docker 多阶段构建:把镜像体积砍掉一半,讲清楚怎么让生产镜像尽可能轻量,感兴趣可以关注专栏持续更新。





