laminux29

docker 仓库这套体系设计的真差,这么多年了都还没有镜像统一缓存的方案。

  •  
  •   laminux29 · 15 days ago · 1490 views
    想在内网部署一个 docker 镜像的缓存层:

    如果用 docker 官方的 registry:2 + proxy cache ,则只能缓存 docker 官方的仓库 registry-1.docker.io ,无法缓存别的仓库比如 registry.gitlab.comghcr.ioquay.ioregistry.k8s.io 等等。

    如果用 Harbor Proxy Cache 或 Nexus/JFrog ,在 docker pull 时需要更改镜像的 URL ,比如需要把:

    docker pull ghcr.io/home-assistant/home-assistant
    改为
    docker pull DockerCacheServer.com/home-assistant/home-assistant

    不改 URL 且能缓存所有 docker 仓库的方案,目前不存在。这么多年的发展,这么点小事都解决不了。
    zizon
        1
    zizon  
       15 days ago
    记得是可以的.客户端需要配置 registry 的 mirror.
    类似
    docker pull ubuntu
    其实是
    docker pull docker.io/library/ubuntu
    kur0d3s
        2
    kur0d3s  
       15 days ago
    {
    "registry-mirrors": ["https://<my-docker-mirror-host>"]
    }

    这个功能有点年头了...
    morphyhu
        3
    morphyhu  
       15 days ago
    你行你上
    laminux29
        4
    laminux29  
    OP
       14 days ago
    @zizon 这种方案,客户端在 docker pull 时,需要更改 image 的 URL ,URL 变得很不标准。
    laminux29
        5
    laminux29  
    OP
       14 days ago
    @kur0d3s 问过 AI ,没用。
    anubu
        6
    anubu  
       12 days ago
    还是有一些变通方案的,要从服务端和客户端两方面分析。
    - 服务端就是缓存服务本身,比如 registry:2 ,是可以正常代理缓存非 docker.io 的上游仓库,配置环境变量即可。麻烦的是如果要缓存多个上游就要启动多个 registry ,还需要考虑前面放个反向代理和域名路由问题。也可以考虑 zot 、Harbor 类的方案。
    - 客户端就比较多了,docker 的 mirror 配置仅对 docker.io 这个默认仓库生效。一个方法就是把其它仓库配置为 insecure-registries ,然后本地 hosts 劫持到上面部署的 registry 缓存代理上。如果是 nerdctl+containerd 就方便多了,自身的 mirror 配置比较丰富。可能还会涉及到 k3s 或 k8s 场景,mirror 配置上可能会多一层考虑,或直接使用底层的 containerd 。其它客户端 podman 、skopeo 、crane 等需要根据情况自行研究了。

    看上去能解决问题,实际上的确是复杂了一些。这个场景目前的确没有一个共识的最佳实践,只能根据自己具体场景来摸索调整。
    qbmiller
        7
    qbmiller  
       2 days ago
    如果针对 registry:2 , zot . 在封装套个壳,可以配置上游代理(毫秒等)甚至配置 clash 地址。
    怎么玩,有类似开源的吗。
    laminux29
        8
    laminux29  
    OP
       2 days ago
    @qbmiller 我最后还是选了 Harbor ,然后让 AI 用 Python 3 写了个 py-docker-pull 入口,来模拟 docker pull 并且保证用法一致。
    kur0d3s
        9
    kur0d3s  
       5h 15m ago
    之前没注意需求保证 image_url 不变。

    我印象里可以配置自签名证书(/etc/docker/certs.d )或配置 insecure-registries ,并配置 hosts ,劫持请求到自己的 registry_proxy 。(早期在公司给内部 registry 配置 TLS 的时候折腾过,不太确定现在是否还支持)

    ps1: 只有大陆个人用户才有需求,个人感觉除非有人 pr ,docker 自己去开发这个功能收益不大。
    ps2: 自部署 harbor 感觉略微复杂了点。个人是维护了一份 docker_compose , 部署 traefik ( sni 分流/registry2 ( proxy )/s3
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   3140 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 36ms · UTC 12:59 · PVG 20:59 · LAX 05:59 · JFK 08:59
    ♥ Do have faith in what you're doing.