横向对比裸distributionHarborDockeryWeb 管理界面无有有账户 / 角色htpasswd(平权)LDAP / OIDC / SSO 全家桶三档角色 glob 仓库模式需要起的容器数1101外部依赖无Postgres Redis 多组件无备份一个目录多库多卷一个/data目录多架构镜像自己打官方提供amd64 arm64 官方从零到可用装完还得自研 UI半天起几分钟对用户来说,实际体验是这样有个网页。浏览器打开就看到所有仓库、每个仓库的 tag、每个 tag 的大小和层信息。不用再curl /v2/_catalog然后自己串 JSON。账号是账号,不是一张 htpasswd。admin 在 Manage Users 页面里点一下就能新建账号、分配角色,给write/view用户发放像team-a/*,shared/app这样的 glob 仓库模式 —— 精细到项目组,不再要么全给、要么不给。UI 与 CLI 共用同一套授权。某个用户在网页里看不到的仓库,他用docker pull也拉不到。没有UI 过滤了但 CLI 能直连的错位。改密不用登机器。UI 里改、或者一条docker exec ... dockery-api user passwd alice就行,不必 SSH 上去改 htpasswd 再 reload。搬家就 tar 一下。所有状态 —— 镜像 blob、用户表、审计日志、JWT 私钥 —— 都在/data下。整包 tar 出来,换台机器解压启动,全部带过去。ARM 机器能跑。官方镜像同时出linux/amd64和linux/arm64,Apple Silicon 服务器、Raspberry Pi、各家云的 Graviton 实例都直接拉。装起来是真的一条命令docker run -d --name dockery --restart unless-stopped \ -p 5000:5000 \ -v /srv/dockery:/data \ -e DOCKERY_ADMIN_PASSWORDchange-me \ -e REGISTRY_AUTH_TOKEN_REALMhttp://registry.example.com:5000/token \ ghcr.io/bizjs/dockery:latest浏览器开http://registry.example.com:5000,用admin / change-me登录,新建账号,然后在客户端:docker login registry.example.com:5000 docker tag myapp registry.example.com:5000/team-a/myapp:0.1.0 docker push registry.example.com:5000/team-a/myapp:0.1.0纯 HTTP 场景要把registry.example.com:5000加进客户端daemon.json的insecure-registries;前面挂 Caddy / Traefik 做 TLS 终结就不用这步。技术选型里几个关键决定registry 协议用官方distribution/distributionv3.1.0,不是自己写一份兼容实现;协议可靠性上限和社区一致。账户模块是 Go SQLite(纯 Go 驱动,零 CGO),单一静态二进制,没 daemon 要起,备份只是一个.db文件。Docker CLI 认证走 Ed25519 JWKS 的短命 JWT(5 分钟),registry 在线验签。相比共享 htpasswd的做法,新增或吊销用户不需要重启 registry,签发记录还能落审计。完整设计见 docs/dockery-design.md。不做什么v0.1 明确不做的东西:镜像扫描、cosign 验签、跨机复制、HA、多租户。每一项都会把单容器 本地盘这个边界打破 —— 需要这些请上 Harbor,Dockery 不跟它抢场景。适合的使用场景3~30 人内部/项目组 registryCI/CD 产物仓,镜像不出内网