Какво е Docker? Искрата за революцията на контейнерите

Docker е софтуерна платформа за изграждане на приложения, базирани на контейнери - малки и леки среди за изпълнение, които използват споделено ядрото на операционната система, но иначе се изпълняват изолирано една от друга. Въпреки че контейнерите като концепция съществуват от известно време, Docker, проект с отворен код, стартиран през 2013 г., спомогна за популяризирането на технологията и спомогна за насочването на тенденцията към контейнеризиране и микроуслуги  в разработването на софтуер, която стана известна като облачна развитие.

Какво представляват контейнерите?

Една от целите на съвременното разработване на софтуер е да държи приложенията на един и същ хост или клъстер изолирани един от друг, за да не си пречат неправомерно работата или поддръжката. Това може да бъде трудно благодарение на пакетите, библиотеките и други софтуерни компоненти, необходими за тяхното стартиране. Едно от решенията на този проблем са виртуалните машини, които поддържат приложенията на един и същ хардуер напълно отделни и намаляват до минимум конфликтите между софтуерните компоненти и конкуренцията за хардуерни ресурси. Но виртуалните машини са обемисти - всяка се нуждае от собствена операционна система, така че обикновено е с размер на гигабайта - и е трудно да се поддържа и надгражда.

Контейнерите , напротив, изолират изпълняващите среди на приложенията един от друг, но споделят основното ядро ​​на ОС. Те обикновено се измерват в мегабайта, използват много по-малко ресурси от виртуалните машини и стартират почти веднага. Те могат да бъдат опаковани много по-плътно на един и същ хардуер и да се въртят масово нагоре и надолу с много по-малко усилия и режийни разходи. Контейнерите осигуряват високоефективен и гранулиран механизъм за комбиниране на софтуерни компоненти във видовете стекове за приложения и услуги, необходими в съвременното предприятие, и за поддържане на тези софтуерни компоненти актуализирани и поддържани.

Докер

Какво е Docker?

Docker е проект с отворен код, който улеснява създаването на контейнери и базирани на контейнери приложения. Първоначално създаден за Linux, Docker сега работи и на Windows и MacOS. За да разберем как работи Docker, нека разгледаме някои от компонентите, които бихте използвали за създаване на приложения, контейнеризирани от Docker.

Докер файл

Всеки контейнер на Docker започва с Dockerfile . Dockerfile е текстов файл, написан с лесен за разбиране синтаксис, който включва инструкциите за изграждане на образ на Docker (повече за това след малко). Докерфайл определя операционната система, която ще лежи в основата на контейнера, заедно с езиците, променливите на околната среда, местоположенията на файловете, мрежовите портове и други компоненти, от които се нуждае - и, разбира се, какво всъщност ще прави контейнерът, след като го стартираме.

Пейдж Niedringhaus в ITNext има добра разбивка на синтаксиса на Dockerfile.

Изображение на докер

След като напишете вашия Dockerfile, вие извиквате buildпомощната програма Docker , за да създадете изображение въз основа на този Dockerfile. Докато Dockerfile е набор от инструкции, който казва buildкак да се направи изображението, Docker изображението е преносим файл, съдържащ спецификациите за кои софтуерни компоненти ще работи контейнера и как. Тъй като Dockerfile вероятно ще включва инструкции за извличане на някои софтуерни пакети от онлайн хранилища, трябва да се погрижите изрично да посочите правилните версии, в противен случай вашият Dockerfile може да създаде непоследователни изображения в зависимост от това кога е извикан. Но след като изображението е създадено, то е статично. Codefresh предлага поглед към това как да изградите изображение по-подробно.

Докер бягай

runПомощната програма на Docker е командата, която всъщност стартира контейнер. Всеки контейнер е екземпляр на изображение. Контейнерите са проектирани да бъдат преходни и временни, но те могат да бъдат спрени и рестартирани, което извежда контейнера в същото състояние, когато е бил спрян. Освен това могат да се изпълняват едновременно множество копия на едно и също изображение (стига всеки контейнер да има уникално име). Прегледът на кода има чудесна разбивка на различните опции за runкомандата, за да ви даде представа за това как работи.

Docker Hub

Въпреки че изграждането на контейнери е лесно, не си давайте идеята, че ще трябва да изградите всеки един от вашите изображения от нулата. Docker Hub е хранилище на SaaS за споделяне и управление на контейнери, където ще намерите официални Docker изображения от проекти с отворен код и доставчици на софтуер и неофициални изображения от широката публика. Можете да изтеглите контейнерни изображения, съдържащи полезен код, или да качите свой собствен, да ги споделите открито или вместо това да ги направите частни. Можете също така да създадете локален регистър на Docker, ако предпочитате. (Docker Hub в миналото е имал проблеми с изображения, качени с вградени в тях задни врати.)

Докер двигател

Docker Engine е ядрото на Docker, основната технология клиент-сървър, която създава и управлява контейнерите. Най-общо казано, когато някой казва Docker общо и не говори за компанията или цялостния проект, той има предвид Docker Engine. Предлагат се две различни версии на Docker Engine: Docker Engine Enterprise и Docker Engine Community.

Docker Community Edition

Docker пусна своето Enterprise Edition през 2017 г., но оригиналното му предложение, преименувано на Docker Community Edition, остава с отворен код и безплатно и не загуби никакви функции в процеса. Вместо това Enterprise Edition, което струва 1500 $ на възел годишно, добави разширени функции за управление, включително контроли за управление на клъстери и изображения и мониторинг на уязвимостите. Блогът BoxBoat съдържа обобщение на разликите между изданията.

Как Docker завладя света на контейнерите

Идеята, че даден процес може да се изпълнява с известна степен на изолация от останалата част от операционната му среда, е вградена в операционни системи Unix като BSD и Solaris от десетилетия. Оригиналната технология за контейнери на Linux, LXC, е метод за виртуализация на ниво OS за стартиране на множество изолирани Linux системи на един хост. LXC стана възможно благодарение на две функции на Linux: пространства от имена, които обгръщат набор от системни ресурси и ги представят на процес, за да изглежда, че са посветени на този процес; и cgroups, които управляват изолирането и използването на системни ресурси, като CPU и памет, за група процеси.

Контейнерите отделят приложенията от операционните системи, което означава, че потребителите могат да имат чиста и минимална операционна система Linux и да изпълняват всичко останало в един или повече изолирани контейнери. И тъй като операционната система е абстрахирана далеч от контейнери, можете да преместите контейнер през всеки Linux сървър, който поддържа среда на изпълнение на контейнера.

Docker въведе няколко значителни промени в LXC, които правят контейнерите по-преносими и гъвкави за използване. Използвайки контейнери на Docker, можете да разположите, репликирате, преместите и архивирате работно натоварване дори по-бързо и лесно, отколкото можете да го направите с помощта на виртуални машини. Docker носи подобна на облак гъвкавост във всяка инфраструктура, способна да изпълнява контейнери. Инструментите за изображения на контейнери на Docker също са напредък спрямо LXC, позволявайки на разработчика да изгражда библиотеки с изображения, да композира приложения от множество изображения и да стартира тези контейнери и приложения на локална или отдалечена инфраструктура.

Docker Compose, Docker Swarm и Kubernetes

Docker също така улеснява координирането на поведението между контейнери и по този начин изгражда стекове на приложения, като свързва контейнери заедно. Docker Compose е създаден от Docker, за да опрости процеса на разработване и тестване на многоконтейнерни приложения. Това е инструмент за команден ред, напомнящ на клиента на Docker, който взима специално форматиран дескрипторен файл, за да събере приложения от множество контейнери и да ги стартира съвместно на един хост. (Вижте урока на Docker Compose, за да научите повече.)

По-усъвършенствани версии на това поведение - това, което се нарича оркестрация на контейнери - се предлагат от други продукти, като Docker Swarm и Kubernetes. Но Docker предоставя основите. Въпреки че Swarm израсна от проекта Docker, Kubernetes се превърна в де факто платформата за оркестрация на Docker по избор.

Предимства на Docker

Docker контейнерите осигуряват начин за изграждане на корпоративни и бизнес приложения, които са по-лесни за сглобяване, поддръжка и придвижване в сравнение с конвенционалните им колеги. 

Докер контейнерите позволяват изолиране и регулиране

Docker контейнерите държат приложенията изолирани не само един от друг, но и от основната система. Това не само прави по-чист софтуерен стек, но улеснява диктуването как дадено контейнеризирано приложение използва системни ресурси - CPU, GPU, памет, I / O, мрежи и т.н. Това също улеснява гарантирането, че данните и кода се пазят отделно. (Вижте „Докер контейнерите са без гражданство и неизменни“, по-долу.)

Docker контейнерите позволяват преносимост

Контейнерът на Docker работи на всяка машина, която поддържа средата на изпълнение на контейнера. Приложенията не трябва да бъдат обвързани с хост операционната система, така че както средата на приложението, така и основната операционна среда могат да се поддържат чисти и минимални.

Например контейнер MySQL за Linux ще работи на повечето Linux системи, които поддържат контейнери. Всички зависимости за приложението обикновено се доставят в един и същ контейнер.

Приложенията, базирани на контейнери, могат лесно да бъдат премествани от локални системи към облачни среди или от лаптопи на разработчици към сървъри, стига целевата система да поддържа Docker и някой от инструментите на трети страни, които може да се използват с него, като например Kubernetes (вижте „Докер контейнерите улесняват оркестрацията и мащабирането“, по-долу).

Обикновено изображенията на контейнери на Docker трябва да бъдат изградени за определена платформа. Контейнерът на Windows, например, няма да работи на Linux и обратно. Преди това един от начините за това ограничение беше стартирането на виртуална машина, която изпълняваше екземпляр на необходимата операционна система, и стартирането на контейнера във виртуалната машина.

Оттогава екипът на Docker създава по-елегантно решение, наречено  манифести , което позволява изображенията за множество операционни системи да бъдат пакетирани едно до друго в едно и също изображение. Манифестите все още се считат за експериментални, но те намекват как контейнерите могат да се превърнат в решение за приложения на различни платформи, както и в решение за различни среди. 

Докер контейнерите позволяват възможност за композиране

Повечето бизнес приложения се състоят от няколко отделни компонента, организирани в стека - уеб сървър, база данни, кеш в паметта. Контейнерите правят възможно съставянето на тези парчета във функционална единица с лесно сменяеми части. Всяко парче се предоставя от различен контейнер и може да бъде поддържано, актуализирано, заменено и модифицирано независимо от останалите.

Това е по същество моделът на микроуслугите за проектиране на приложения. Чрез разделяне на функционалността на приложението на отделни, самостоятелни услуги, моделът на микроуслугите предлага противоотрова за забавяне на традиционните процеси на разработка и негъвкави монолитни приложения. Леките и преносими контейнери улесняват изграждането и поддържането на приложения, базирани на микроуслуги.

Докер контейнерите улесняват оркестрацията и мащабирането

Тъй като контейнерите са леки и налагат малко повече разходи, възможно е да стартирате много повече от тях в дадена система. Но контейнерите могат да се използват и за мащабиране на приложение в клъстери от системи и за увеличаване на услугите нагоре или надолу, за да се отговори на скоковете в търсенето или да се спестят ресурси.

Най-корпоративните версии на инструментите за разполагане, управление и мащабиране на контейнери се предоставят чрез проекти на трети страни. Главен сред тях е Kubernetes на Google, система за автоматизиране на начина на разполагане и мащабиране на контейнерите, но също така и как те са свързани заедно, балансирани натоварване и управлявани. Kubernetes също така предоставя начини за създаване и повторно използване на дефиниции на приложения с няколко контейнера или „Helm charts“, така че сложни стекове от приложения могат да бъдат изградени и управлявани при поискване.

Docker включва и собствена вградена система за оркестрация, режим Swarm, който все още се използва за случаи, които са по-малко взискателни. Въпреки това Kubernetes се превърна в нещо по избор по подразбиране; всъщност Kubernetes е в комплект с Docker Enterprise Edition.

Докер предупреждения

Контейнерите решават много проблеми, но не са излекувани. Някои от недостатъците им са по дизайн, докато други са странични продукти от техния дизайн.

Docker контейнерите не са виртуални машини

Най-честата концептуална грешка, която хората правят с контейнери, е да ги приравнява с виртуални машини. Тъй като обаче контейнерите и виртуалните машини използват различни изолиращи механизми, те имат значително различни предимства и недостатъци.

Виртуалните машини осигуряват висока степен на изолация на процесите, тъй като те се изпълняват в собствен екземпляр на операционна система. Тази операционна система също не трябва да бъде същата като тази, изпълнявана на хоста. Виртуалната машина на Windows може да работи на Linux хипервизор и обратно.

Контейнерите, за разлика от тях, използват контролирани части от ресурсите на операционната система на хоста; много приложения споделят едно и също ядро ​​на ОС, по силно управляван начин. В резултат на това приложенията в контейнери не са толкова старателно изолирани, колкото виртуалните машини, но осигуряват достатъчно изолация за по-голямата част от натоварванията.

Докер контейнерите не осигуряват скорост на гол метал