4 puan yazan GN⁺ 2024-03-17 | 1 yorum | WhatsApp'ta paylaş

Nix, Docker'ın image builder'ından daha iyidir

  • Nix'in üç yönü vardır: paket yöneticisi, dil ve işletim sistemi.
  • Nix kullanarak Docker image'ları oluşturmanın, Docker'ın kendi image builder'ını kullanmaya göre daha iyi yanları vardır.
  • Nix, build sürecinde gereken tüm bağımlılıkların önceden bilinmesini sağlar ve internet bağlantısı olmadan da build almayı mümkün kılar.

Nix'in avantajları

  • Nix kullanıldığında Docker image'ları daha verimli şekilde oluşturulabilir.
  • Nix, bağımlılıkları mümkün olan en az sayıda Docker katmanına ayırır ve güncelleme sırasında yalnızca en küçük değişikliklerin yansıtılmasını sağlar.
  • Birden fazla servis aynı depoda bulunduğunda, Docker katmanları servisler arasında paylaşılabildiği için verimlilik artar.

Douglas Adams alıntı servisi örneği

  • Bir Go programını Nix ile paketleyip Docker image'ına dönüştürme süreci anlatılıyor.
  • Katmanlı image oluşturmak için dockerTools.buildLayeredImage fonksiyonu kullanılabilir.
  • Sonuçta sıradan bir container image elde edilir ve bu image her yere deploy edilebilir.

GN⁺ görüşü

  • Nix kullanmak, yazılım geliştirme sürecinde bağımlılık yönetimini ve build'lerin yeniden üretilebilirliğini büyük ölçüde iyileştirebilir.
  • Docker ile karşılaştırıldığında Nix, build'lerin deterministik yapısı sayesinde uzun vadede zaman ve kaynak tasarrufu sağlayabilir.
  • Ancak Nix'in yeni kavramları ve kullanım biçimi yeni başlayanlar için biraz zor olabilir; ayrıca mevcut CI/CD pipeline'larına entegre etmekte güçlük yaşanabilir.
  • Bu teknolojiyi benimserken ekip içinde eğitim ve uyum süresi gerekir; mevcut altyapıyla uyumluluk da göz önünde bulundurulmalıdır.
  • Nix'e benzer işlevler sunan başka bir araç da Guix'tir; o da deterministik paket yönetimi ve build sağlar.

1 yorum

 
GN⁺ 2024-03-17
Hacker News görüşleri
  • Nix’i sevmeye çalışmak için birçok kez uğraştım ama artık vazgeçme zamanının geldiğini düşünüyorum.

    • Nix kullanan iki sistemim var ama onlara dokunmaya korkuyorum.
    • Teoride Nix, idempotent ve deterministic, ancak bağımlılıkların tüm ayrıntılarını tam olarak anlamazsanız tuhaf sonuçlar ve işe yaramayan hatalarla karşılaşabiliyorsunuz.
    • Dokümantasyon çok kötü ve eğitimler de ancak kısmen yardımcı oluyor.
    • Docker’ın gücü kaosun kendisinde; shell ve paket yöneticisi hakkında temel bir anlayışla bile neredeyse her şeyi kolayca inşa edebilirsiniz.
  • Nix ve NixOS, GitHub öncesi git’e benzer bir durumda.

    • Temel fikir, bugünün SVN’i ve Docker’ından daha ciddi bir bilgisayar bilimine dayanıyor.
    • flox’un çıkışıyla durum değişmiş olabilir ve flox kullanımı kolay.
    • flakes ve nix-command olmadan Nix’in pek anlamı yok, ancak bunlar deneysel ve varsayılan olarak kapalı.
    • Nix/NixOS ya da benzeri bir şey Docker’ı da aynı noktaya getirecek, ama bu ancak “GitHub anı” geldikten sonra olacak.
  • Darwin’de Docker imajı oluşturmak için 2-3 gün harcadım ve bu makale sanki benimle alay ediyor.

    • Nix, istediğinizi başarmak için en iyi araç, ama bazen insanın ruhunu kurutan karanlık köşeleri var.
  • Paylaşılan Docker katmanlarının neden faydalı olduğuna dair açıklama blog yazısında eksik.

    • Cache nedeniyle faydalılar. Ne kadar çok imaj aynı katmanı paylaşırsa cache o kadar iyi çalışır.
    • Nix zaten bağımlılıkları hash üzerinden sakladığı için katmanlar her zaman aynı sürüm ve yapılandırmayla aynı olur.
  • Java uygulamaları için Docker imajlarını Nix ile oluşturma deneyimi pek keyifli değildi.

    • gradle2nix kullanımdan kaldırıldıktan sonra, Gradle tabanlı Java uygulamaları için Docker imajı oluşturmanın net bir alternatif yolu kalmadı.
  • Nix’i zaten benimsediyseniz faydalı ve Nix ya da Guix gibi daha deklaratif paket yönetimi çözümlerinin yaygınlaşmasını umuyorum.

    • Docker kullanırken Nix’i kademeli olarak benimsemek istiyorsanız, Dockerfile’ı koruyup Nix yapılandırmasını derleyen alternatif bir yaklaşım var.
  • Bir platform mühendisi olarak Nix’i sevmek istiyorum ama herkes için kolay değil.

    • Örneğin, devbox add python@3.11 gibi bir komutla paket eklemeyi tercih ediyorum.
  • Nix, çoğu kütüphane için ciddi paketleme çabası gerektirecek kadar upstream ile uyumlu değil.

    • Karmaşık C veya C++ kütüphanelerinde, Nix için her şeyi sarmak işin önemli bir kısmına dönüşüyor.
  • Kısa süre önce CI taban imajını Nix ile oluşturmayı denedim ama imaj çok büyüktü ve linking sorunları yüzünden bazı işler düzgün çalışmadı.

    • Çoklu mimari imajlar oluşturmak için gerçekten başka mimaride çalıştırmaya kalkıyor; bu da yalnızca qemu kullanan donanım sanallaştırmasını destekliyor.
  • Dagger kullanıyorum; Docker’ın kurucularının ikinci denemesi olarak sorunların çoğunu çözüyor.

    • Pipeline’ları zaten kullandığınız dilde yazabiliyor ve katman grafiği ile gelişmiş cache gibi BuildKit’in ileri özelliklerinden yararlanabiliyorsunuz.