Докер тоглоом уу, үгүй ​​юу? Эсвэл үнэн хэвээр байна уу?

хүн бүрт Сайн байна уу!

Би энэ сэдэв рүү шууд орохыг үнэхээр хүсч байна, гэхдээ өөрийнхөө түүхийн талаар бага зэрэг ярих нь илүү зөв байх болно.

нэвтрэх

Би сервер дээр урд талын нэг хуудасны програмууд, scala/java болон nodejs программуудыг хөгжүүлж байсан туршлагатай програмист хүн.

Удаан хугацааны турш (мэдээж хоёр эсвэл гурван жил) би Докер бол тэнгэрээс ирсэн манна бөгөөд ерөнхийдөө маш гайхалтай хэрэгсэл бөгөөд үүнийг хөгжүүлэгч бүр ашиглах боломжтой байх ёстой гэж би боддог байсан. Үүнээс үзэхэд хөгжүүлэгч бүр өөрийн дотоод машин дээрээ Docker суулгасан байх ёстой. Миний бодлоор яах вэ, ижил хх дээр тавигдсан сул орон тоонуудыг хараарай. Секунд бүрд докерын тухай дурдсан байдаг бөгөөд хэрэв та үүнийг эзэмшдэг бол энэ нь таны өрсөлдөх давуу тал болно 😉

Замдаа би Докер болон түүний экосистемд өөр өөр хандлагатай олон хүмүүстэй уулзсан. Зарим нь энэ нь платформ хоорондын үйл ажиллагааг баталгаажуулдаг тохиромжтой зүйл гэж хэлсэн. Хоёр дахь нь яагаад чингэлэгт гүйх ёстойгоо, үүнээс ямар ашиг олохыг ойлгоогүй, гурав дахь нь огтхон ч санаа зовсонгүй (тэд зүгээр л код бичээд гэртээ харьсан - би тэдэнд атаархав. арга зам :)

Хэрэглэх шалтгаанууд

Би яагаад docker ашигласан бэ? Магадгүй дараах шалтгааны улмаас:

  • мэдээллийн баазыг ажиллуулж, програмуудын 99% нь тэдгээрийг ашигладаг
  • Frontend түгээлтэд зориулж nginx-г эхлүүлж, арын хэсэгт прокси хийж байна
  • Та програмыг докерын дүрсээр багцалж болно, ингэснээр миний програм докер хаана ч ажиллах болно, түгээлтийн асуудал нэн даруй шийдэгдэнэ.
  • Үйлчилгээний нээлтийг хайрцагнаас гаргаснаар та микро үйлчилгээ үүсгэх боломжтой, контейнер бүр (нийтлэг сүлжээнд холбогдсон) өөр нэрээр хялбархан холбогдож, маш тохиромжтой.
  • Сав хийж, дотор нь "тоглох" нь хөгжилтэй байдаг.

Докерын талаар миний үргэлж дургүй байдаг зүйл:

  • Миний програм ажиллахын тулд сервер дээр Docker өөрөө хэрэгтэй. Хэрэв миний хэрэглүүр jre эсвэл nodejs дээр ажилладаг бөгөөд тэдгээрт зориулсан орчин сервер дээр байгаа бол яагаад надад энэ хэрэгтэй байна вэ?
  • Хэрэв би өөрийн (хувийн) локал байдлаар бүтээгдсэн дүрсээ алсын сервер дээр ажиллуулахыг хүсвэл надад өөрийн докерын репозитор хэрэгтэй, хаа нэгтээ ажиллахын тулд бүртгэл хэрэгтэй, мөн докер cli зөвхөн https дээр ажилладаг тул https-ийг тохируулах хэрэгтэй. Өө хараал ид... мэдээжийн хэрэг, зургийг дотооддоо хадгалах сонголтууд байдаг docker save тэгээд зүгээр л scp-ээр зургаа явуулаарай... Гэхдээ энэ бол маш олон биеийн хөдөлгөөн юм. Үүнээс гадна, энэ нь таны хадгалах газар гарч ирэх хүртэл "таяг" шийдэл шиг харагдаж байна
  • docker-compose. Энэ нь зөвхөн савыг ажиллуулахад л хэрэгтэй. Тэгээд л болоо. Тэр өөр юу ч хийж чадахгүй. Docker-compose өөрийн файлуудын олон хувилбартай, өөрийн гэсэн синтакстай. Хичнээн тунхагласан байсан ч би тэдний баримт бичгийг уншихыг хүсэхгүй байна. Надад өөр хаана ч хэрэггүй болно.
  • Багаар ажиллахдаа ихэнх хүмүүс Dockerfile-ийг маш хазайлттай бичдэг, хэрхэн хадгалагдаж байгааг ойлгодоггүй, шаардлагатай болон шаардлагагүй бүх зүйлийг зурган дээрээ нэмдэг, Dockerhub эсвэл хувийн репозиторд байхгүй зургуудаас өвлөн авдаг, зарим файл үүсгэдэг. docker-compose өгөгдлийн сантай файлууд, юу ч үлдэхгүй. Үүний зэрэгцээ, хөгжүүлэгчид Docker бол гайхалтай, бүх зүйл тэдний хувьд орон нутагт ажилладаг бөгөөд HR нь сул орон тоонд "Бид Docker ашигладаг, бидэнд ийм ажлын туршлагатай нэр дэвшигч хэрэгтэй байна" гэж бичдэг.
  • Postgresql, kafka, redis гэх мэт Docker дээрх бүх зүйлийг өсгөх тухай бодол намайг байнга зовоож байдаг. Бүх зүйл саванд ажилладаггүй, тохируулах, ажиллуулахад хялбар байдаггүй нь харамсалтай. Үүнийг үйлдвэрлэгчид өөрсдөө биш харин гуравдагч талын хөгжүүлэгчид дэмждэг. Дашрамд хэлэхэд тэр даруй асуулт гарч ирнэ: борлуулагчид бүтээгдэхүүнээ Docker-д хадгалах талаар санаа зовдоггүй, яагаад ийм байна вэ, магадгүй тэд ямар нэг зүйлийг мэддэг болов уу?
  • Контейнерын өгөгдлийн тогтвортой байдлын тухай асуулт үргэлж гарч ирдэг. Дараа нь би зүгээр л хост лавлахыг холбох уу, эсвэл докерын хэмжээ үүсгэх үү, эсвэл одоо байгаа өгөгдлийн контейнер хийх үү гэж та бодож байна. deprecated? Хэрэв би лавлахыг холбосон бол контейнерт байгаа хэрэглэгчийн uid болон gid нь тухайн контейнерийг эхлүүлсэн хэрэглэгчийн id-тэй таарч байгаа эсэхийг шалгах хэрэгтэй, эс тэгвээс контейнерийн үүсгэсэн файлууд root эрхээр үүсгэгдэх болно. Хэрэв би ашигладаг бол volume дараа нь өгөгдөл зүгээр л заримд нь үүсгэгдэх болно /usr/* мөн эхний тохиолдолтой адил uid болон gid-тай ижил түүх байх болно. Хэрэв та гуравдагч талын бүрэлдэхүүнийг ажиллуулж байгаа бол баримт бичгийг уншиж, "бүрэлдэхүүн нь аль контейнерийн лавлахуудад файл бичдэг вэ?" Гэсэн асуултын хариултыг хайх хэрэгтэй.

Би Докертой хэтэрхий удаан харьцах ёстой байсандаа үргэлж дургүй байсан эхний шатанд: Би чингэлэгүүдийг хэрхэн эхлүүлэх, ямар зургуудаас эхлүүлэхийг олж мэдсэн, урт Docker командуудын алиа нэрийг агуулсан Makefiles хийсэн. Би docker-compose-г үзэн яддаг байсан, учир нь би докерын экосистемд өөр хэрэгсэл сурахыг хүсээгүй. БА docker-compose up Тэр тусмаа тэд тэнд уулзсан хэвээр байгаа нь намайг зовоож байсан build аль хэдийн угсарсан зургуудаас илүүтэйгээр бүтээн байгуулалтууд. Миний үнэхээр хүсч байсан зүйл бол зүгээр л үр дүнтэй, хурдан бүтээгдэхүүн хийх явдал байв. Гэхдээ би докерыг хэрхэн ашиглахаа олж чадаагүй.

Ansible-г танилцуулж байна

Саяхан (гурван сарын өмнө) би бараг бүх гишүүн Докерт сөрөг ханддаг DevOps багтай ажилласан. Шалтгаанаар:

  • docker iptables-ийг удирддаг (хэдийгээр та үүнийг daemon.json дээр идэвхгүй болгож болно)
  • docker алдаатай тул бид үүнийг үйлдвэрлэлд ажиллуулахгүй
  • хэрэв докер демон гацвал дэд бүтэцтэй бүх контейнерууд зохих ёсоор унана
  • докер хэрэггүй
  • Хэрэв Ansible болон виртуал машин байгаа бол яагаад докер

Үүнтэй ижил ажил дээр би өөр хэрэгсэлтэй танилцсан - Ansible. Би энэ тухай нэг удаа сонссон ч өөрийнхөө тоглоомын ном бичих гэж оролдоогүй. Одоо би даалгавраа бичиж эхэлсэн бөгөөд дараа нь миний алсын хараа бүрэн өөрчлөгдсөн! Учир нь би ойлгосон: Ansible нь ижил докер контейнер, зураг бүтээх, сүлжээ гэх мэтийг ажиллуулах модулиудтай бөгөөд контейнеруудыг зөвхөн дотоодод төдийгүй алсын серверүүд дээр ажиллуулж болно! Миний баяр баясгалан хязгааргүй байсан - Би NORMAL хэрэгсэл олоод Makefile болон docker-compose файлуудаа хаясан тул тэдгээрийг yaml ажлуудаар сольсон. гэх мэт бүтцийг ашиглан кодыг багасгасан loop, whenГэх мэт

Мэдээллийн сан гэх мэт гуравдагч талын бүрэлдэхүүн хэсгүүдийг ажиллуулах Docker

Би саяхан ssh tunnel-тэй танилцсан. Алсын серверийн портыг дотоод порт руу "дамжуулах" нь маш хялбар юм. Алсын сервер нь үүлэн доторх машин эсвэл VirtualBox дээр ажилладаг виртуал машин байж болно. Хэрэв миний хамтрагч эсвэл надад мэдээллийн сан (эсвэл бусад гуравдагч талын бүрэлдэхүүн хэсэг) хэрэгтэй бол бид серверийг энэ бүрэлдэхүүнээр эхлүүлж, сервер шаардлагагүй үед унтрааж болно. Порт дамжуулалт нь докерын контейнерт ажиллаж байгаа өгөгдлийн сангийн адил үр нөлөөг өгдөг.

Энэ тушаал нь миний локал портыг postgresql ажиллаж байгаа алсын сервер рүү дамжуулдаг:

ssh -L 9000: localhost: 5432 [имэйлээр хамгаалагдсан]

Алсын сервер ашиглах нь баг хөгжүүлэх асуудлыг шийддэг. Ийм серверийг хэд хэдэн хөгжүүлэгчид нэгэн зэрэг ашиглах боломжтой бөгөөд тэд postgresql-ийг тохируулах, Docker болон бусад нарийн ширийн зүйлийг ойлгох шаардлагагүй болно. Алсын сервер дээр та тодорхой хувилбарыг суулгахад хэцүү бол Docker-д ижил мэдээллийн санг суулгаж болно. Хөгжүүлэгчид шаардлагатай бүх зүйл бол ssh хандалтыг хангах явдал юм!

Би саяхан SSH хонгилууд нь ердийн VPN-ийн хязгаарлагдмал ажиллагаа гэдгийг уншсан! Та зүгээр л OpenVPN эсвэл бусад VPN програмуудыг суулгаж, дэд бүтцийг тохируулж, хөгжүүлэгчдэд ашиглах боломжтой. Энэ их дажгүй юм!

Аз болоход, AWS, GoogleCloud болон бусад нь танд нэг жил үнэгүй ашиглах боломжийг олгож байгаа тул тэдгээрийг ашиглаарай! Ашиглаагүй үед унтраавал хямдхан болно. Яагаад надад gcloud шиг алсын сервер хэрэгтэй байна гэж би үргэлж боддог байсан, би тэднийг олсон юм шиг байна.

Орон нутгийн виртуал машины хувьд та докер контейнерт идэвхтэй ашигладаг ижил Альпийг ашиглаж болно. За, эсвэл машиныг хурдан ачаалах бусад хөнгөн хуваарилалт.

Доод шугам: та алсын сервер эсвэл виртуал хайрцагт мэдээллийн сан болон бусад дэд бүтцийн сайн зүйлсийг ажиллуулж болно. Эдгээр зорилгоор надад докер хэрэггүй.

Докерын зураг, түгээлтийн талаар бага зэрэг

Би аль хэдийн бичсэн нийтлэл Докерын дүрсийг ашиглах нь ямар ч баталгаа өгөхгүй гэдгийг хэлэхийг хүссэн. Докерын дүрс нь зөвхөн докерын контейнер үүсгэхэд л хэрэгтэй. Хэрэв та докерын дүрс рүү шинэчилж байгаа бол докерын контейнер ашиглахаар сайжруулж байгаа бөгөөд та зөвхөн тэдгээрийг ашиглах болно.

Програм хангамж хөгжүүлэгчид бүтээгдэхүүнээ зөвхөн докерын дүрсээр зөөдөг газрыг та харсан уу?
Ихэнх бүтээгдэхүүний үр дүн нь тодорхой платформд зориулсан хоёртын файлууд бөгөөд тэдгээрийг зүгээр л хүссэн платформоос өвлөн авсан докерын дүрс дээр нэмдэг. Та яагаад dockerhub дээр ийм олон зураг байдаг талаар бодож байсан уу? Жишээлбэл, nginx-г оруулаад өөр өөр хүмүүсийн 100500 зургийг харах болно. Эдгээр хүмүүс nginx-ийг өөрөө хөгжүүлээгүй бөгөөд зүгээр л өөрсдийн докерийн дүрс дээр албан ёсны nginx-г нэмж, контейнеруудыг ажиллуулахад хялбар болгох үүднээс өөрийн тохиргоогоор амталсан.

Ерөнхийдөө та үүнийг зүгээр л tgz-д хадгалах боломжтой, хэрэв хэн нэгэн үүнийг docker дээр ажиллуулах шаардлагатай бол Dockerfile-д tgz-г нэмж, хүссэн орчноосоо өвлөн авч, програмыг tgz-д өөрчилдөггүй нэмэлт бинк үүсгэж болно. Докерийн дүрсийг бүтээх хүн бүр tgz гэж юу болох, түүнд юу ажиллах шаардлагатайг мэдэх болно. Би docker-ийг ингэж ашигладаг энд

Доод шугам: Надад докерын бүртгэл хэрэггүй, би ямар нэгэн S3 эсвэл google drive/dropbox гэх мэт файл хадгалах сан ашиглах болно.

CI дахь Docker

Миний ажиллаж байсан бүх компаниуд ижил төстэй. Тэд ихэвчлэн хүнсний бүтээгдэхүүн байдаг. Өөрөөр хэлбэл, тэд нэг програм, нэг технологийн стектэй (хоёр эсвэл гурван програмчлалын хэл байж магадгүй).

Эдгээр компаниуд CI процесс ажилладаг сервер дээрээ docker ашигладаг. Асуулт: Та яагаад сервер дээрээ докерын контейнерт төсөл бүтээх хэрэгтэй байна вэ? Бүтээлт явагдах серверт nodejs, php, jdk, ssh товчлууруудыг хуулах гэх мэт шаардлагатай хувилбаруудыг суулгах Ansible playbook-г зүгээр л бүтээх орчинг бэлдэж яагаад болохгүй гэж?

Докер тусгаарласнаараа ямар ч ашиг авчирдаггүй тул энэ нь хөл рүүгээ буудаж байгааг би одоо ойлгож байна. Докер дээр CI-тэй холбоотой асуудлууд:

  • дахин бүтээхийн тулд танд докерын дүрс хэрэгтэй. Та зураг хайх эсвэл өөрийн dockerfile бичих хэрэгтэй.
  • 90% нь зарим ssh түлхүүрүүдийг дамжуулах шаардлагатай бөгөөд та докерын дүрс рүү бичихийг хүсэхгүй байгаа нууц өгөгдөл юм.
  • сав бий болж, үхэж, бүх кэш үүнтэй хамт алга болно. дараагийн бүтээц нь төслийн бүх хамаарлыг дахин татаж авах бөгөөд энэ нь цаг хугацаа их шаарддаг, үр дүнгүй, цаг хугацаа нь мөнгө юм.

Хөгжүүлэгчид докерын саванд төсөл барьдаггүй (би нэг удаа ийм шүтэн бишрэгч байсан, үнэхээр би өнгөрсөн хугацаанд өөрийгөө өрөвдөж байна xD). Java дээр хэд хэдэн хувилбартай байж, тэдгээрийг нэг командаар одоо хэрэгтэй зүйл рүү өөрчлөх боломжтой. Энэ нь nodejs дээр адилхан, nvm байдаг.

дүгнэлт

Докер бол маш хүчирхэг, уян хатан хэрэгсэл гэдэгт би итгэдэг, энэ бол түүний сул тал (хачин сонсогдож байна, тийм). Үүний тусламжтайгаар компаниуд үүнд амархан холбогдож, хэрэгцээтэй, шаардлагагүй газар ашиглах боломжтой. Хөгжүүлэгчид өөрсдийн контейнер, зарим орчныг ажиллуулж, дараа нь бүгд CI болон үйлдвэрлэл рүү жигд урсдаг. DevOps баг эдгээр контейнеруудыг ажиллуулахын тулд ямар нэгэн төрлийн код бичиж байна.

Зөвхөн докер дээр ашиглах хамгийн сүүлийн үеийн Ажлын урсгалын үе шат, эхэнд үүнийг төсөл рүү бүү чир. Энэ нь таны бизнесийн асуудлыг шийдэхгүй. Тэр зөвхөн асуудлыг ӨӨР түвшинд шилжүүлж, өөрийн шийдлийг санал болгох болно, та давхар ажил хийх болно.

Докер хэрэгтэй үед: Докер нь өгөгдсөн процессыг оновчтой болгоход маш сайн боловч үндсэн функцийг бий болгоход тийм ч сайн биш гэсэн дүгнэлтэд хүрсэн.

Хэрэв та docker ашиглахаар шийдсэн хэвээр байвал:

  • маш болгоомжтой байгаарай
  • Хөгжүүлэгчдийг докер ашиглахыг бүү албад
  • хэрэглээг нэг газар нутагшуулах, бүх Dockfile болон docker-compository-д тарааж болохгүй.

Жич:

Уншиж байгаад баярлалаа, ажил хэрэг дээрээ ил тод шийдвэр гаргаж, ажлын өдрүүдийг үр бүтээлтэй өнгөрүүлэхийг хүсэн ерөөе!

Эх сурвалж: www.habr.com

сэтгэгдэл нэмэх