Докер ойыншық па, жоқ па? Әлде бұл әлі де рас па?

Привет!

Мен тікелей тақырыпқа өткім келеді, бірақ өз оқиғам туралы аздап айтып бергенім дұрыс болар еді:

кіру

Мен серверде бір беттік қосымшаларды, scala/java және nodejs әзірлеу тәжірибесі бар бағдарламашымын.

Ұзақ уақыт бойы (міндетті түрде бір-екі немесе үш жыл) мен Docker - бұл аспаннан келген манна және жалпы өте керемет құрал және оны кез келген әзірлеуші ​​​​пайдалануы керек деген пікірде болдым. Бұдан шығатыны, әрбір әзірлеушіде өзінің жергілікті компьютерінде Docker орнатылған болуы керек. Менің пікірім ше, сол хх бойынша жарияланған бос орындарды қарап шығыңыз. Әрбір секундта докер туралы ескертпе бар, егер сізде оның иесі болса, бұл сіздің бәсекелестік артықшылығыңыз болады 😉

Жолда мен Докерге және оның экожүйесіне әртүрлі көзқарастары бар көптеген адамдарды кездестірдім. Кейбіреулер бұл кросс-платформалық функционалдылыққа кепілдік беретін ыңғайлы нәрсе екенін айтты. Екіншілері неліктен контейнерлерде жүгіру керектігін және одан қандай пайда түсетінін түсінбеді, үшіншісі мүлде мән бермеді және алаңдамады (олар жай ғана кодты жазып, үйге қайтты - мен оларды қызғанамын, жол :)

Қолдану себептері

Неліктен мен докерді пайдаландым? Мүмкін келесі себептерге байланысты:

  • дерекқорды іске қосу, қолданбалардың 99% оларды пайдаланады
  • фронтенді тарату үшін nginx іске қосу және серверге прокси жіберу
  • қолданбаны докер кескінінде буып алуға болады, осылайша менің қолданбам докер бар жерде жұмыс істейді, тарату мәселесі бірден шешіледі
  • қораптан тыс қызметті табу, сіз микросервистерді жасай аласыз, әрбір контейнер (жалпы желіге қосылған) бүркеншік ат арқылы басқасына оңай қол жеткізе алады, өте ыңғайлы
  • Контейнер жасау және оның ішінде «ойнау» қызықты.

Докердің маған ұнамайтыны:

  • Қолданбам жұмыс істеуі үшін маған серверде Docker керек. Қолданбаларым jre немесе nodejs жұмыс істейтін болса және оларға арналған орта серверде әлдеқашан болса, бұл маған не үшін қажет?
  • егер мен қашықтағы серверде (жеке) жергілікті түрде салынған кескінді іске қосқым келсе, онда маған жеке докер репозиторийім керек, маған бір жерде жұмыс істеу үшін тізілім қажет және маған https конфигурациялау керек, өйткені доккер cli тек https арқылы жұмыс істейді. О, қарғыс атқыр... кескінді жергілікті түрде сақтау үшін, әрине, опциялар бар docker save және суретті тек scp арқылы жіберіңіз ... Бірақ бұл дене қозғалысының көптігі. Сонымен қатар, бұл сіздің жеке репозиторийіңіз пайда болғанша «балдақ» шешіміне ұқсайды
  • docker-compose. Ол тек контейнерлерді іске қосу үшін қажет. Болды. Ол басқа ештеңе істей алмайды. Docker-compose файлдарының көптеген нұсқалары, өзіндік синтаксисі бар. Қаншалықты декларативті болса да, мен олардың құжаттамасын оқығым келмейді. Маған ол басқа жерде керек емес.
  • командада жұмыс істегенде, адамдардың көпшілігі Докер файлын өте қисық жазады, оның қалай кэштелетінін түсінбейді, кескінге қажет және қажет емес нәрселердің барлығын қосады, Dockerhub немесе жеке репозиторийде жоқ кескіндерден мұра алады, кейбір файлдарды жасайды. docker-compose деректер базасы бар файлдар және ештеңе сақталмайды. Сонымен қатар, әзірлеушілер Docker керемет екенін мақтанышпен мәлімдейді, бәрі олар үшін жергілікті түрде жұмыс істейді және HR бос орынға: «Біз Docker-ті қолданамыз және бізге осындай жұмыс тәжірибесі бар үміткер қажет» деп жазады.
  • Мені үнемі Docker-те барлығын көтеру туралы ойлар мазалайды: postgresql, kafka, redis. Өкінішке орай, контейнерлерде бәрі жұмыс істемейді, конфигурациялау және іске қосу оңай емес. Мұны жеткізушілердің өздері емес, үшінші тарап әзірлеушілері қолдайды. Айтпақшы, бірден сұрақ туындайды: сатушылар өз өнімдерін Docker-те ұстау туралы алаңдамайды, бұл неге, мүмкін олар бірдеңе біледі ме?
  • Контейнер деректерінің тұрақтылығы туралы сұрақ әрқашан туындайды. содан кейін сіз ойлайсыз, мен жай ғана хост каталогын орнату керек пе, әлде докер көлемін жасау керек пе немесе қазір бар деректер контейнерін жасау керек пе? deprecated? Егер мен каталогты орнатсам, контейнердегі пайдаланушының uid және gid кодтары контейнерді іске қосқан пайдаланушының идентификаторына сәйкес келетініне көз жеткізуім керек, әйтпесе контейнер жасаған файлдар түбірлік құқықтармен жасалады. Мен пайдалансам volume содан кейін деректер кейбіреулерінде жай ғана жасалады /usr/* және бірінші жағдайдағыдай uid және gid-мен бірдей оқиға болады. Егер сіз үшінші тарап компонентін іске қоссаңыз, құжаттаманы оқып шығып, «компонент қай контейнерлік каталогтарда файлдарды жазады?» Деген сұраққа жауап іздеуіңіз керек.

Маған Докермен тым ұзақ уақыт айналысуға тура келгені ұнамайтын бастапқы кезеңде: Мен контейнерлерді қалай іске қосу керектігін, қандай кескіндерден іске қосу керектігін түсіндім, Docker ұзын командаларына бүркеншік аттары бар Makefiles жасадым. Мен докер-композитті жек көрдім, өйткені докер экожүйесінде басқа құралды үйренгім келмеді. ЖӘНЕ docker-compose up Бұл мені алаңдатты, әсіресе олар сонда кездескен болса build құрастырылған кескіндерден гөрі конструкциялар. Мен тек өнімді тиімді және жылдам жасауды қалаймын. Бірақ мен докерді қалай пайдалану керектігін түсіне алмадым.

Ansible-мен таныстыру

Жақында (үш ай бұрын) мен DevOps командасымен жұмыс істедім, оның әрбір мүшесі дерлік Докерге теріс көзқараста болды. Себептер бойынша:

  • докер iptables ережелерін сақтайды (бірақ оны daemon.json ішінде өшіруге болады)
  • докер қате және біз оны өндірісте іске қоспаймыз
  • егер докер демоны бұзылса, инфрақұрылымы бар барлық контейнерлер сәйкесінше бұзылады
  • докердің қажеті жоқ
  • Ansible және виртуалды машиналар бар болса, неге докер

Сол жұмыста мен басқа құралмен - Ansible-мен таныстым. Мен бұл туралы бір рет естідім, бірақ мен өзімнің ойын кітаптарымды жазуға тырыспадым. Енді мен тапсырмаларымды жаза бастадым, содан кейін көзқарасым толығымен өзгерді! Себебі мен түсіндім: Ansible-де бірдей докерлік контейнерлерді, кескіндерді құрастыруды, желілерді және т.б. іске қосу модульдері бар және контейнерлерді тек жергілікті емес, сонымен қатар қашықтағы серверлерде де іске қосуға болады! Менің қуанышымда шек болмады - мен ҚАЛЫПТЫ құралды тауып, Makefile және докер-құрастыру файлдарын лақтырып тастадым, олар yaml тапсырмаларымен ауыстырылды. сияқты конструкцияларды пайдалану арқылы код қысқартылды loop, whenЖәне т.б.

Дерекқорлар сияқты үшінші тарап құрамдастарын іске қосу үшін Docker

Мен жақында ssh туннельдерімен таныстым. Қашықтағы сервердің портын жергілікті портқа «жіберу» өте оңай екені белгілі болды. Қашықтағы сервер бұлттағы машина немесе VirtualBox жүйесінде жұмыс істейтін виртуалды машина болуы мүмкін. Егер менің әріптесім немесе маған дерекқор (немесе басқа үшінші тарап құрамдас бөлігі) қажет болса, біз серверді осы құрамдаспен іске қосып, сервер қажет болмаған кезде оны өшіре аламыз. Портты қайта жіберу докер контейнерінде жұмыс істейтін дерекқормен бірдей әсер береді.

Бұл пәрмен менің жергілікті портымды postgresql жұмыс істейтін қашықтағы серверге жібереді:

ssh -L 9000: жергілікті хост: 5432 [электрондық пошта қорғалған]

Қашықтағы серверді пайдалану топты дамыту мәселесін шешеді. Мұндай серверді бірден бірнеше әзірлеушілер пайдалана алады, оларға postgresql конфигурациялау, Docker және басқа да қыр-сырларды түсіну қажет емес. Қашықтағы серверде нақты нұсқаны орнату қиын болса, дәл сол дерекқорды Docker-дың өзінде орнатуға болады. Әзірлеушілерге тек ssh қатынасын қамтамасыз ету қажет!

Мен жақында SSH туннельдері кәдімгі VPN-дің шектеулі функционалдығы екенін оқыдым! Сіз жай ғана OpenVPN немесе басқа VPN енгізулерін орната аласыз, инфрақұрылымды орнатып, оны әзірлеушілерге пайдалану үшін бере аласыз. Бұл өте керемет!

Бақытымызға орай, AWS, GoogleCloud және басқалары сізге бір жыл тегін пайдалану мүмкіндігін береді, сондықтан оларды пайдаланыңыз! Қолданбаған кезде өшірсеңіз, олар арзан. Мен әрқашан gcloud сияқты қашықтағы сервер не үшін керек деп ойладым, мен оларды таптым.

Жергілікті виртуалды машина ретінде сіз докерлік контейнерлерде белсенді қолданылатын бірдей Alpine пайдалана аласыз. Жақсы, немесе машинаның жүктелуін жылдамдату үшін басқа жеңіл үлестірулер.

Төменгі жол: қашықтағы серверлерде немесе виртуалды жәшікте дерекқорларды және басқа инфрақұрылымдық пайдалы заттарды іске қосуға болады және керек. Бұл мақсаттар үшін маған докер қажет емес.

Докерлік кескіндер мен тарату туралы аздап

Мен қазірдің өзінде жаздым мақала онда мен докер кескіндерін пайдалану ешқандай кепілдік бермейтінін айтқым келді. Докер кескіндері тек докер контейнерін жасау үшін қажет. Егер сіз докер кескініне жаңартып жатсаңыз, онда сіз докер контейнерлерін пайдалану үшін жаңартып жатырсыз және оларды тек пайдаланасыз.

Бағдарламалық жасақтаманы әзірлеушілер өз өнімдерін тек докер кескінінде тасымалдайтын жерді көрдіңіз бе?
Көптеген өнімдердің нәтижесі белгілі бір платформаға арналған екілік файлдар болып табылады; олар жай ғана қалаған платформадан мұраланған докер кескініне қосылады. Dockerhub жүйесінде неге ұқсас суреттер көп екенін ойлап көрдіңіз бе? Мысалы, nginx енгізіңіз, сіз әртүрлі адамдардан 100500 XNUMX суретті көресіз. Бұл адамдар nginx-тің өзін дамытпады, олар жай ғана өздерінің докер кескініне ресми nginx қосты және контейнерлерді іске қосуға ыңғайлы болу үшін оны өздерінің конфигурацияларымен дәмдетті.

Тұтастай алғанда, сіз оны жай ғана tgz-де сақтай аласыз, егер біреу оны докерде іске қосу керек болса, онда оларға tgz файлын Docker-файлға қосуға, қалаған ортадан мұраға алуға және қосымшаның өзін tgz-де өзгертпейтін қосымша бунақтарды жасауға мүмкіндік беріңіз. Докер бейнесін жасайтын кез келген адам tgz деген не екенін және ол жұмыс істеу үшін не қажет екенін біледі. Мен докерді осылай қолданамын осында

Төменгі жол: маған докерлік тізілім қажет емес, мен S3 түрін немесе Google Drive/dropbox сияқты файлдарды сақтауды қолданамын

CI жүйесіндегі докер

Мен жұмыс істеген компаниялардың барлығы бірдей. Олар әдетте азық-түлік. Яғни, олардың бір қосымшасы, бір технологиялық стек (жақсы, мүмкін, бірнеше немесе үш бағдарламалау тілі) бар.

Бұл компаниялар CI процесі орындалатын серверлерінде докерді пайдаланады. Сұрақ: Неліктен серверлеріңіздегі докер контейнерінде жобаларды құру керек? Неліктен құрастыру үшін ортаны дайындамасқа, мысалы, құрастыру орындалатын серверге nodejs, php, jdk, ssh пернелерін көшіру және т.б. қажетті нұсқаларын орнататын Ansible ойын кітабын жазуға болмайды?

Енді мен бұл өзімді аяғыма атып жатқанын түсіндім, өйткені докер оқшаулануымен ешқандай пайда әкелмейді. Доккерде CI-мен кездескен мәселелер:

  • қайтадан құру үшін докер кескіні қажет. суретті іздеу керек немесе өзіңіздің докер файлыңызды жазуыңыз керек.
  • 90% кейбір ssh кілттерін, докер кескініне жазғыңыз келмейтін құпия деректерді жіберу қажет.
  • контейнер құрылады және өледі, онымен бірге барлық кэштер жоғалады. келесі құрастыру жобаның барлық тәуелділіктерін қайта жүктеп алады, бұл уақытты қажет ететін және тиімсіз, ал уақыт - ақша.

Әзірлеушілер докерлік контейнерлерде жобалар жасамайды (мен бір кездері сондай жанкүйер болдым, шынында да, өткенде өзімді аяймын xD). Java-да бірнеше нұсқа болуы мүмкін және оларды бір пәрменмен қазір қажетіне өзгертуге болады. Бұл nodejs-де бірдей, nvm бар.

қорытынды

Менің ойымша, докер өте күшті және икемді құрал, бұл оның кемшілігі (біртүрлі естіледі, иә). Оның көмегімен компаниялар оған оңай ілініп, қажет және қажет емес жерде пайдалана алады. Әзірлеушілер контейнерлерін, кейбір орталарын іске қосады, содан кейін оның барлығы CI және өндіріске біркелкі ағып кетеді. DevOps командасы осы контейнерлерді іске қосу үшін қандай да бір код жазуда.

Доккерді тек мынада пайдаланыңыз ең соңғы жұмыс үрдісіндегі кезең, оны басында жобаға апармаңыз. Бұл сіздің бизнесіңіздің мәселелерін шешпейді. Ол тек мәселелерді БАСҚА деңгейге жылжытады және өз шешімдерін ұсынады, сіз екі есе жұмыс жасайсыз.

Докер қажет болғанда: Мен докер берілген процесті оңтайландыруда өте жақсы, бірақ негізгі функционалдылықты құруда емес деген қорытындыға келдім.

Егер сіз әлі де доккерді пайдалануды шешсеңіз, онда:

  • өте сақ болыңыз
  • әзірлеушілерді докерді пайдалануға мәжбүрлемеңіз
  • оны бір жерде пайдалануды локализациялаңыз, оны барлық Dockfile және докер-құрастыру репозиторийлеріне таратпаңыз

PS:

Оқығандарыңызға рахмет, істеріңізде ашық шешімдер мен жемісті жұмыс күндеріңізді тілеймін!

Ақпарат көзі: www.habr.com

пікір қалдыру