常规

自建 Docker-代理镜像仓库(私有镜像托管)

JACIN··7 分钟阅读

私有镜像托管 在这种模式下,你想在里面存什么,必须全靠你自己(或者 CI/CD 流水线)手动搬运进去。

这就相当于你要做一个 “搬运工” 的工作。 假设你想把公网的 nginx 放到你自己的 hub.jacin.me 里,给内网的其他机器用,你需要做这三步:

1. 进货 (Pull)#

先从 Docker Hub 把货拉到你的本地电脑(或跳板机)上:

text
docker pull nginx:latest

2. 贴牌 (Tag)#

给这个镜像贴上你自家仓库的标签(改名):

  • 原名:nginx:latest
  • 新名:hub.jacin.me/library/nginx:latest
text
docker tag nginx:latest hub.jacin.me/library/nginx:latest
text
docker push hub.jacin.me/library/nginx:latest

出现了:

text
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, mysqlmy-backend-app, my-web-site
工作方式它是“二传手”,有人要它就去取它是“仓库”,你存进去,别人才能取
Push 权限禁止 Push (它是只读缓存)必须 Push (否则里面是空的)

评论

还没有评论,来发第一个吧