Unregistry – “docker push” ile registry olmadan doğrudan sunucuya aktarım
(github.com/psviderski)- Unregistry, harici bir registry olmadan Docker imajlarını doğrudan uzak sunucuya aktarabilen açık kaynaklı bir araçtır
docker pusshkomutuyla 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 pusshkomutu 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@serverkomutuyla 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 pushile yalnızca eksik katmanlar aktarılır (hemen kullanılabilir)- unregistry container’ı ve SSH tüneli kapatılır
-
rsyncbenzeri 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-serverssh 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
dockerkomutunu 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
sshkullanıcısıdockeryetkisine sahip olmalı; gerekirse parolasızsudo dockerçalıştırabilmelidir- containerd image store kullanıldığında performans artar
/etc/docker/daemon.jsondosyası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
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 (
buildahvb.) 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
containerdgerekiyor (Docker ve Kubernetes decontainerdkullanı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,BuildKitve diğer OCI registry kullanan araçlar çalışabilir; ancak bunları kullanmak için uzak hosttaunregistryyi doğrudan çalıştırmak gerekir.docker pusshkomutu 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 daemongerekiyor; bu yöntem iki daemon arasında layer'larısshüzerinden paylaşan akıllıca bir yaklaşım kullanıyor.pusshkomutunun 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-sshgibi 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
sharfi fazladan yazılmasınınssshdemek 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.pusshadı 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.
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.ioSSL 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.
docker save -o my-app.tar my-app:latestile kaydedipdocker load -i /path/to/my-app.tarile 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 gibisave/loadyaklaşı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
uncloudprojesini duydum ve istediğim şeye benzeyen,dokkugibi 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 composetabanlı) güçlü bulunuyor; EC2 örneklerinden birindeportainer 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
uncloudiç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.