Docker o'yinchoqmi yoki yo'qmi? Yoki bu hali ham haqiqatmi?

Hammaga salom!

Men to'g'ridan-to'g'ri mavzuga o'tishni xohlayman, lekin o'z hikoyam haqida bir oz gapirib berish to'g'riroq bo'ladi:

kirish

Men serverda frontend bir sahifali ilovalar, scala/java va nodejsni ishlab chiqishda tajribaga ega dasturchiman.

Uzoq vaqt davomida (albatta, bir-ikki yoki uch yil) men Docker - bu osmondan manna va umuman, juda ajoyib vosita va har bir ishlab chiquvchi undan foydalanishi kerak degan fikrda edim. Bundan kelib chiqadiki, har bir ishlab chiquvchi o'zining mahalliy mashinasida Docker o'rnatilgan bo'lishi kerak. Mening fikrimcha, xuddi shu hh da e'lon qilingan bo'sh ish o'rinlarini ko'rib chiqing. Har bir soniyada docker haqida eslatma mavjud va agar siz unga egalik qilsangiz, bu sizning raqobatdosh ustunligingiz bo'ladi πŸ˜‰

Yo'lda men Docker va uning ekotizimiga turlicha munosabatda bo'lgan ko'plab odamlarni uchratdim. Ba'zilarning ta'kidlashicha, bu platformalararo funksionallikni kafolatlaydigan qulay narsa. Ikkinchisi nima uchun konteynerlarda yugurish kerakligini va undan qanday foyda olishini tushunishmadi, uchinchisi esa umuman parvo qilmadi va bezovta qilmadi (ular shunchaki kod yozib, uyga ketishdi - ularga havasim keldi, yo'l :)

Foydalanish sabablari

Nima uchun men dockerdan foydalandim? Ehtimol, quyidagi sabablarga ko'ra:

  • ma'lumotlar bazasini ishga tushirish, ilovalarning 99% ulardan foydalanadi
  • frontend tarqatish uchun nginx-ni ishga tushirish va backend uchun proksi-server
  • ilovani docker tasvirida to'plashingiz mumkin, shu tarzda mening ilovam docker mavjud bo'lgan joyda ishlaydi, tarqatish muammosi darhol hal qilinadi
  • qutidan tashqarida xizmatni kashf qilish, siz mikroservislarni yaratishingiz mumkin, har bir konteyner (umumiy tarmoqqa ulangan) boshqa nom orqali osongina boshqasiga kirishi mumkin, juda qulay
  • Konteyner yaratish va unda "o'ynash" qiziqarli.

Menga docker haqida har doim yoqmaydigan narsa:

  • Ilovam ishlashi uchun menga serverda Docker kerak. Agar mening ilovalarim jre yoki nodejs da ishlayotgan bo'lsa va ular uchun muhit allaqachon serverda bo'lsa, bu menga nima uchun kerak?
  • agar men o'zimning (xususiy) mahalliy tasvirimni uzoq serverda ishga tushirmoqchi bo'lsam, u holda menga o'z docker omborim kerak, menga biror joyda ishlash uchun registr kerak va men ham https-ni sozlashim kerak, chunki docker cli faqat https orqali ishlaydi. Oh, la'nat ... variantlari bor, albatta, orqali tasvirni mahalliy saqlash uchun docker save va faqat scp orqali tasvirni yuboring ... Lekin bu juda ko'p tana harakatlari. Bundan tashqari, bu sizning shaxsiy omboringiz paydo bo'lguncha "tayoqcha" yechimiga o'xshaydi
  • docker-compose. Bu faqat konteynerlarni ishlatish uchun kerak. Va tamom. U boshqa hech narsa qila olmaydi. Docker-compose fayllarning ko'plab versiyalari, o'z sintaksisi mavjud. Bu qanchalik deklarativ bo'lmasin, men ularning hujjatlarini o'qishni xohlamayman. Menga boshqa joyda kerak bo'lmaydi.
  • jamoada ishlaganda, ko'pchilik odamlar Dockerfaylni juda egri yozadilar, uning qanday keshlanganligini tushunmaydilar, rasmga kerakli va kerak bo'lmagan hamma narsani qo'shadilar, Dockerhub yoki shaxsiy omborda bo'lmagan rasmlardan meros oladilar, ba'zilarini yaratadilar. docker-compose ma'lumotlar bazasiga ega fayllar va hech narsa saqlanib qolmaydi. Shu bilan birga, ishlab chiquvchilar Docker ajoyib ekanligini g'urur bilan ta'kidlaydilar, hamma narsa ular uchun mahalliy ishlaydi va HR bo'sh o'ringa muhim tarzda yozadi: "Biz Docker-dan foydalanamiz va bizga bunday ish tajribasiga ega nomzod kerak".
  • Docker-da hamma narsani ko'tarish haqidagi fikrlar meni doimo hayajonga soladi: postgresql, kafka, redis. Afsuski, hamma narsa konteynerlarda ishlamaydi, hamma narsani sozlash va ishga tushirish oson emas. Buni sotuvchilarning o'zlari emas, balki uchinchi tomon ishlab chiquvchilari qo'llab-quvvatlaydi. Aytgancha, darhol savol tug'iladi: sotuvchilar Docker-da o'z mahsulotlarini saqlab qolish haqida tashvishlanmaydilar, nega bu, ehtimol ular nimanidir bilishadi?
  • Har doim konteyner ma'lumotlarining barqarorligi haqida savol tug'iladi. va keyin siz shunchaki xost katalogini o'rnatishim kerakmi yoki docker hajmini yaratishim kerakmi yoki hozirda mavjud bo'lgan ma'lumotlar konteynerini yaratishim kerak deb o'ylaysiz. deprecated? Agar men katalogni o'rnatsam, konteynerdagi foydalanuvchining uid va gid ko'rsatkichlari konteynerni ishga tushirgan foydalanuvchi identifikatoriga mos kelishiga ishonch hosil qilishim kerak, aks holda konteyner tomonidan yaratilgan fayllar ildiz huquqlari bilan yaratiladi. foydalansam volume keyin ma'lumotlar shunchaki ba'zilarida yaratiladi /usr/* va birinchi holatda bo'lgani kabi uid va gid bilan bir xil hikoya bo'ladi. Agar siz uchinchi tomon komponentini ishga tushirayotgan bo'lsangiz, hujjatlarni o'qib chiqishingiz va "komponent qaysi konteyner kataloglarida fayllarni yozadi?" Degan savolga javob izlashingiz kerak.

Men Docker bilan uzoq vaqt shug'ullanishim kerakligini har doim yoqtirmasdim dastlabki bosqichda: Men konteynerlarni qanday ishga tushirishni, qaysi tasvirlardan ishga tushirishni tushundim, uzoq Docker buyruqlariga taxalluslarni o'z ichiga olgan Makefiles yaratdim. Men docker-compose-dan nafratlanardim, chunki men docker ekotizimida boshqa vositani o'rganishni xohlamadim. VA docker-compose up Bu meni bezovta qildi, ayniqsa ular hali ham u erda uchrashishsa build allaqachon yig'ilgan tasvirlar emas, balki konstruktsiyalar. Men chindan ham xohlaganim mahsulotni samarali va tez qilish edi. Lekin men dockerdan qanday foydalanishni tushunolmadim.

Ansible bilan tanishtirish

Yaqinda (uch oy oldin) men DevOps jamoasi bilan ishladim, ularning deyarli har bir a'zosi Dockerga nisbatan salbiy munosabatda edi. Sabablariga ko'ra:

  • docker iptablesni boshqaradi (garchi siz uni daemon.json da o'chirib qo'yishingiz mumkin)
  • docker noto'g'ri va biz uni ishlab chiqarishda ishlatmaymiz
  • agar docker demoni ishdan chiqsa, infratuzilmaga ega bo'lgan barcha konteynerlar shunga mos ravishda ishdan chiqadi
  • docker kerak emas
  • Ansible va virtual mashinalar mavjud bo'lsa, nima uchun docker

Xuddi shu ishda men boshqa vosita bilan tanishdim - Ansible. Men bu haqda bir marta eshitganman, lekin o'zimning o'yin kitoblarimni yozishga harakat qilmaganman. Va endi men o'z vazifalarimni yozishni boshladim va keyin mening qarashlarim butunlay o'zgardi! Men tushundim: Ansible-da bir xil docker konteynerlarini, tasvirlarni yaratish, tarmoqlar va boshqalarni ishga tushirish uchun modullar mavjud va konteynerlar nafaqat mahalliy, balki uzoq serverlarda ham ishga tushirilishi mumkin! Mening zavqim chegara bilmasdi - men NORMAL vositani topdim va Makefile va docker-compose fayllarimni tashladim, ular yaml vazifalari bilan almashtirildi. Kod kabi tuzilmalar yordamida qisqartirildi loop, whenVa boshqalar

Ma'lumotlar bazalari kabi uchinchi tomon komponentlarini ishga tushirish uchun Docker

Men yaqinda ssh tunnellari bilan tanishdim. Ma'lum bo'lishicha, uzoq server portini mahalliy portga "yo'naltirish" juda oson. Masofaviy server bulutdagi mashina yoki VirtualBox-da ishlaydigan virtual mashina bo'lishi mumkin. Agar mening hamkasbim yoki menga ma'lumotlar bazasi (yoki boshqa uchinchi tomon komponenti) kerak bo'lsa, biz serverni ushbu komponent bilan ishga tushirishimiz va server kerak bo'lmaganda uni o'chirib qo'yishimiz mumkin. Portni yo'naltirish docker konteynerida ishlaydigan ma'lumotlar bazasi bilan bir xil effekt beradi.

Bu buyruq mening mahalliy portimni postgresql bilan ishlaydigan uzoq serverga yo'naltiradi:

ssh -L 9000: localhost: 5432 [elektron pochta bilan himoyalangan]

Masofaviy serverdan foydalanish jamoani rivojlantirish bilan bog'liq muammoni hal qiladi. Bunday serverdan bir vaqtning o'zida bir nechta ishlab chiquvchilar foydalanishi mumkin, ular postgresql-ni sozlash, Docker va boshqa nozikliklarni tushunishlari shart emas. Masofaviy serverda, agar ma'lum bir versiyani o'rnatish qiyin bo'lsa, xuddi shu ma'lumotlar bazasini Docker-ning o'zida o'rnatishingiz mumkin. Ishlab chiquvchilarga ssh kirishini ta'minlash kerak!

Yaqinda men SSH tunnellari oddiy VPN-ning cheklangan funksiyasi ekanligini o'qidim! Siz shunchaki OpenVPN yoki boshqa VPN ilovalarini o'rnatishingiz, infratuzilmani sozlashingiz va uni ishlab chiquvchilarga foydalanish uchun berishingiz mumkin. Bu juda zo'r!

Yaxshiyamki, AWS, GoogleCloud va boshqalar sizga bir yillik bepul foydalanish imkonini beradi, shuning uchun ulardan foydalaning! Agar foydalanilmayotganda ularni o'chirib qo'ysangiz, ular arzon. Men har doim gcloud kabi uzoq serverga nima uchun kerak bo'lishi haqida hayron bo'lardim, men ularni topdim.

Mahalliy virtual mashina sifatida siz docker konteynerlarida faol ishlatiladigan bir xil Alp tog'idan foydalanishingiz mumkin. Xo'sh, yoki mashinani tezroq ishga tushirish uchun boshqa engil taqsimotlar.

Xulosa: siz ma'lumotlar bazalari va boshqa infratuzilmani uzoq serverlarda yoki virtual qutida ishlatishingiz mumkin va kerak. Menga bu maqsadlar uchun docker kerak emas.

Docker tasvirlari va tarqatish haqida bir oz

Men allaqachon yozganman maqola unda men docker tasvirlaridan foydalanish hech qanday kafolat bermasligini aytmoqchi edim. Docker tasvirlari faqat docker konteynerini yaratish uchun kerak. Agar siz docker tasvirini yangilayotgan bo'lsangiz, u holda siz docker konteynerlaridan foydalanishga yangilanasiz va siz ulardan faqat foydalanasiz.

Dasturiy ta'minot ishlab chiquvchilari o'z mahsulotlarini faqat docker tasvirida ko'rsatadigan biron bir joyni ko'rganmisiz?
Ko'pgina mahsulotlarning natijasi ma'lum bir platforma uchun ikkilik fayllardir; ular shunchaki kerakli platformadan meros bo'lib qolgan docker tasviriga qo'shiladi. Nima uchun dockerhub-da shunga o'xshash rasmlar juda ko'p ekanligi haqida hech o'ylab ko'rganmisiz? Masalan, nginx ni kiriting, siz turli odamlarning 100500 XNUMX ta rasmini ko'rasiz. Bu odamlar nginx-ni o'zlari ishlab chiqmaganlar, ular shunchaki docker tasviriga rasmiy nginx-ni qo'shdilar va konteynerlarni ishga tushirish qulayligi uchun uni o'zlarining konfiguratsiyalari bilan tatib ko'rdilar.

Umuman olganda, siz uni oddiygina tgz-da saqlashingiz mumkin, agar kimdir uni docker-da ishga tushirishi kerak bo'lsa, u holda ularga tgz-ni Dockerfile-ga qo'shishga ruxsat bering, kerakli muhitdan meros qilib oling va ilovaning o'zini tgz-da o'zgartirmaydigan qo'shimcha buklar yarating. Docker tasvirini yaratadigan har bir kishi tgz nima ekanligini va u nima ishlashi kerakligini biladi. Men dockerdan shunday foydalanaman shu yerda

Xulosa: Menga docker registrlari kerak emas, men qandaydir S3 yoki shunchaki google drive/dropbox kabi fayl xotirasidan foydalanaman

CIda Docker

Men ishlagan barcha kompaniyalar o'xshash. Ular odatda oziq-ovqat. Ya'ni, ularda bitta dastur, bitta texnologik stek (yaxshi, bir nechta yoki uchta dasturlash tili bo'lishi mumkin).

Ushbu kompaniyalar CI jarayoni ishlaydigan serverlarida docker-dan foydalanadilar. Savol: Nima uchun serveringizda docker konteynerida loyihalar yaratishingiz kerak? Nega shunchaki qurish uchun muhit tayyorlamaysiz, masalan, qurilish amalga oshiriladigan serverga nodejs, php, jdk, ssh kalitlarini nusxalash va hokazolarning kerakli versiyalarini o'rnatadigan Ansible o'yin kitobini yozing?

Endi tushundimki, bu o'zimni oyog'imga otib yuboryapti, chunki docker o'zining izolyatsiyasi bilan hech qanday foyda keltirmaydi. Dockerda CI bilan duch kelgan muammolarim:

  • yana qurish uchun sizga docker tasviri kerak. tasvirni qidirishingiz yoki o'zingizning docker faylingizni yozishingiz kerak.
  • Ba'zi ssh kalitlarini, docker tasviriga yozishni istamaydigan maxfiy ma'lumotlarni yuborishingiz kerak bo'lgan 90%.
  • konteyner yaratiladi va o'ladi, u bilan birga barcha keshlar yo'qoladi. keyingi qurilish loyihaning barcha bog'liqliklarini qayta yuklaydi, bu ko'p vaqt talab qiladigan va samarasiz, vaqt esa puldir.

Ishlab chiquvchilar docker konteynerlarida loyihalar qurmaydilar (men bir vaqtlar shunday muxlis edim, haqiqatan ham o'tmishda o'zimga achinaman xD). Java-da bir nechta versiyalarga ega bo'lish va ularni bitta buyruq bilan hozir kerak bo'lganiga o'zgartirish mumkin. Bu nodejsda ham xuddi shunday, nvm mavjud.

xulosa

Men docker juda kuchli va moslashuvchan vosita ekanligiga ishonaman, bu uning kamchiligi (g'alati tuyuladi, ha). Uning yordami bilan kompaniyalar osonlik bilan unga bog'lanib qolishlari va undan kerak bo'lgan va kerak bo'lmagan joyda foydalanishlari mumkin. Ishlab chiquvchilar o'zlarining konteynerlarini, ba'zi muhitlarini ishga tushiradilar, keyin hammasi muammosiz CI va ishlab chiqarishga oqib chiqadi. DevOps jamoasi ushbu konteynerlarni ishga tushirish uchun qandaydir kod yozmoqda.

Faqat docker-da foydalaning eng oxirgi Ish oqimingiz bosqichida, uni boshida loyihaga tortmang. Bu sizning biznes muammolaringizni hal qilmaydi. U faqat muammolarni BOSHQA darajaga ko'taradi va o'z echimlarini taklif qiladi, siz ikki tomonlama ish qilasiz.

Docker kerak bo'lganda: Men docker ma'lum bir jarayonni optimallashtirishda juda yaxshi degan xulosaga keldim, lekin asosiy funktsiyalarni yaratishda emas.

Agar siz hali ham docker-dan foydalanishga qaror qilsangiz, unda:

  • nihoyatda ehtiyot bo'ling
  • ishlab chiquvchilarni dockerdan foydalanishga majburlamang
  • foydalanishni bir joyda lokalizatsiya qiling, uni barcha Dockfile va docker-compositoriyalariga tarqatmang

PS:

O'qiganingiz uchun rahmat, ishlaringizda shaffof qarorlar va samarali ish kunlari tilayman!

Manba: www.habr.com

a Izoh qo'shish