Doker oyuncaqdır ya yox? Yoxsa hələ də?

Hello!

Mövzuya birbaşa keçmək istəyirəm, amma hekayəm haqqında bir az danışmaq daha düzgün olardı:

Giriş

Mən serverdə frontend tək səhifə proqramları, scala/java və nodejs işləyib hazırlamaq təcrübəsi olan proqramçıyam.

Kifayət qədər uzun müddət (mütləq bir neçə və ya üç il) mən Docker-in cənnətdən gələn manna olduğunu və ümumiyyətlə çox gözəl bir alət olduğunu və tamamilə hər bir tərtibatçının ondan istifadə edə bildiyini düşünürdüm. Və buradan belə çıxır ki, hər bir tərtibatçı öz yerli maşınında Docker quraşdırmalıdır. Bəs mənim fikrimcə, eyni hh-də yerləşdirilən vakansiyalara baxın. Hər saniyədə docker haqqında bir qeyd var və ona sahibsinizsə, bu sizin rəqabət üstünlüyünüz olacaq 😉

Yolda Docker və onun ekosisteminə fərqli münasibəti olan bir çox insanla tanış oldum. Bəziləri bunun çarpaz platforma funksionallığına zəmanət verən rahat bir şey olduğunu söylədi. İkincilər nə üçün konteynerlərdə qaçmalı olduqlarını və ondan hansı qazanc əldə edəcəyini başa düşmədilər, üçüncülər heç vecinə də olmadı və narahat olmadılar (sadəcə kodu yazıb evə getdilər - onlara həsəd aparırdım, yol :)

İstifadə səbəbləri

Niyə docker istifadə etdim? Yəqin ki, aşağıdakı səbəblərə görə:

  • verilənlər bazası işə salındıqda, tətbiqlərin 99% -i onlardan istifadə edir
  • frontend paylanması üçün nginx-i işə salmaq və arxa hissəyə proxy etmək
  • tətbiqi docker şəklində paketləyə bilərsiniz, bu şəkildə tətbiqim dokerin mövcud olduğu yerdə işləyəcək, paylama problemi dərhal həll olunur
  • qutudan kənar xidmət kəşfi, mikroservislər yarada bilərsiniz, hər bir konteyner (ümumi şəbəkəyə qoşulmuşdur) ləqəb vasitəsilə asanlıqla digərinə çata bilər, çox rahatdır
  • Bir konteyner yaratmaq və orada "oynamaq" əyləncəlidir.

Docker haqqında həmişə bəyənmədiyim şey:

  • Proqramımın işləməsi üçün mənə serverdə Docker-in özü lazımdır. Tətbiqlərim jre və ya nodejs üzərində işləyirsə və onlar üçün mühit artıq serverdədirsə, bu mənə niyə lazımdır?
  • əgər mən (özəl) yerli şəkildə qurulmuş şəklimi uzaq serverdə işlətmək istəyirəmsə, onda mənə öz docker repozitoriyam lazımdır, mənə hardasa işləmək üçün reyestr lazımdır və mən də https-i konfiqurasiya etməliyəm, çünki docker cli yalnız https üzərində işləyir. Oh, lənətə gəlsin... şəkilləri yerli olaraq saxlamaq üçün seçimlər var docker save və sadəcə təsviri scp vasitəsilə göndərin... Amma bu, çoxlu bədən hərəkətləridir. Üstəlik, öz anbarınız görünənə qədər bu, "köpək" həlli kimi görünür
  • docker-compose. Bu, yalnız konteynerləri işə salmaq üçün lazımdır. Hamısı budur. Başqa heç nə edə bilməz. Docker-compose fayllarının bir dəstə versiyaları, öz sintaksisi var. Nə qədər deklarativ olsa da, mən onların sənədlərini oxumaq istəmirəm. Mənə başqa yerdə lazım olmayacaq.
  • komandada işləyərkən insanların çoxu Dockerfile-ni çox əyri şəkildə yazır, onun necə saxlandığını başa düşmür, lazım olan və lazım olmayan hər şeyi təsvirə əlavə edir, Dockerhub-da və ya şəxsi repozitoriyada olmayan şəkillərdən miras alır, bəzi faylları yaradır. docker-compose verilənlər bazası olan fayllar və heç nə qalmır. Eyni zamanda, tərtibatçılar qürurla bəyan edirlər ki, Docker əladır, hər şey onlar üçün yerli işləyir və HR vakansiyada vacib olaraq yazır: "Biz Docker-dən istifadə edirik və bizə belə iş təcrübəsi olan namizəd lazımdır."
  • Məni daim Docker-də hər şeyi yüksəltmək barədə fikirlər təqib edir: postgresql, kafka, redis. Təəssüf ki, konteynerlərdə hər şey işləmir, hər şeyi konfiqurasiya etmək və idarə etmək asan deyil. Bu, satıcıların özləri tərəfindən deyil, üçüncü tərəf tərtibatçıları tərəfindən dəstəklənir. Yeri gəlmişkən, dərhal sual yaranır: satıcılar məhsullarını Docker-də saxlamaqdan narahat deyillər, bu niyə belədir, bəlkə nəyisə bilirlər?
  • Sual həmişə konteyner məlumatlarının davamlılığı ilə bağlı yaranır. və sonra düşünürsən ki, mən sadəcə host kataloqunu quraşdırmalıyam və ya docker həcmi yaratmalıyam və ya indi mövcud olan məlumat konteyneri etməliyəm deprecated? Əgər mən qovluğu quraşdırsam, o zaman əmin olmalıyam ki, konteynerdəki istifadəçinin uid və gid-i konteyneri işə salan istifadəçinin id-si ilə uyğun gəlir, əks halda konteynerin yaratdığı fayllar kök hüquqları ilə yaradılacaq. İstifadə etsəm volume onda məlumatlar sadəcə olaraq bəzilərində yaradılacaq /usr/* və birinci halda olduğu kimi uid və gid ilə eyni hekayə olacaq. Üçüncü tərəf komponentini işə salırsınızsa, sənədləri oxumalı və suala cavab axtarmalısınız: "komponent faylları hansı konteyner qovluqlarında yazır?"

Docker ilə çox uzun müddət məşğul olmağım həmişə xoşuma gəlmirdi ilkin mərhələdə: Konteynerləri necə işə salmağı, hansı şəkilləri işə salmağı başa düşdüm, uzun Docker əmrləri üçün ləqəbləri ehtiva edən Makefiles yaratdım. Docker-compose-a nifrət etdim, çünki docker ekosistemində başqa alət öyrənmək istəmirdim. VƏ docker-compose up Məni narahat edirdi, xüsusən də hələ də orada görüşsələr build konstruksiyalar, daha çox yığılmış şəkillər. Həqiqətən istədiyim yeganə şey məhsulu səmərəli və tez hazırlamaq idi. Ancaq dockerdən necə istifadə edəcəyimi anlaya bilmədim.

Ansible təqdim edirik

Bu yaxınlarda (üç ay əvvəl), demək olar ki, hər bir üzvü Docker-ə mənfi münasibət bəsləyən bir DevOps komandası ilə işlədim. Səbəblərə görə:

  • docker iptables qaydaları (baxmayaraq ki, onu daemon.json-da söndürə bilərsiniz)
  • docker səhv edir və biz onu istehsalda işlətməyəcəyik
  • docker demonu qəzaya uğrayarsa, infrastrukturu olan bütün konteynerlər müvafiq olaraq qəzaya uğrayır
  • dokerə ehtiyac yoxdur
  • Ansible və virtual maşınlar varsa niyə docker

Eyni işdə başqa bir alətlə - Ansible ilə tanış oldum. Bu barədə bir dəfə eşitmişdim, amma öz kitablarımı yazmağa çalışmadım. İndi tapşırıqlarımı yazmağa başladım və sonra baxışım tamamilə dəyişdi! Çünki başa düşdüm: Ansible-da eyni docker konteynerlərini, təsvirləri qurma, şəbəkələr və s. işlətmək üçün modulları var və konteynerlər təkcə yerli deyil, həm də uzaq serverlərdə işlədilə bilər! Zövqüm həddi-hüdudu bilmirdi - NORMAL alət tapdım və Makefile və docker-compose fayllarını atdım, onlar yaml tapşırıqları ilə əvəz olundu. kimi konstruksiyalardan istifadə etməklə kod azaldılmışdır loop, whenVə sairə

Verilənlər bazası kimi üçüncü tərəf komponentlərini işə salmaq üçün Docker

Bu yaxınlarda ssh tunelləri ilə tanış oldum. Məlum oldu ki, uzaq serverin portunu yerli porta “yönləndirmək” çox asandır. Uzaq server ya buluddakı maşın, ya da VirtualBox-da işləyən virtual maşın ola bilər. Əgər həmkarım və ya mənə verilənlər bazası (və ya başqa üçüncü tərəf komponenti) lazımdırsa, biz sadəcə olaraq bu komponentlə serveri işə sala və serverə ehtiyac olmadıqda onu söndürə bilərik. Port yönləndirilməsi docker konteynerində işləyən verilənlər bazası ilə eyni effekt verir.

Bu əmr yerli portumu postgresql ilə işləyən uzaq serverə yönləndirir:

ssh -L 9000: localhost: 5432 [e-poçt qorunur]

Uzaq serverdən istifadə komandanın inkişafı ilə bağlı problemi həll edir. Belə bir server eyni anda bir neçə tərtibatçı tərəfindən istifadə edilə bilər, onların postgresql-i konfiqurasiya etmək, Docker-i və digər incəlikləri başa düşmək lazım deyil. Uzaq serverdə, müəyyən bir versiyanı quraşdırmaq çətindirsə, eyni verilənlər bazasını Docker-in özündə quraşdıra bilərsiniz. Tərtibatçılara lazım olan bütün şey ssh girişini təmin etməkdir!

Bu yaxınlarda oxudum ki, SSH tunelləri adi VPN-in məhdud funksionallığıdır! Siz sadəcə olaraq OpenVPN və ya digər VPN tətbiqlərini quraşdıra, infrastrukturu quraşdıra və istifadə üçün tərtibatçılara verə bilərsiniz. Bu çox gözəldir!

Xoşbəxtlikdən, AWS, GoogleCloud və başqaları sizə bir il pulsuz istifadə imkanı verir, ona görə də onlardan istifadə edin! İstifadə etmədikdə onları söndürsəniz ucuzdur. Mən həmişə gcloud kimi uzaq serverə niyə ehtiyacım olduğunu düşünürdüm, deyəsən onları tapdım.

Yerli virtual maşın olaraq, docker konteynerlərində fəal şəkildə istifadə olunan eyni Alpindən istifadə edə bilərsiniz. Yaxşı, və ya maşının daha sürətli yüklənməsi üçün bəzi digər yüngül paylamalar.

Aşağı xətt: uzaq serverlərdə və ya virtual qutuda verilənlər bazası və digər infrastruktur yaxşılıqlarını işlədə bilərsiniz və etməlisiniz. Bu məqsədlər üçün dockerə ehtiyacım yoxdur.

Docker şəkilləri və paylanması haqqında bir az

Artıq yazmışam Məqalə burada docker şəkillərinin istifadəsinin heç bir zəmanət vermədiyini çatdırmaq istədim. Docker şəkilləri yalnız docker konteyneri yaratmaq üçün lazımdır. Əgər docker şəklinə təkmilləşdirirsinizsə, o zaman docker konteynerlərindən istifadə etmək üçün təkmilləşdirirsiniz və yalnız onlardan istifadə edəcəksiniz.

Proqram tərtibatçılarının məhsullarını yalnız docker görüntüsündə daşıdıqları yerdə görmüsünüzmü?
Əksər məhsulların nəticəsi müəyyən bir platforma üçün ikili fayllardır; onlar sadəcə olaraq istədiyiniz platformadan miras qalan docker şəklinə əlavə olunur. Dockerhub-da niyə bu qədər oxşar şəkillərin olduğunu heç düşünmüsünüzmü? Məsələn, nginx daxil edin, müxtəlif insanlardan 100500 şəkil görəcəksiniz. Bu insanlar nginx-in özünü inkişaf etdirmədilər, sadəcə olaraq, docker imicinə rəsmi nginx əlavə etdilər və konteynerləri işə salmağın rahatlığı üçün onu öz konfiqurasiyaları ilə tədqiq etdilər.

Ümumiyyətlə, siz onu sadəcə olaraq tgz-də saxlaya bilərsiniz, əgər kimsə onu docker-də işlətməlidirsə, o zaman Dockerfile-ə tgz əlavə etsinlər, istədiyiniz mühitdən miras alsınlar və tgz-də tətbiqin özünü dəyişdirməyən əlavə bulkalar yaratsınlar. Docker obrazı yaradacaq hər kəs tgz-nin nə olduğunu və işləmək üçün nəyə ehtiyacı olduğunu biləcək. Mən dockerdən belə istifadə edirəm burada

Aşağı xətt: Docker reyestrinə ehtiyacım yoxdur, mən bir növ S3 və ya google drive/dropbox kimi fayl yaddaşından istifadə edəcəyəm

CI-də Docker

İşlədiyim şirkətlərin hamısı oxşardır. Onlar adətən ərzaq məhsullarıdır. Yəni, onların bir tətbiqi, bir texnologiya yığını (yaxşı, bir neçə və ya üç proqramlaşdırma dili ola bilər).

Bu şirkətlər CI prosesinin işlədiyi serverlərində dockerdən istifadə edirlər. Sual: Nə üçün serverinizdə docker konteynerində layihələr qurmalısınız? Niyə sadəcə olaraq tikinti üçün mühit hazırlamayaq, məsələn, qurmanın baş tutacağı serverə nodejs, php, jdk, ssh düymələrini və s.-nin lazımi versiyalarını quraşdıracaq Ansible playbook yazmırsınız?

İndi başa düşürəm ki, bu, özümü ayağımdan vurur, çünki docker öz izolyasiyası ilə heç bir qazanc gətirmir. Docker-də CI ilə qarşılaşdığım problemlər:

  • yenidən qurmaq üçün docker image lazımdır. bir şəkil axtarmalı və ya öz docker faylınızı yazmalısınız.
  • 90% bəzi ssh düymələrini, docker şəklinə yazmaq istəmədiyiniz gizli məlumatları yönləndirməlisiniz.
  • konteyner yaradılır və ölür, onunla birlikdə bütün keşlər itirilir. növbəti qurma bütün layihə asılılıqlarını yenidən yükləyəcək, bu, vaxt aparan və səmərəsizdir və vaxt puldur.

Tərtibatçılar doker konteynerlərində layihələr qurmurlar (mən bir vaxtlar belə bir fanat idim, həqiqətən, keçmişdə özümə yazığım gəlir xD). Java-da bir neçə versiyaya sahib olmaq və onları bir əmrlə indi ehtiyacınız olana dəyişdirmək mümkündür. nodejs-də də belədir, nvm var.

Buraxılış

Mən inanıram ki, docker çox güclü və çevik bir vasitədir, bu onun çatışmazlığıdır (qəribə səslənir, bəli). Onun köməyi ilə şirkətlər asanlıqla ona bağlana və lazım olan və lazım olmayan yerdə istifadə edə bilərlər. Tərtibatçılar konteynerlərini, bəzi mühitlərini işə salırlar, sonra hamısı rəvan şəkildə CI və istehsala axır. DevOps komandası bu konteynerləri işə salmaq üçün bir növ kod yazır.

Yalnız docker-də istifadə edin ən son iş prosesinizdə mərhələ, başlanğıcda onu layihəyə sürükləməyin. Bu, biznes problemlərinizi həll etməyəcək. O, yalnız problemləri BAŞQA səviyyəyə daşıyacaq və öz həll yollarını təklif edəcək, siz ikiqat iş görəcəksiz.

Docker lazım olduqda: Mən belə nəticəyə gəldim ki, docker verilmiş prosesi optimallaşdırmaqda çox yaxşıdır, lakin əsas funksionallıq yaratmaqda deyil.

Əgər hələ də docker-dən istifadə etmək qərarına gəlsəniz, onda:

  • son dərəcə diqqətli olun
  • tərtibatçıları docker istifadə etməyə məcbur etməyin
  • onun istifadəsini bir yerdə lokallaşdırın, onu bütün Dockfile və docker-compositories arasında yaymayın

PS:

  • Bu yaxınlarda rast gəldim paketçi və deyirlər ki, bu, Ansible ilə çox yaxşı işləyir və şəkillərin qurulması prosesini birləşdirməyə imkan verir (docker şəkli daxil olmaqla)
  • docker haqqında da maraqlı məqalə

Oxuduğunuz üçün təşəkkür edirəm, işlərinizdə şəffaf qərarlar və məhsuldar iş günləri arzulayıram!

Mənbə: www.habr.com

Добавить комментарий