自建 Docker-代理镜像仓库(私有镜像托管)
这篇笔记聚焦 Docker 私有镜像仓库的 hosted/private 托管模式,说明它不是自动代理上游的缓存,而是需要用户或 CI/CD 主动把镜像搬运进去后才能供其他机器拉取。文章用 nginx:latest 迁移到 hub.jacin.me/library/nginx:latest 为例,给出 pull、tag、push 三步流程:先从 Docker Hub 拉取镜像,再改成本地私有仓库命名空间,最后推送到自建仓库。推送时出现 only the available single-platform image was pushed 的提示,是因为官方 nginx:latest 属于多架构镜像,但普通 docker pull 通常只下载当前机器 CPU 架构对应的版本,push 时私有仓库也只能保存本地已有的平台内容。对服务器、开发机和生产环境都统一使用 amd64 等同构场景来说,这通常不影响运行;但如果 amd64 VPS 推送后的镜像被 arm64 的 Mac M1/M2 或树莓派拉取,就可能遇到架构不匹配、exec format error 或找不到匹配架构的问题。文末通过表格区分代理模式和私有仓库模式:前者偏向 Docker Hub 等上游的加速与只读缓存,后者用于存储和分发自己构建的业务镜像,并且必须依赖 push 写入内容。它适合正在搭建内网镜像分发、理解多架构镜像行为,或在代理缓存与私有托管之间做选型的运维和后端开发者阅读。
私有镜像托管 在这种模式下,你想在里面存什么,必须全靠你自己(或者 CI/CD 流水线)手动搬运进去。
这就相当于你要做一个 “搬运工” 的工作。
假设你想把公网的 nginx 放到你自己的 hub.jacin.me 里,给内网的其他机器用,你需要做这三步:
1. 进货 (Pull)#
先从 Docker Hub 把货拉到你的本地电脑(或跳板机)上:
docker pull nginx:latest
2. 贴牌 (Tag)#
给这个镜像贴上你自家仓库的标签(改名):
- 原名:
nginx:latest - 新名:
hub.jacin.me/library/nginx:latest
docker tag nginx:latest hub.jacin.me/library/nginx:latest
docker push hub.jacin.me/library/nginx:latest
出现了:
i Info → Not all multiplatform-content is present and only the available single-platform image was pushed
sha256:fb01117203ff38c2f9af91db1a7409459182a37c87cced5cb442d1d8fcc66d19 -> sha256:547c8c6863a88abd0c987779413489ff0e9a693c24d2d88ce9eb8515e0ae0335
原因:
- Docker Hub 上的 Nginx: 官方的
nginx:latest是一个 “多架构镜像” (Multi-platform Image)。它像一个大礼包,里面同时包含了:linux/amd64(给普通 Intel/AMD 服务器用)linux/arm64(给 Mac M1/M2 或 树莓派用)linux/arm/v7等等...
- 你
docker pull的时候: 当你只是单纯执行docker pull nginx时,你的 Docker 并没有把整个大礼包都下载下来。为了省流量和空间,它只下载了适合你当前这台 VPS CPU 架构的那一个版本(通常是linux/amd64)。 - 你
docker push的时候: 当你把这个本地镜像推送到你自己的私有仓库时,Docker 发现:“哎?这个镜像原本的元数据里说它支持好多种 CPU 呀,但是你本地硬盘里只有amd64这一种数据。既然其他的我找不到,那我就只推送这一个版本上去了哦。”
2. 这有什么影响?#
- 对绝大多数情况:完全没影响。 只要你的服务器、你的电脑、你的生产环境用的都是同一种 CPU(比如都是 x86_64/amd64),那么这个镜像你是完全可以正常拉取、正常运行的。
- 唯一的问题:跨平台不兼容 如果你这个 VPS 是 Intel 的(amd64),你推上去的这个
nginx就变成了 “amd64 专用版”。 如果你此时用一台 MacBook M1 (arm64) 去拉取你这个私有仓库的 nginx,可能会报错说exec user process caused: exec format error或者找不到匹配的架构。
| 特性 | 代理模式 (Proxy/Mirror) | 私有仓库模式 (Hosted/Private) |
|---|---|---|
| 核心作用 | 加速 & 缓存 | 存储 & 分发 |
| 内容来源 | 只能来自 Docker Hub (或其他上游) | 来自你自己 Build 的代码 |
| 典型镜像 | nginx, redis, node, mysql | my-backend-app, my-web-site |
| 工作方式 | 它是“二传手”,有人要它就去取 | 它是“仓库”,你存进去,别人才能取 |
| Push 权限 | 禁止 Push (它是只读缓存) | 必须 Push (否则里面是空的) |
评论
还没有评论,来发第一个吧