Разбиране на 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 е лек и бърз. Той предоставя устойчива, рентабилна алтернатива на виртуалните машини на базата на хипервизор. Особено полезен е в условия на високи натоварвания, например, при създаването на собствено облако или платформа като услуга. Но е също така полезен за малки и средни приложения, когато искате да извлечете повече от наличните ресурси.

Основни компоненти на 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 образът е шаблон с read-only статус. Например, образът може да съдържа операционна система Ubuntu с Apache и приложение. Образите се използват за създаване на контейнери. Docker позволява лесно създаване на нови образи, обновяване на съществуващи, или можете да изтеглите образи, създадени от други хора. Образите са компоненти на Docker.

Регистър

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

Контейнери

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

Как работи Docker?

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

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

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

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

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

Една от причините, поради която 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 ресурси. (IPC: InterProcess Communication);
  • mnt: за управление на точки на монтаж;
  • utc: за изолиране на ядрото и контролиране на генерацията на версии (UTC: Unix timesharing system).

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

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

Union File System

Union File System или 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