6943

Гайд по Docker: концепція, устрій та принцип роботи

В останні роки ідеологія ІТ змістилася на користь контейнеризації. Щоб зрозуміти, що це таке, можна провести аналогію з реальним світом — розробники, як співробітники порту, упаковують програмне забезпечення в один контейнер, який згодом може «транспортуватися» на різні пристрої та розпаковуватись у готовий додаток, який не залежить від ОС та інших встановлених програм

Сьогодні одним із найбільш використовуваних інструментів контейнеризації є Docker. Понад те, з його допомогою навіть вибудовують повноцінні серверні інфраструктури. Як правило, він використовується спільно з оркестраторами, наприклад, як Kubernetes і OpenShift, які допомагають більш гнучко і ефективно керувати великими ресурсами.

Що таке Docker

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

Запакований у контейнер додаток повністю ізолюється від ОС та сторонніх програм, завдяки чому розробники можуть не дбати про те, в якому оточенні працюватиме проект та його системні залежності.

Docker з'явився на ринку ще в 2008 році, і спочатку був внутрішнім проектом компанії dotCloud, яка пізніше була перейменована в Docker Inc. Починаючи з 2013 року, Docker вихідний код інструменту був відкритий для спільноти.

У ранніх версіях Docker був лише вдосконаленою обгорткою для LXC. З 2015 року він почав використовувати власну бібліотеку libcontainer, яка абстрагує віртуалізаційні можливості ядра Linux, що дозволило йому стати повністю самостійною технологією. Переклад на libcontainer був не випадковим, адже LXC не могла забезпечити достатню гнучкість та керованість контейнерів.

На хвилі популярності DevOps Docker потрапив у справжній мейнстрім і завдяки підтримці величезної спільноти продовжує постійно зростати і розвиватися.

Як влаштований Docker, та принципи його роботи

За промовчанням Docker постачається з такими компонентами:

  • Docker host – власна операційна система Docker, на яку він встановлюється.
  • Docker daemon — спеціальна служба, яка використовується для керування різними об'єктами Docker, такими як мережі, сховища, образи та контейнери.
  • Docker image – образ, який використовується для виконання коду у контейнері Docker.
  • Docker Registry – репозиторій для зберігання образів.
  • Docker client — клієнт, який забезпечує взаємодію користувачів зі службою Docker Daemon. Коли ви створюєте потрібну команду,
  • Docker client відправляє її до dockerd, який її виконує.
  • Docker container — віртуальне середовище виконання, де користувач може ізолювати програмне забезпечення від хостової системи.
  • Dockerfile - файл з інструкцією зі створення образу.
  • Docker Compose - інструмент, що забезпечує ефективне керування кількома контейнерами. З його допомогою можна створювати нові контейнери та задавати їм необхідну конфігурацію.

  • Docker Desktop — клієнт користувача, який дає можливість працювати з Docker в середовищах Mac або Windows. З його допомогою можна створювати та спільно використовувати різні контейнерні програми та мікросервіси.

Спочатку Docker створювався під операційну систему Linux. Для роботи на Windows і macOS потрібно запускати віртуальну машину з Linux, вже поверх неї сам Docker. Для цього у Windows використовується Hyper-V, а в macOS - VirtualBox.

При цьому варто враховувати, що працюючи поверх віртуалок, ви істотно підвищуєте споживання ресурсів, а отже в Windows і macOS Docker працює не так швидко і з деякими обмеженнями. Загалом для розробки з цими мінусами можна змиритися, але в бойових умовах краще використовувати Linux.

Віртуалізація та контейнеризація — у чому відмінність

Контейнери та віртуальні машини – це два різні способи візуалізації. У віртуалці вона реалізується лише на рівні заліза, а Docker — лише на рівні ОС. Давайте розберемося у цих поняттях трохи докладніше.

По суті, віртуальна машина є повноцінним комп'ютером з окремим обладнанням та операційною системою. Існує навіть поширена практика, коли на один великий сервер встановлюється гіпервізор, що є базою для віртуалок. Таким чином, він буквально «нарізається» на кілька віртуальних комп'ютерів, завдяки чому зникає необхідність купувати багато окремих ПК.

Такі віртуальні комп'ютери цілком повноцінні та самостійні. На кожен із них можна встановити власну операційну систему, причому не завжди однакову — наприклад, на одному може стояти Linux, інший Windows. Далі, для встановлення та запуску безлічі програм можна використовувати GUI-клієнт у розрахованому на багато користувачів режимі.

Щодо Docker, то його основна мета — створити середовище для роботи лише однієї програми. Для цього йому не потрібно займатися повним відтворенням комп'ютера. Натомість він запускається поверх функціонуючої операційної системи та використовує її ресурси. Завдяки цьому контейнери Docker швидше розгортаються, займають менше пам'яті і простіше масштабуються.

Зрозуміло, з технічного погляду можна виділити під додаток і цілу віртуалку, окремо налаштувати операційну систему та надати права доступу. Однак на практиці це розпалювати вогонь доларами — занадто дорого і не має жодного сенсу. У більшості випадків для повноцінної роботи програми буде цілком достатньо звичайного оточення, яким і є контейнер.

Окремо варто сказати, що віртуальні машини не найкраще поєднуються з Docker. Іноді при розробці ПЗ сервер дійсно нарізають на віртуалки, і вже в них запускають контейнери, але в такому випадку потрібно бути готовими до надмірної витрати ресурсів, спричиненої подвійною візуалізацією. Якщо такий підхід все ж таки необхідний, то краще замість гіпервізора використовувати Kubernetes, який дозволить встановлювати програми прямо на залізо.

Також Docker можна поставити на віртуальну машину у випадку, якщо ресурсів достатньо і потрібно просто ізолювати програми один від одного.

Сутності Docker

Docker здатний працювати з кількома сутностями. Розберемо кожну з них докладніше:

  • Docker зображення. Фактично це шаблон, з допомогою якого створюються контейнери. Він працює за принципом шарів: файлова система накладається поверх шару основної ОС, і в результаті виходить незмінний образ, в який можна встановити сам додаток з усіма залежностями та конфігураціями. При цьому образи можуть успадковуватися. Це означає, що якщо ми покладемо поверх ще один шар файлів і закомтіті, то на виході отримаємо ще один незмінний образ.
  • Dockerfile. Тут знаходяться інструкції зі збирання образів, в яких докладно описано який базовий образ використовувати, які файли і куди помістити, та інше.
  • Контейнер. Являє собою runtime-сутність на основі образу. Якщо провести аналогію, то образ це інсталятор програмного забезпечення, а контейнер вже запущене ПЗ. Розгортаючи контейнер поверх файлової системи ми отримаємо ще один шар, куди додаток зможе записувати дані і редагувати їх. У разі видалення контейнера всі дані в ньому стираються, проте їх можна зберегти за допомогою volumes.
  • Docker Registry. Це система зберігання та розповсюдження Docker-образів, яка може бути як локальною, так і публічною. Вона знаходиться в репозиторії Docker і може містити всі версії певного образу, які ідентифікуються за допомогою системи тегів.

У чому користь Docker на практиці

Опишемо кілька варіантів використання Docker на практиці, які добре відбивають його сильні сторони.

Створення додатків із залежностями

Найчастіше, для встановлення будь-якої бібліотеки або бази даних, розробнику доводиться вивчати інструкцію на сайті, потім він її завантажує, інсталює та виконує конфігурацію. Коли потрібно перейти на іншу залежність, поточна бібліотека видаляється, і весь процес починається заново. У результаті працювати з кожною залежністю доводиться витрачати чимало часу.

Docker пропонує альтернативний, більш простий шлях. Компанії-постачальники бібліотек, фреймворків та баз даних регулярно розміщують свій софт на Docker Hub у форматі Docker image. Образ можна швидко завантажити і розгорнути через Docker, а коли потреба в ньому пропаде - видалити, не залишивши сліду в операційній системі.

Тобто, Docker фактично надає єдиний інтерфейс управління, і розробникам не потрібно розумітися на особливостях індивідуальних команд для кожної бібліотеки. Натомість достатньо вивчити команди Docker: для скачування образів, запуску контейнерів та роботи з портами.

Використовуючи Docker, розробники можуть запустити необмежену кількість баз даних в одній операційній системі. Навіть якщо щось піде не так, завдяки повній ізоляції помилки не торкнуться роботи основної ОС і торкнуться виключно контейнера.

Автоматизація тестування

Для запуску автоматизованих тестів потрібні певні залежності, такі як бази даних, брокери повідомлень та інше. Всі вони встановлюються і налаштовуються на сервері збирання ще до початку тестування, і на цьому етапі часто виникають труднощі. Наприклад, якщо якась деталь буде втрачена, існує великий ризик щось «зламати» в ОС або зіпсувати дані. В цьому випадку буде куди безпечніше розгортати залежності у вигляді контейнера безпосередньо на сервері. Таким чином можна швидко виконати тести, а потім повністю видалити контейнери, не залишивши сліду в самій операційній системі.

В результаті, навіть якщо щось піде не так і тести зламають дані, всі вони будуть видалені разом з контейнером. До того ж, завдяки контейнеризації на сервері можна буде запускати буквально все, що завгодно, що зробить його більш універсальним, а отже можна заощадити час на налаштуванні системи.

Публікація програми

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

Docker робить середовище деплою більш універсальним. Фактично, SRE завжди буде мати справу виключно з контейнерами, які можна розгортати і одноманітно оновлювати за допомогою тих самих команд, навіть незважаючи на те, що всередині можуть знаходитися зовсім різні програми.

Недоліки Docker

Як відомо, ідеального нічого не буває, і поряд з перевагами кожна технологія має свої недоліки. Ось мінуси Docker:

  • Велике споживання ресурсів. Docker створює прошарок між основною операційною системою та програмою, яка споживає додаткові ресурси. Тому часто доводиться вибирати між зручністю та зайвою витратою ресурсів заліза. Якщо потужність пристрою невисока, краще віддати перевагу традиційній схемі установки додатків.
  • Необхідність у оркестраторі. У базовій поставці Docker Compose є механізм, що дозволяє керувати запуском кількох контейнерів за допомогою конфігураційного файлу YAML.

До якогось ліміту його достатньо, але додаток, до якого включено 50-100 різних сервісів, він просто не потягне. У таких випадках доводиться додатково використовувати оркестратори, наприклад, такі як Kubernetes. Він є потужним шаром абстракцій, і практично виконує роль гіпервізора у віртуалках.

  • Проблеми з використанням на Windows та macOS. Як уже говорилося вище, Docker був створений спеціально під Linux, через що під час роботи в інших ОС може мати обмежений функціонал. Наприклад, на Windows та macOS він не підтримує деякі типи мереж. Найчастіше цей нюанс залишається непоміченим, але під час роботи потрібно завжди тримати його в голові. Крім того, при установці на Windows, на деяких пристроїв Docker може конфліктувати з Virtual Box.