这个项目能做什么

Unregistry 是一个轻量级容器镜像仓库,直接从 Docker 守护进程的存储(containerd 镜像存储)中存储和提供镜像。它旨在消除在机器之间移动镜像时对外部仓库的需求。 该项目附带一个 Docker CLI 插件命令 `docker pussh`(额外的 's' 代表 SSH),它通过 SSH 将镜像直接推送到远程 Docker 服务器。仅传输远程端缺失的层,README 称这使操作快速高效。 根据 README,其工作原理如下:该命令建立到远程服务器的 SSH 隧道,在那里启动一个临时的 unregistry 容器,通过隧道将随机本地主机端口转发到 unregistry 端口,通过该转发端口运行 `docker push` 到 unregistry(仅传输远程尚不存在的层),然后停止 unregistry 容器并关闭隧道。传输的镜像在远程 Docker 守护进程上变为可用。README 将这种方法比作 Docker 镜像的 rsync。 动机:README 列出了常见替代方案及其缺点——公共仓库(代码暴露或付费私有仓库)、自托管仓库(需要维护和保护的额外服务)、`docker save | ssh ... docker load`(即使大多数层已存在于远程也会传输整个镜像),以及远程重建(浪费时间和资源)。Unregistry 最初是为 Uncloud 创建的,这是一个用于在多个 Docker 主机上部署容器的工具。 要求:本地需要支持插件的 Docker CLI(Docker 19.03+)和 OpenSSH 客户端。远程服务器上,必须安装并运行 Docker,SSH 用户必须能够运行 docker 命令(root 或 docker 组中的用户),如果需要 sudo,则必须支持无密码 `sudo docker`。服务器需要互联网访问 ghcr.io 以在首次使用时拉取 unregistry 镜像,除非为离线或受限环境手动预加载镜像。unregistry 容器需要访问 /run/containerd/containerd.sock 处的 containerd 套接字,并以 root 身份运行。 文档中记录的安装选项:Homebrew(`brew install psviderski/tap/docker-pussh`,外加符号链接到 ~/.docker/cli-plugins)、直接下载 docker-pussh 脚本到插件目录,以及维护在单独仓库中的非官方 Debian 包。目前不支持 Windows,但建议使用 WSL 2 并遵循 Linux 说明。可通过 `docker pussh --help` 验证安装。 一个值得注意的配置主题是 containerd 镜像存储。Unregistry 将镜像存储在 containerd 的镜像存储中,但默认情况下 Docker 保留自己的独立存储层。在 Docker 中启用 containerd 镜像存储后,推送的镜像立即可用于 Docker,无需重复且 pussh 操作更快。未启用时,pussh 在远程主机上运行额外的 `docker pull`,镜像存储两次,且可能积累未管理的 containerd 镜像;README 展示了 `ctr -n moby images ls` 和 `ctr -n moby images rm` 用于手动清理。文档说明启用 containerd 镜像存储会导致使用经典存储驱动创建的镜像和容器暂时丢失。 使用示例包括推送到远程主机、使用 `-i` 进行 SSH 密钥认证、自定义 SSH 端口、使用 `-F` 自定义 SSH 配置文件、为多平台镜像选择平台(本地需要 containerd 镜像存储),以及通过 UNREGISTRY_IMAGE 环境变量覆盖 unregistry 镜像版本。文档记录的用例包括部署到生产服务器、CI/CD 流水线,以及家庭实验室或离线环境。Unregistry 也可以作为独立本地仓库在端口 5000 上运行,通过挂载 containerd 套接字实现。 README 链接了第三方项目:一个用于使用 docker-pussh 推送镜像的 GitHub Action、一个用于安装插件的 GitHub Action,以及一个用于清理自托管仓库中镜像的 Python 工具。它感谢 Spegel 启发了使用 containerd 镜像存储作为仓库后端,并感谢 Docker Distribution 作为 unregistry 所基于的仓库实现。