← Bütün məqalələr

Docker sadə dillə: konteynerlər nədir və niyə vacibdir

Burncode Team 3 dəq oxuma

«Mənim kompüterimdə işləyir» ifadəsi vaxtilə çox yayıldığı üçün lətifəyə çevrilmişdi — bir proqramçıda qüsursuz işləyən, başqa serverə, əməliyyat sisteminin başqa versiyasına və ya həmkarın noutbukuna düşən kimi sınan tətbiq. Docker bu bəhanəni keçmişdə qoymaq üçün mövcuddur: o, tətbiqi işləməsi üçün lazım olan hər şeylə birlikdə paketləyir.

Konteyner əslində nədir

Docker konteyneri tətbiqinizin kodunu onun icra mühiti, kitabxanaları, konfiqurasiyası və sistem asılılıqları ilə birlikdə imic (image) adlanan vahid bölmədə birləşdirir. Bu imic noutbukunuzda, komanda yoldaşınızın kompüterində, test serverində və ya canlı mühitdə eyni şəkildə işləyir — çünki o, hostda təsadüfən artıq quraşdırılmış nəyəsə arxalanmır. Öz mühitini özü ilə gətirir.

İnsanlar çox vaxt konteyneri yüngül virtual maşın hesab edirlər, lakin bu müqayisə fərqi lazımınca əks etdirmir. Virtual maşın bütöv kompüteri, o cümlədən onun öz nüvəsini (kernel) virtuallaşdırır — buna görə də VM-in işə düşməsi bir dəqiqə çəkə bilər və tətbiqiniz hələ başlamamış asanlıqla gigabaytlarla yaddaş istifadə edə bilər. Konteyner isə host maşının nüvəsini bölüşür və yalnız tətbiq qatını təcrid edir, ona görə də bir-iki saniyəyə işə düşür və yaddaşın kiçik bir hissəsini istifadə edir. Bir neçə tam VM-in belə çətinliklə işlədiyi avadanlıqda onlarla konteyneri rahatlıqla işlətmək olar.

Bu, gündəlik işdə niyə vacibdir

  • Mühitlər arasında ardıcıllıq — CI-da testlərdən keçən konteyner canlı mühitdə işləyən artefaktın eynisidir, fərqli ola biləcək yenidən yığılmış versiya deyil.
  • Sürətli, ucuz təcrid — verilənlər bazasını, keşi və tətbiqinizi bir maşında ayrı konteynerlər kimi işlədə bilərsiniz və onlar asılılıqların versiyaları üstündə «mübahisə» etməz.
  • Yeni mühəndislərin eyni qaydada işə qoşulması — yeni mühəndis yarısı köhnəlmiş quraşdırma addımları olan wiki səhifəsi əvəzinə bir əmr icra edir və bütün stek lokal olaraq işə düşür.
  • Sadə üfüqi miqyaslanma — tətbiqinizin yük balanslaşdırıcısı arxasında işləyən üç nüsxəsi lazımdır? Bu, üç dəfə işə salınmış eyni imicdir, sinxron saxlanılmalı olan üç fərqli quraşdırma deyil.

Əsl «müqavilə» Dockerfile-dır

Hər imic Dockerfile əsasında yığılır — mühiti yaratmaq üçün dəqiq addımları sadalayan adi mətn faylı: hansı baza imicindən başlamaq, nəyi quraşdırmaq, nəyi içəri köçürmək, tətbiqi hansı əmrin işə salması. Bu fayl kodla birlikdə versiya nəzarəti sisteminə əlavə olunur, yəni mühitin özü versiyalanır və nəzərdən keçirilə bilir — kiminsə başında yaşayan şifahi bilik və ya köhnəlmiş README deyil.

İnsanlar harada çaşır

Ən çox rast gəlinən ilkin səhv konteynerə SSH ilə daxil olub əl ilə redaktə etdiyiniz yüngül VM kimi yanaşmaqdır — bu addımları Dockerfile-a yazmaq əvəzinə, konteyner işə düşdükdən sonra nəyisə əl ilə quraşdırmaq. Bu, bütün mənanı puça çıxarır: konteyner yenidən başladığı an həmin əl ilə edilmiş dəyişikliklər yox olur və siz yenidən «beş dəqiqə əvvəl işləyirdi» vəziyyətinə qayıdırsınız. Konteynerə lazım olan hər şey imicin özünə daxil edilməlidir.

Digər geniş yayılmış tələ lazım olduğundan qat-qat böyük imiclərdir, çünki yığım zamanı əlavə edilmiş hər lazımsız paket son imicdə qalır. Çoxmərhələli yığım (multi-stage build) — bir mərhələdə kompilyasiya və ya yığım edib yalnız hazır artefaktı yığcam son imicə köçürmək — adətən imicin ölçüsünü kəskin azaldır; bu isə həm yerləşdirmə sürəti, həm də hücum səthi baxımından vacibdir.

Docker təkbaşına hər şeyi həll etmir — bir konteyneri işlətmək sadədir, lakin onlarla konteyneri şəbəkə, miqyaslanma və nasazlığa davamlılıq (failover) ilə etibarlı şəkildə işlətmək ayrı məsələdir və adətən üstdə Kubernetes kimi orkestratorla həll olunur. Lakin konteynerin əslində nə olduğunu və onun VM-dən nə ilə prinsipial fərqləndiyini anlamaq müasir infrastrukturda qalan hər şeyin üzərində qurulduğu təməldir.

Tətbiqin düzgün konteynerləşdirilməsi — yığcam imic, ağlabatan yığım prosesi və onu buraxan CI/CD konveyeri — Burncode-da infrastruktur və DevOps işlərini öz üzərimizə götürəndə ilk qurduğumuz şeylərdəndir, çünki etibarlı yerləşdirmədə qalan hər şey məhz bu hissədən asılıdır.