4 puan yazan GN⁺ 2025-06-19 | 1 yorum | WhatsApp'ta paylaş
  • Unregistry, harici bir registry olmadan Docker imajlarını doğrudan uzak sunucuya aktarabilen açık kaynaklı bir araçtır
  • docker pussh komutuyla SSH üzerinden uzak sunucuya imajı verimli biçimde aktarır; zaten mevcut olan katmanları atlar
  • Geleneksel Docker Hub, self-hosted registry ve save/load yöntemlerinin yarattığı karmaşıklık ve verimsizliği giderir
  • Üretim ortamı dağıtımı, CI/CD, kapalı ağ ortamları gibi senaryolarda hızlı ve güvenli imaj aktarımı büyük avantaj sağlar
  • Kurulum, kullanım ve gereksinimler son derece basittir; ek servis işletmeye veya port açmaya gerek yoktur

Unregistry tanıtımı ve başlıca avantajları

  • Unregistry, Docker daemon’unun depolama alanından doğrudan imajları saklayıp sunan hafif bir imaj registry’sidir
  • docker pussh komutu kullanıldığında SSH üzerinden harici bir registry olmadan imajlar doğrudan uzak Docker sunucusuna taşınabilir
  • Aktarım sırasında sunucuda zaten bulunan katmanlar hariç tutulur ve yalnızca gerekli parçalar hızlıca gönderilir

Mevcut Docker imaj dağıtımının sorunları

  • İmajı yerelde build ettikten sonra sunucuya aktarmak için seçenekler genelde şöyledir
    • Docker Hub/GitHub Container Registry: Kod dışarıya açılabilir veya özel depo kullanıldığında ek maliyet doğabilir
    • Self-hosted registry: Ayrı bir servis işletme, güvenlik ve depolama yönetimi yükünü artırır
    • Save/Load: Her zaman tüm imajı gönderdiği için verimsizdir
    • Sunucuda doğrudan yeniden build etmek: Zaman ve sunucu kaynaklarını boşa harcar, ayrıca debug sorunları yaratır

Unregistry çözümü

  • docker pussh myapp:latest user@server komutuyla ara depo olmadan doğrudan aktarım yapılabilir

  • Ek registry yapılandırması, port açma, depolama hazırlığı veya abonelik gerekmez

  • Aktarım süreci

    • Uzak sunucuya SSH tüneli kurulur
    • Geçici olarak unregistry container’ı çalıştırılır
    • Rastgele bir yerel port ile unregistry portu eşlenir
    • docker push ile yalnızca eksik katmanlar aktarılır (hemen kullanılabilir)
    • unregistry container’ı ve SSH tüneli kapatılır
  • rsync benzeri basit ve verimli bir yaklaşımdır

  • Bu proje, Uncloud içinde container’ları birden fazla Docker host’a dağıtma sürecindeki karmaşıklığı azaltmak için geliştirilmiştir

Kullanım örnekleri

Dağıtım ortamına doğrudan imaj gönderme

  • Yerelde build edip doğrudan üretim sunucusuna push etme
    • docker build --platform linux/amd64 -t myapp:1.2.3 .
    • docker pussh myapp:1.2.3 deploy@prod-server
    • ssh deploy@prod-server docker run -d myapp:1.2.3

CI/CD pipeline

  • Registry karmaşıklığı olmadan build ve dağıtımı destekler
    • GitHub Action YAML gibi yapılardan doğrudan aktarım kullanılabilir

Homelab ve internetsiz kapalı ağ ortamları

  • İmajı internete açmadan izole ağlara güvenli şekilde aktarır

Kullanım yöntemi

  • SSH kullanıcı hesabının uzak tarafta docker komutunu kullanabilmesi gerekir
  • SSH private key veya özel SSH portu gibi ek seçenekleri destekler
  • Multi-platform imaj aktarımını da destekler (containerd tabanlıysa)

Gereksinimler

Yerel ortam

  • Docker CLI (eklenti desteği, 19.03+)
  • OpenSSH istemcisi

Uzak sunucu

  • Docker kurulmuş ve çalışıyor olmalıdır
  • ssh kullanıcısı docker yetkisine sahip olmalı; gerekirse parolasız sudo docker çalıştırabilmelidir
  • containerd image store kullanıldığında performans artar
    • /etc/docker/daemon.json dosyasına aşağıdaki ayar eklenmeli ve Docker yeniden başlatılmalıdır
      {
        "features": {
          "containerd-snapshotter": true
        }
      }
      

İleri kullanım

Yerel bağımsız registry olarak kullanma

  • Ek bileşenler olmadan unregistry kolayca yerel registry olarak çalıştırılabilir
  • Docker komutlarıyla deploy ve push yapılabilir

Özel SSH seçeneklerinden yararlanma

  • SSH config dosyası kullanılarak ek kimlik doğrulama, port ve benzeri ayrıntılı ayarlar yapılabilir

Katkı ve topluluk

  • Hata bulunduğunda GitHub issue açılabilir
  • Uncloud Discord topluluğunda özellikler, yol haritası ve uygulama detayları tartışılabilir

İlham veren ve referans alınan açık kaynak projeler

  • Spegel: containerd tabanlı P2P container imaj registry uygulamasından ilham alınmıştır
  • Docker Distribution: gerçek registry uygulamasının temeli olarak kullanılmıştır

Özet

  • Unregistry, Docker imajlarını uzak sunuculara kolay ve hızlı biçimde doğrudan aktarabilen; registry kurma ve yönetme yükünü ortadan kaldıran bir araçtır
  • Üretim ortamı dağıtımı, CI/CD, kapalı ağlar gibi çeşitli senaryolarda güçlü avantajlar sunar
  • Sunucu ve yöneticinin yalnızca imajı basit biçimde, ek süreçler olmadan taşımak istediği durumlar için çok uygundur

1 yorum

 
GN⁺ 2025-06-19
Hacker News görüşleri
  • Sunucuların doğası, güvenlik sınırları ve hardening açısından Linux'ta Homebrew kullanılmasını önermek istemem; Linux kurulumu sonradan eklenmiş gibi sunulsa da bir paket yöneticisinden çok satranç tahtasındaki güvercin gibi davranıyor.

  • Bunun, sistemlerinde zaten Ansible gibi push tabanlı dağıtım araçları kullanan yerler için gayet iyi bir fikir olduğunu düşünüyorum; ayrıca Docker registry'nin 7/24 desteklenmediği şirketlerde hotfix dağıtım tekniği olarak da uygun görünüyor. OCI araçlarıyla (buildah vb.) temiz şekilde entegre olup olmadığını ya da iki tarafta da tam Docker kurulumu gerekip gerekmediğini merak ediyorum. Henüz derinlemesine bakmadım ama bununla ilgili biraz çalışma yapmayı planlıyorum; skopeonun böyle bir ortamda çalışması için uzak sunucuda kendi registry'sini bootstrap edebilme yeteneğinin eksik olduğunu düşünmüştüm.

    • Uzak sunucuda containerd gerekiyor (Docker ve Kubernetes de containerd kullanıyor), istemci tarafında ise registry API'sini anlayan herhangi bir şey olabilir (OCI Distribution spec: https://github.com/opencontainers/distribution-spec). Unregistry, API katmanı olarak resmi Docker registry kodunu yeniden kullandığı için Docker Hub'ın registry'sine benzer hissettiriyor. skopeo, crane, regclient, BuildKit ve diğer OCI registry kullanan araçlar çalışabilir; ancak bunları kullanmak için uzak hostta unregistryyi doğrudan çalıştırmak gerekir. docker pussh komutu ise yerel Docker'ı kullanarak bu akışın tamamını otomatikleştiriyor. Bir bash script'i olduğu için göz atmanızı öneririm: https://github.com/psviderski/unregistry/blob/main/docker-pussh, isterseniz kolayca kendi ihtiyaçlarınıza göre de değiştirebilirsiniz.

    • Her iki tarafta da docker daemon gerekiyor; bu yöntem iki daemon arasında layer'ları ssh üzerinden paylaşan akıllıca bir yaklaşım kullanıyor.

  • pussh komutunun akılda kalıcı, kendi kendini açıklayan ve mevcut standart komuttan yalnızca bir harf farklı olarak hoş bir kelime oyunu yaptığını düşünüyorum.

    • "pussh" güzel ama otomasyonda docker push-over-ssh gibi daha açık bir takma adın daha iyi olabileceğini düşünüyorum. pusshu ilk kez gören biri bunu yazım hatası sanabilir ve gereksiz kafa karışıklığı yaratabilir; hem kısa sürümün hem de tam isimli/flag'li sürümün desteklenmesi iyi olur.

    • Bir s harfi fazladan yazılmasının sssh demek için olduğu yönünde şakalı bir açıklama var; bazıları ise bunun sadece yazım hatası olduğunu söylüyor.

    • pussh adı başka komutlarla çakışabilir.

  • Böyle bir özellik çoktan var olmalıydı ve bence çok havalı. Docker registry'nin kendi değeri var ama genel olarak fazla karmaşık hale geldiğini ve hacker zihniyetinden uzaklaştığını düşünüyorum.

    • Docker sonuçta VC yatırımı almış bir şirketti; bir şekilde para kazanması gerekiyordu.
  • Proje ve yaklaşım etkileyici görünüyor. Pahalı registry'lerden bıkıp Zot(https://zotregistry.dev) gibi bir şeyi self-host etmeyi denedim ama bu yöntem bazı kullanım senaryolarında çok daha basit görünüyor. Keşke kolay, ucuz ve kullandıkça öde modelinde private registry hizmetleri daha yaygın olsa.

    • zothub.io SSL sertifikasının süresinin dolduğunu belirten bir yorum var.
  • Docker'ın en baştan beri böyle çalışması gerektiğini düşünüyorum; çok iyi bir fikir.

    • Benzer bir sonucu, image dosyalarını arşiv olarak kaydedip sunucuya aktardıktan sonra yükleyerek de elde edebilirsiniz. Örneğin docker save -o my-app.tar my-app:latest ile kaydedip docker load -i /path/to/my-app.tar ile yükleyebilirsiniz. Bunu Ansible gibi otomasyon araçlarıyla birleştirerek Unregistry'nin otomatikleştirdiği şeyi kendiniz de yapabilirsiniz. Ancak GitHub reposunda da belirtildiği gibi save/load yaklaşımında tüm image'ı baştan aktarmak gerekir ve image yönetimi de arşiv dosyalarına kıyasla daha rahattır.
  • Bu tür araçlar ve SSH tabanlı araç setleriyle self-hosting'e dönüşü görmek sevindirici; iyi yapılmış bir iş gibi duruyor. Kendim de denemeyi planlıyorum.

  • Bu araç sayesinde ilk kez uncloud projesini duydum ve istediğim şeye benzeyen, dokku gibi ama daha güçlü bir sunucu dağıtım çözümü gibi göründüğü için ilgimi çekti.

    • uncloudun kendisine çok uyduğunu söyleyen geri bildirime katılıyor; sorular olursa Discord üzerinden iletişime geçilmesini memnuniyetle karşılıyor.

    • https://skateco.github.io/ benzer yaklaşıma sahip bir servis olarak tavsiye ediliyor.

    • Portainer öneriliyor; Portainer Community Edition ve Portainer Agent kullanarak AWS EC2 üzerinde iki makinede sorunsuz çalıştırdıklarını söylüyorlar. Özellikle stack özelliği (docker compose tabanlı) güçlü bulunuyor; EC2 örneklerinden birinde portainer agent, container olarak Caddy çalıştırıyor ve load balancer ile reverse proxy işlevi görüyor.

  • Fikir taze ve yaratıcı, ancak bu yaklaşım servis dağıtımıyla sıkı şekilde bağlantılı; dağıtım ve ölçekleme sırasında, örneğin blue/green deployment yapılırken, "push"u anlayan ek mantık gerekir. Düşününce bunun uncloud içinde uygulanmış yapı olduğunu fark ettim. Ama sonuçta bu da bir trade-off ve tek bir Hetzner VM üzerinde sadeliği önemsiyorsanız, image'ları yerelde build etmek yeterince tatmin edici bir seçenek olabilir.

    • Sonuçta her şey trade-off; duruma göre en iyi aracı seçebiliyor olmak en güzel tarafı.