Разбиране на Docker

Вече няколко месеца използвам docker за организиране на процеса на разработка/доставка на уеб проекти. Предлагам на читателите на «Хабрахабра» превод на въведението в статията за docker — «Разбиране на docker».

Какво е docker?

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

В основата си docker позволява стартиране на практически всяко приложение, безопасно изолирано в контейнер. Безопасната изолация ви позволява да стартирате много контейнери едновременно на един хост. Леката природа на контейнера, който работи без допълнително натоварване от хипервизор, ви позволява да извлечете повече от вашето оборудване.

Платформата и инструментите за контейнерна виртуализация могат да бъдат полезни в следните случаи:

  • опаковане на вашето приложение (и неговите компоненти) в docker контейнери;
  • разпространение и доставка на тези контейнери на вашите екипи за разработка и тестване;
  • разгръщане на тези контейнери в производствени среди, включително в дата центрове и облаци.

За какво мога да използвам docker?

Бързо разгръщане на вашите приложения

Docker е идеален за организиране на цикъла на разработка. Docker позволява на разработчиците да използват локални контейнери с приложения и услуги. Това впоследствие улеснява интегрирането в процеса на непрекъсната интеграция и разгръщане (continuous integration and deployment workflow).

Например, вашите разработчици пишат код локално и споделят своя стек за разработка (набор от docker образи) с колегите си. Когато са готови, изпращат кода и контейнерите на тестовата среда и стартират необходимите тестове. От тестовата среда те могат да изпратят кода и образите в производствената среда.

По-просто разгръщане и внедряване

Платформата, основана на контейнери Docker, улеснява преноса на вашето натоварване. Docker контейнерите могат да работят както на локалната ви машина, така и на виртуална машина в дата център, или в облака.

Преносимостта и леката природа на Docker позволяват лесното динамично управление на вашето натоварване. Можете да използвате Docker, за да внедрите или да спирате приложението или услугите си. Скоростта на Docker позволява да се прави това почти в реално време.

Високи натоварвания и повече полезни натоварвания

Docker е лек и бърз. Той предлага устойчива, рентабилна алтернатива на виртуалните машини, основани на хипервизор. Особено полезен е в условия на високи натоварвания, например при изграждане на собствено облако или платформа като услуга (Platform-as-a-Service). Но също така е полезен и за малки и средни приложения, когато искате да извлечете повече от наличните ресурси.

Основни компоненти на Docker

Docker се състои от две основни компоненти:

  • Docker: платформа за виртуализация с отворен код;
  • Docker Hub: нашата платформа като услуга за разпространение и управление на Docker контейнерите.

Забележка! Docker се разпространява по лицензія Apache 2.0.

Архитектура на Docker

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

Разбиране на Docker

Docker демон

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

Docker клиент

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

Вътре в Docker

За да разберете от какво се състои Docker, трябва да знаете за трите компонента:

  • образи (images)
  • регистри (registries)
  • контейнери

Образи

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

Регистър

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

Контейнери

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

Как работи Docker?

Досега знаем, че:

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

Нека видим как тези компоненти се съчетават.

Как работи образът?

Вече знаем, че образът е шаблон само за четене, от който се създава контейнер. Всеки образ се състои от набор от слоеве. Docker използва union file system за комбиниране на тези слоеве в един образ. Union file system позволява файловете и директориите от различни файлови системи (различни клони) да се наслагват прозрачно, създавайки последователна файлова система.

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

В основата на всеки образ стои основен образ. Например, ubuntu, основен образ на Ubuntu, или fedora, основен образ на дистрибуцията Fedora. Също така можете да използвате образи като основа за създаване на нови образи. Например, ако имате образ apache, можете да го използвате като основен образ за вашите уеб приложения.

Забележка! Docker обикновено изтегля образи от регистъра Docker Hub.

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

  • стартиране на команда
  • добавяне на файл или директория
  • създаване на променлива на околната среда
  • указания какво да се стартира, когато се стартира контейнерът на този образ

Тези инструкции се съхраняват в файл Dockerfile. Docker чете това Dockerfile, когато събирате образ, изпълнява тези инструкции и връща крайния образ.

Как работи docker регистърът?

Регистърът е хранилище на docker образи. След създаването на образ можете да го публикувате на публичния регистър Docker Hub или на вашия личен регистър.

С помощта на docker клиента можете да търсите вече публикувани образи и да ги изтеглите на вашата машина с docker за създаване на контейнери.

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

Как работи контейнерът?

Контейнерът се състои от операционна система, потребителски файлове и метаданни. Както знаем, всеки контейнер се създава от образ. Този образ казва на docker какво се намира в контейнера, какъв процес да стартира, когато контейнерът се стартира, и други конфигурационни данни. Docker образът е само за четене. Когато docker стартира контейнер, той създава слой за четене/пиша отгоре на образа (използвайки union file system, както беше споменато по-рано), в който може да бъде стартирано приложение.

Какво се случва, когато контейнерът стартира?

Или с помощта на програма docker, или с помощта на RESTful API, docker клиентът казва на docker демона да стартира контейнера.

$ sudo docker run -i -t ubuntu /bin/bash

Нека разгледаме тази команда. Клиентът се стартира с помощта на команда docker, с опцията run, която казва, че ще бъде пуснат нов контейнер. Минималните изисквания за стартиране на контейнера са следните атрибути:

  • кой образ да се използва за създаване на контейнера. В нашия случай ubuntu
  • командата, която искате да стартирате, когато контейнерът бъде стартиран. В нашия случай /bin/bash

Какво се случва зад кулисите, когато стартираме тази команда?

Docker последователно прави следното:

  • изтегля образа ubuntu: docker проверява наличието на образа ubuntu на локалната машина, и ако го няма — го изтегля от Docker Hub. Ако образът вече е наличен, той се използва за създаване на контейнера;
  • създава контейнер: когато образът бъде получен, docker го използва за създаване на контейнера;
  • инициализира файловата система и монтира read-only ниво: контейнерът е създаден във файловата система и е добавено read-only ниво от образа;
  • инициализира мрежа/мост: създава мрежови интерфейс, който позволява на docker да комуникира с хост машината;
  • Настройка на IP адрес: намира и задава адрес;
  • Стартира указаното процес: стартира вашето приложение;
  • Обработва и извежда изхода на вашето приложение: свързва и записва стандартния вход, изход и поток на грешки на вашето приложение, за да можете да наблюдавате как работи то.

Сега имате работещ контейнер. Можете да управлявате контейнера си, да взаимодействате с приложението си. Когато решите да спрете приложението, премахнете контейнера.

Използвани технологии

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

Пространства на имената (namespaces)

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

Това създава изолиран слой, всеки аспект на контейнера работи в собственото си пространство на имената и няма достъп до външната система.

Списък на някои от пространствата на имената, които използва docker:

  • pid: за изолация на процеса;
  • net: за управление на мрежовите интерфейси;
  • ipc: за управление на IPC ресурсите. (ICP: InterProcess Communication);
  • mnt: за управление на точките на монтиране;
  • utc: за изолиране на ядрото и контролиране на генерирането на версии (UTC: Unix timesharing system).

Контролни групи (Control groups)

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

Съюзен файлов система

Union File Sysem или UnionFS — това е файловата система, която работи, създавайки слоеве, което я прави много лека и бърза. Docker използва UnionFS за създаване на блоковете, от които се изгражда контейнерът. Docker може да използва няколко варианта на UnionFS, включително: AUFS, btrfs, vfs и DeviceMapper.

Формати на контейнерите

Docker комбинира тези компоненти в пакет, който наричаме формат на контейнера. Форматът, използван по подразбиране, се нарича libcontainer. Също така, docker поддържа традиционния формат на контейнерите в Linux с помощта на LXC. В бъдеще е възможно Docker да поддържа и други формати на контейнерите. Например, интегрирайки се с BSD Jails или Solaris Zones.

Източник: habr.com

Купете надежден хостинг за сайтове с защита от DDoS, VPS VDS сървъри 🔥 Купете надежден хостинг за сайтове с защита от DDoS, VPS VDS сървъри | ProHoster