You are on page 1of 41

ІНСТИТУТ СПЕЦІАЛЬНОГО ЗВ’ЯЗКУ ТА ЗАХИСТУ ІНФОРМАЦІЇ

НАЦІОНАЛЬНОГО ТЕХНІЧНОГО УНІВЕРСИТЕТУ УКРАЇНИ


«КИЇВСЬКИЙ ПОЛІТЕХНІЧНИЙ ІНСТИТУТ ІМЕНІ ІГОРЯ СІКОРСЬКОГО»
Спеціальна кафедра №1

КУРСОВА РОБОТА
з дисципліни: «Кібернетична безпека»
на тему: «Керування процесами в ОС Linux. Обмеження ресурсів»

Виконала:
курсант С-62 групи
сол. Томляк В.В.

Перевірив:
майор Сторчак А.С.

Київ
2018
ЗМІСТ
ВСТУП…………………………………………………………………………..……3

РОЗДІЛ І. ТЕХНОЛОГІЇ КОНТЕЙНЕРИЗАЦІЇ……………..………………..…...5

1.1 Контейнеризація – сутність, основні функції…………………………...5


1.2 Технології ізольованого середовища. Chroot; namespases; cgroups…....9
1.3 Технологія контейнеризації LXC………………………………………14

РОЗДІЛ ІІ. ТЕХНОЛОГІЯ КОНТЕЙНЕРИЗАЦІЇ DOCKER……………...........17

2.1 Технологія Docker – суність, основні функції………………………..17

2.2 Архітектура Docker……………………………………………………...18

2.3 Принцип роботи Docker ………………………………………………..22

2.4 Сервіси та технології Docker……………………………………………23

РОЗДІЛ ІІІ. ПРАКТИЧНЕ ВИКОНАННЯ ЗАВДАННЯ РЕАЛІЗАЦІЇ


DOCKER…………………………………………………………………………….26

ВИСНОВОК………………………………………………………….………..........40

СПИСОК ВИКОРИСТАНИХ ДЖЕРЕЛ………………………………….………41

ВСТУП
2
Docker - це платформа для розробників і системних адміністраторів для
розробки, розгортання і запуску додатків з контейнерами. Використання
контейнерів Linux для розгортання додатків називається контейнеризацией.
Контейнери не нові, але їх використання для легкого розгортання додатків. [14]

Контейнеризація стає все більш популярною, тому що контейнери:

 Гнучкі: навіть найскладніші додатки можуть бути упаковані в


контейнери.
 Легкі: контейнери використовують і поділяють ядро хоста.
 Взаємозамінні: ви можете розгортати оновлення та оновлення на льоту.
 Переносимість: ви можете створювати локально, розгортати в хмарі і
працювати де завгодно.

 Масштабованість: Ви можете збільшувати і автоматично розподіляти


репліки контейнера.
 Стекові: ви можете розміщувати сервіси вертикально і на льоту.
Docker прекрасно підходить для організації циклу розробки. Docker
дозволяє розробникам використовувати локальні контейнери з додатками і
сервісами. Що надалі дозволяє інтегруватися з процесом постійної інтеграції та
викладання (continuous integration and deployment workflow). [12]
Наприклад, ваші розробники пишуть код локально і діляться своїм
стеком розробки (набором docker образів) з колегами. Коли вони готові,
отруюють код і контейнери на тестову площадку і запускають будь-які
необхідні тести. З тестового майданчика вони можуть облямувати код і образи
на продакшен.
Заснована на контейнерах docker платформа дозволять легко перенести вашу
корисне навантаження. Docker контейнери можуть працювати на вашій
локальній машині, як реальної так і на віртуальній машині в дата центрі, так і в
хмарі.

3
Портування і легка природа docker дозволяє легко динамічно управляти
вашої навантаженням. Ви можете використовувати docker, щоб розгорнути або
погасити ваш додаток або сервіси. Швидкість docker дозволяє робити це майже
в режимі реального часу. [13]

4
РОЗДІЛ І. ТЕХНОЛОГІЇ КОНТЕЙНЕРИЗАЦІЇ

1.1 Контейнеризація – сутність, основні функції

Контейнеризація - це легка віртуалізація і ізоляція ресурсів на рівні


операційної системи, яка дозволяє запускати додаток і необхідний йому
мінімум системних бібліотек в повністю стандартизованном контейнері, що
з'єднують з хостом або чим-небудь зовнішнім по відношенню до нього за
допомогою певних інтерфейсів. Контейнер не залежить від ресурсів або
архітектури хоста, на якому він працює. [1]
Всі компоненти, необхідні для запуску програми, упаковуються як один
образ і можуть бути використані повторно. Додаток в контейнері працює в
ізольованому середовищі і не використовує пам'ять, процесор або диск
хостовой операційної системи. Це гарантує ізольованість процесів всередині
контейнера.

Різниця віртуальних машин і контейнерів


Існують два основні варіанти віртуалізації, а точніше два підходи до
створення незалежних ізольованих обчислювальних просторів на одному
фізичному сервері: віртуальні машини, яким потрібен гипервизор, і віртуальні
контейнери. У першому випадку для кожної віртуальної машини
використовується власна гостьова ОС, а в другому для всіх контейнерів
застосовується ядро однієї хостовой ОС. Відповідно, перша дозволяє
створювати неоднорідні обчислювальні середовища на одній комп'ютері, друга
- тільки однорідні
Однак, оскільки віртуальні машини включають операційну систему, їх
розмір може складати кілька гігабайт. Також недоліком віртуальних машин
можна назвати те, що для завантаження ОС і ініціалізації програми, яке в них
розміщено, потрібно відносно більше часу. Контейнери легші і, в основному, їх
розмір вимірюється в мегабайтах. Порівнюючи їх продуктивність з

5
віртуальними машинами, контейнери можуть запускатися майже миттєво. При
виборі між контейнерами та віртуальними машинами слід враховувати цілі, які
потрібно досягти. [2]
Контейнер працює нативної на Linux і розділяє ядро хост - машині з іншими
контейнерами. Він запускає дискретний процес, займаючи не більш пам'яті, ніж
будь-який інший виконуваний файл, що робить його легким.

На відміну від віртуальної машини (ВМ) працює повнофункціональна


«гостьова» операційна система з віртуальним доступом до ресурсів хоста через
гипервизор. Як правило, віртуальні машини надають середовищі більше
ресурсів, ніж потрібно більшості додатків. [14]

Рис.1.1

6
Рис.1.2

Які проблеми розв'язують контейнери?


Багато проблем виявляються при зміні середовища додатків. Це може
статися, наприклад, коли розробник запускає код в тестовому середовищі після
розробки. Зміни можуть стосуватися не тільки обчислювальних ресурсів, але
також і мереж. Топологія мережі, політики безпеки і багато іншого може бути
різним. [3]

Переваги контейнерів
Гнучке середовище.
Найбільша перевага у використанні технологій контейнерів полягає в
тому, що їх можна створювати набагато швидше, ніж екземпляри віртуальних
машин. Їх легка вага забезпечує менші накладні витрати з точки зору
продуктивності і розміру. [5]
Підвищена продуктивність.
Контейнери підвищують продуктивність розробників за рахунок
усунення міжмережевих залежностей і конфліктів. Кожен контейнер може
розглядатися як окремий мікросервіс і, отже, може бути незалежно оновлений
без будь-яких проблем з синхронізацією. Управління версіями дозволяє
відстежувати версії контейнера, стежити за відмінностями між ними і т. д.
Переносимість середовища обчислень.
Контейнери інкапсулюють всі відповідні деталі, такі як залежності
додатків і операційні системи, необхідні для запуску програми. Це полегшує
переносимість способу контейнера з одного середовища в іншу. Наприклад,
один і той же образ можна використовувати для роботи в середовищі Windows /
Linux або dev / test / stage.
Стандартизація.

7
Більшість контейнерів засновані на відкритих стандартах і можуть
працювати в усіх основних дистрибутивах Linux, Microsoft і т. Д. Безпека.
Контейнери ізолюють процеси одного контейнера від одного і від базової
інфраструктури. Таким чином, будь-яке оновлення або зміна в одному
контейнері не впливає на інший контейнер. НЕДОЛІКИ контейнерів Підвищена
складність: при n числі контейнерів, які працюють з додатком, також
збільшується коефіцієнт складності. [5]
Управління безліччю контейнерів може бути складним завданням у
виробничому середовищі. Такі інструменти, як Kubernetes і Mesos, можуть
полегшити управління великою кількістю контейнерів. Також складність
полягає в тому, що зазвичай в контейнер «пакується» набагато більше ресурсів,
ніж потрібно, а це призводить до розростання образу і великому розміру
контейнера. Підтримка Native Linux: більшість контейнерних технологій, таких
як Docker, засновані на Linux-контейнерах (LXC). Тому запуск цих контейнерів
в середовищі Microsoft - трохи незграбний процес, а їх щоденне використання
може викликати складності в порівнянні з початковим запуском цих
примірників на Linux.

Незрілість:

Контейнери - відносно нова технологія на ринку. Якщо у вас є якась


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

Різні програми можуть бути встановлені, налаштовані і можуть


виконуватися так само, як якщо ми запускаємо додаток на ОС хоста. Ресурси,
призначені контейнеру, видно тільки йому. Для створення контейнерів ОС ми

8
можемо використовувати такі контейнерні технології, як LXC, OpenVZ, Linux
VServer, BSD Jails і Solaris.

Контейнери додатків: згідно Вікіпедії, «Віртуалізація додатків - це


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

Контейнерні технології, такі як Docker і Rocket, є прикладами контейнерів


для додатків. [6]

1.2Технології ізольованого середовища. Chroot; namespaces; cgroups

Останні кілька років відзначені зростанням популярності


«контейнерних» рішень для ОС Linux. Про те, як і з якою метою можна
використовувати контейнери, сьогодні багато говорять і пишуть. А ось
механізмам, лежачим в основі контейнеризації, приділяється значно менше
уваги.
Всі інструменти контейнеризації - будь то Docker, LXC або systemd-
nspawn, - грунтуються на двох підсистемах ядра Linux: namespaces і cgroups.
Механізм namespaces (просторів імен).
Ідеї, що лежать в основі механізму просторів імен, не нові. Ще в 1979
році в UNIX був доданий системний виклик chroot () - як раз з метою
забезпечити ізоляцію і надати розробникам окрему від основної системи

9
майданчик для тестування. Незайвим буде згадати, як він працює. Потім ми
розглянемо особливості функціонування механізму просторів імен в сучасних
Linux-системах. [7]
Chroot (): перша спроба ізоляції

Назва chroot є скорочення від change root, що дослівно перекладається як


«змінити корінь». За допомогою системного виклику chroot () і відповідної
команди можна змінити кореневий каталог. Програмі, запущеної з зміненим
кореневим каталогом, будуть доступні тільки файли, що знаходяться в цьому
каталозі.

Файлова система UNIX є деревоподібну ієрархію.


Вершиною цієї ієрархії є каталог /, він же root. Всі інші каталоги - usr, local, bin
і інші, - пов'язані з ним. За допомогою chroot в систему можна додати другий
кореневої каталог, який з точки зору користувача нічим не буде відрізнятися від
першого.

Файлова система розділена на дві частини, і вони ніяк не впливають


один на одного. Як працює chroot. Спочатку звернемося до вихідного коду. Як
приклад розглянемо реалізацію chroot в OC 4.4 BSD-Lite.
Найголовніше відбувається в передостанньому рядку наведеного нами
фрагмента: поточна директорія стає кореневої. [8]
У ядрі Linux системний виклик chroot реалізований трохи складніше.
Спроби удосконалити механізм chroot і забезпечити більш надійну
ізоляцію робилися неодноразово: так, зокрема, з'явилися такі відомі технології,
як FreeBSD Jail і Solaris Zones. У ядрі Linux ізоляція процесів була
вдосконалена завдяки додаванню нових підсистем і нових системних викликів.
Деякі з них ми розберемо нижче. Механізм просторів імен Простір імен (англ.
Namespace) - це механізм ядра Linux, що забезпечує ізоляцію процесів один від
одного. Робота по його реалізації була розпочата в версії ядра 2.4.19. На
поточний момент в Linux підтримується шість типів просторів імен:

Простір імен – Що ізолює


10
PID PID процесів

NETWORK Мережеві пристрої, стеки, порти і т.п.

USER ID користувачів і груп

MOUNT Точки монтування

IPC SystemV IPC, черги повідомлень

POSIX UTS Ім'я хоста і доменне ім'я NIS

Всі ці типи використовуються сучасними системами контейнеризації


(Docker, LXC і іншими) при запуску програм.
PID: ізоляція PID процесів
Історично в ядрі Linux підтримувалося лише одне дерево процесів.
Дерево процесів являє собою ієрархічну структуру, подібну дереву каталогів
файлової системи.
З появою механізму namespaces стала можливою підтримка декількох
дерев процесів, повністю ізольованих один від одного.
При завантаженні в Linux спочатку запускається процес з
ідентифікаційним номером (PID) 1. У дереві процесів він є кореневим. Він
запускає інші процеси і служби. Механізм namespaces дозволяє створювати
окреме відгалуження дерева процесів з власним PID 1. [7]
Процес, який створює таке відгалуження, є частиною основного дерева,
але його дочірній процес вже буде кореневим в новому дереві. Процеси в
новому дереві ніяк не взаємодіють з батьківським процесом і навіть не «бачать»
його. У той же час процесам в основному дереві доступні всі процеси
дочірнього дерева.
Можна створювати кілька вкладених просторів імен PID: один процес
запускає дочірній процес в новому просторі назв PID, a той в свою чергу
породжує новий процес у новому просторі і т.п.

11
Один і той же процес може мати кілька ідентифікаторів PID (окремий
ідентифікатор для окремого простору імен).
Для створення нових просторів імен PID використовується системний
виклик clone () c прапором CLONE_NEWPID. За допомогою цього прапора
можна запускати новий процес у новому просторі назв і в новому дереві.
NET: ізоляція мереж
Завдяки простору імен NET ми можемо виділяти для ізольованих
процесів власні сeтевие інтерфейси. Навіть loopback-інтерфейс для кожного
простору імен буде окремим. [8]

MOUNT: ізоляція файлової системи


Про ізоляцію на рівні файлової системи ми вже згадували вище, коли
розбирали системний виклик chroot (). Ми відзначили, що системний виклик
chroot () не забезпечує надійної ізоляції. За допомогою ж просторів імен
MOUNT можна створювати повністю незалежні файлові системи, асоційовані з
різними процесами.
Інші простори імен
Ізольований процес також може бути поміщений в інші простори імен:
UID, IPC та PTS. UID дозволяє процесу отримувати привілеї root в межах
певного простору імен. За допомогою простору імен IPC можна ізолювати
ресурси для комунікації між процесами.
Механізми контейнеризації: cgroups
Тема cgroups сьогодні особливо актуальна: в ядро версії 4.5, що вийшла в світ у
січні поточного року, була офіційно додана нова версія цього механізму - group
v2.
В ході роботи над нею cgroups був по суті переписаний заново.

Архітектура
Механізм cgroups складається з двох складових частин: ядра (cgroup
core) і так званих підсистем. В ядрі версії 4.4.0.21 таких підсистем 12:

12
 blkio - встановлює ліміти на читання і запис з блокових пристроїв;
 cpuacct - генерує звіти про використання ресурсів процесора;
 cpu - забезпечує доступ процесів в рамках контрольної групи до CPU;
 cpuset - розподіляє завдання в рамках контрольної групи між
процесорними ядрами;
 devices - дозволяє або блокує доступ до пристроїв;
 freezer - призупиняє і відновлює виконання завдань в рамках контрольної
групи
 hugetlb - активує підтримку великих сторінок пам'яті для контрольних
груп;
 memory - управляє виділенням пам'яті для груп процесів;
 net_cls - позначає мережеві пакети спеціальним тегом, що дозволяє
ідентифікувати пакети, породжувані певної завданням в рамках
контрольної групи;
 netprio - використовується для динамічної установки пріоритетів по
трафіку;
 pids - використовується для обмеження кількості процесів в рамках
контрольної групи.

Кожна підсистема являє собою директорію з керуючими файлами, в яких


прописуються всі налаштування. [7]

У кожній з цих директорій є наступні керуючі файли:

 cgroup.clone_children - дозволяє передавати дочірнім контрольним групам


властивості батьківських;
 tasks - містить список PID всіх процесів, включених в контрольні групи;
 cgroup.procs - містить список TGID груп процесів, включених в
контрольні групи;

 cgroup.event_control - дозволяє відправляти повідомлення в разі зміни


статусу контрольної групи;
13
 release_agent - міститься команда, яка буде виконана, якщо включена
опція
 notify_on_release. Може використовуватися, наприклад, для
автоматичного видалення порожніх контрольних груп;
 notify_on_release - містить булеву змінну (0 або 1), що включає (або
навпаки відключає), виконання команду, зазначеної в release_agent.

У кожної підсистеми є також власні керуючі файли. Про деякі з них ми


розповімо нижче. Щоб створити контрольну групу, досить створити вкладену
директорію в будь-який з підсистем. У цю вкладену директорію будуть
автоматично додані керуючі файли (нижче ми розповімо про це більш
детально). Додати процеси в групу дуже просто: потрібно просто записати їх
PID в керуючий файл tasks. Сукупність контрольних груп, вбудованих в
підсистему, називається ієрархією.

Недоліки:

Якщо ми, наприклад, створюємо вкладену контрольну групу, то в


деяких підсистемах настройки батьківської групи успадковуються, а в деяких -
ні.
У підсистемі cpuset будь-яка зміна в батьківській контрольній групі
автоматично передається вкладеним групам, а в інших підсистемах такого
немає і потрібно активувати параметр clone.children. [8]

1.3Технологія контейнеризації LXC

LXC (англ. Linux Containers) - система віртуалізації на рівні операційної


системи для запуску декількох ізольованих примірників операційної системи
Linux на одному вузлі. LXC не використовує віртуальні машини, а створює
віртуальне оточення з власним простором процесів і мережевим стеком. Всі

14
екземпляри LXC використовують один екземпляр ядра операційної системи.
Дана система подібна до OpenVZ і Linux-VServer [en] для Linux, а також
FreeBSD jail і Solaris Containers. LXC заснована на технології cgroups, що
входить в ядро Linux, починаючи з версії 2.6.29. [9]

Основні розробники - Даніель Лескано (Daniel Lezcano), Серж Айюн


(Serge Hallyn) і Стефан Грабі (Stéphane Graber). Серед прикладів використання -
застосування в PaaS-хостингу Heroku для ізоляції динамічних контейнерів
(dynos). У проекті Docker розроблені компоненти, що забезпечують LXC
високорівневими сервісами управління і розгортання.

Спочатку LXC-контейнери не підтримували досить високий рівень


ізоляції в порівнянні з контейнерами на базі більш ранньої технології OpenVZ.
Зокрема, в ядрі Linux до версії 3.8 root-користувач LXC-контейнера може
виконати довільний код у батьківській операційній системі: це можливо за
рахунок того, що uid 0 всередині контейнера збігається з uid 0 базової системи
(всередині якої контейнер запущений). З випуском LXC версії 1.0 дана
проблема виправлена введенням «непривілейованих контейнерів» - де uid 0 в
контейнері відповідає звичайним користувачем зовні і має розширені права
тільки на свої ресурси.

LXC входить в більшість дистрибутивів Linux. У більшості випадків


встановити його так само просто, як вибрати його в менеджері пакетів.
Дистрибутиви також часто надають бекпорти нових версій LXC для їх
стабільних випусків. Можливо, ви захочете подивитися на це, особливо якщо
ваш дистрибутив не включає LXC 1.0 або 2.0. У виробничому середовищі
намагайтеся дотримуватися LXC 1.0.x або 2.0.x, оскільки це довгострокові
стабільні випуски, які ми будемо підтримувати до квітня 2019 роки (1.0.x) або
квітня 2021 роки (2.0.x). [10]

LXC має три активних гілки git:


 магістр: поточний розвиток галузі
 stable-1.0: стабільна гілка поновлення для LXC 1.0.x
15
 stable-2.0: стабільна гілка поновлення для LXC 2.0.x

Ви можете клонувати їх безпосередньо за допомогою:


git clone git: //github.com/lxc/lxc -b <имя ветви>

Контейнери LXC можуть бути двох типів: привілейовані контейнери


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

Другі були додані в LXC 1.0 (лютий 2014 року) і вимагають щодо свіже
ядро (3.13 і вище). Позитивна сторона в тому, що ми вважаємо такі контейнери
безпечними для root так що поки ви відстежуєте всі проблеми безпеки ядра,
такі контейнери безпечні. [11]

Так як привілейовані контейнери вважаються небезпечними, ми


зазвичай не вважаємо нові експлоїти виходу з контейнера проблемами безпеки,
гідними CVE і швидкого виправлення. Ми проте намагаємося зменшити ці
проблеми захищаючи хост від випадкового пошкодження. [10]

16
РОЗДІЛ ІІ. ТЕХНОЛОГІЯ КОНТЕЙНЕРИЗАЦІЇ DOCKER

2.1 Технологія Docker – суність, основні функції

Docker - це додаток, що дозволяє легко і швидко запускати інші


програми і процеси в контейнерах, які подібні до віртуальних машин, але є при
цьому більш портіруемость, споживають менше ресурсів, а також менше
залежать від операційної системи машини-хоста.
Набором контейнерів управляє системне оточення на базі ядра Linux,
способу початкового завантаження (initrd) і мінімального інструментарію,
необхідного для запуску контейнерів на базі системи Docker. Все інше,
включаючи udev, dhcp, ntp, cloud-init і rsyslog, запускається всередині окремих
системних контейнерів. Над контейнерами функціонує тільки процес Docker,
що виконується з PID 1. користувача інструментарій та демон dockerd для
запуску користувальницьких контейнерів також виконується в окремому
контейнері User Docker.Установка Docker. [12]
Образ - самостійна файлова система.
Контейнер - запущений процес операційної системи в ізольованому
оточенні з підключеною файлової системою з образу. Пакет установки Docker,
доступний в офіційному репозиторії Ubuntu 16.04, може бути не останньою
версією. Для отримання останньої версії необхідно встановлювати Docker з
офіційного репозиторію Docker. Далі ми опишемо процес такої установки в
практичній частині.
Docker Engine - це клієнт-серверний додаток з наступними основними
компонентами:

17
Сервер, який представляє собою тип довго поточну програму, званої
процесом-демоном (dockerdкоманда).
REST API, який визначає інтерфейси, які програми можуть
використовувати для спілкування з демоном і вказівки йому, що робити.
Клієнт інтерфейсу командного рядка (CLI) (dockerкоманда).

Рис.2.1

CLI використовує Docker REST API для керування або взаємодії з


демоном Docker за допомогою сценаріїв або прямих команд CLI. Багато інших
додатків Docker використовують базовий API і CLI.
Демон створює і управляє об'єктами Docker, такими як зображення,
контейнери, мережі та томи.

2.2 Архітектура Docker

Docker використовує архітектуру клієнт-сервер. Клієнт Docker


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

18
поширенню ваших контейнерів Docker. Docker-клієнт і демон можуть
працювати в одній системі або ви можете підключити Docker-клієнт до
віддаленого Docker-демона. Клієнт Docker і демон взаємодіють за допомогою
REST API, через сокети UNIX або мережевий інтерфейс. [14]

Рис.2.2

Docker-демон
Docker daemon (dockerd) прослуховує запити Docker API і управляє
об'єктами Docker, такими як зображення, контейнери, мережі та томи. Демон
також може взаємодіяти з іншими демонами для управління сервісами Docker.
Docker клієнт
Docker client (docker) - це основний спосіб взаємодії багатьох
користувачів Docker з Docker. Коли ви використовуєте такі команди, як docker
runкліент відправляє ці команди, щоб dockerdвиполніть їх. Команда
dockerіспользует Docker API. Клієнт Docker може взаємодіяти з декількома
демонами.
Реєстри докерів
У реєстрі Docker зберігаються зображення Docker. Docker Hub - це
загальнодоступний реєстр, який може використовувати кожен, і Docker за
замовчуванням налаштований на пошук зображень в Docker Hub. Ви навіть
19
можете запустити свій власний особистий реєстр. Якщо ви використовуєте
Docker Datacenter (DDC), він включає в себе Docker Trusted Registry (DTR).
При використанні команд docker pullілі docker runтребуемие образи
витягуються з налаштованого реєстру. Коли ви використовуєте docker
pushкоманду, ваш образ поміщається в ваш налаштований реєстр.
Docker об'єкти
Коли ви використовуєте Docker, ви створюєте і використовуєте
зображення, контейнери, мережі, тому, плагіни і інші об'єкти. Цей розділ
представляє собою короткий огляд деяких з цих об'єктів.
Зображення є тільки для читання шаблон з інструкціями по створенню
контейнера Докер. Найчастіше зображення засноване на іншому зображенні з
деякими додатковими настройками. Наприклад, ви можете створити образ,
який заснований на цьому ubuntu образі, але встановлює веб-сервер Apache і
ваше додаток, а також відомості про конфігурацію, необхідні для запуску
вашого застосування. [14]
Ви можете створювати свої власні зображення або використовувати
тільки ті, які створені іншими і опубліковані в реєстрі. Щоб створити свій
власний образ, ви створюєте Dockerfile з простим синтаксисом для визначення
кроків, необхідних для створення образу і його запуску.
Кожна інструкція в Dockerfile створює шар на зображенні. Коли ви
змінюєте Dockerfile і перебудовуєте зображення, перебудовуються тільки ті
верстви, які були змінені. Це є частиною того, що робить зображення такими
легкими, невеликими і швидкими в порівнянні з іншими технологіями
віртуалізації.
Контейнери
Контейнер - це працюючий екземпляр зображення. Ви можете
створювати, запускати, зупиняти, переміщати або видаляти контейнер за
допомогою Docker API або CLI. Ви можете підключити контейнер до однієї або
декількох мереж, прикріпити до нього сховище або навіть створити нове
зображення на основі його поточного стану.

20
За замовчуванням контейнер відносно добре ізольований від інших
контейнерів і свого хост-комп'ютера. Ви можете контролювати, наскільки
мережу контейнера, сховище або інші базові підсистеми ізольовані від інших
контейнерів або від хост-машини.
Контейнер визначається його чином, а також будь-якими параметрами
конфігурації, які ви надаєте йому при створенні або запуску. При видаленні
контейнера будь-які зміни його стану, які не зберігаються в постійному
сховище, зникають.
Приклад docker run команди
Наступна команда запускає ubuntuконтейнер, інтерактивно
підключається до локального сеансу командного рядка і запускається / bin /
bash. [13]

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

Коли ви запускаєте цю команду, відбувається наступне (за умови, що ви


використовуєте конфігурацію реєстру за замовчуванням):
Якщо у вас немає ubuntuобраза локально, Docker витягує його з
налаштованого реєстру, як якщо б ви запускали його docker pull ubuntu
вручную.
Docker створює новий контейнер, як ніби ви виконали docker container
create команду вручну.
Docker виділяє файлову систему для читання і запису для контейнера як
його останній рівень. Це дозволяє працюючому контейнеру створювати або
змінювати файли і каталоги в своїй локальній файловій системі.
Docker створює мережевий інтерфейс для підключення контейнера до
мережі за замовчуванням, оскільки ви не вказали жодних параметрів мережі. Це
включає в себе призначення IP-адреси для контейнера. За замовчуванням
контейнери можуть підключатися до зовнішніх мереж за допомогою
мережевого підключення хост-машини. Docker запускає контейнер і виконує /
bin / bash.

21
Оскільки контейнер працює в інтерактивному режимі і підключений до
терміналу (за рахунок -iі -t прапорів), ви можете забезпечити введення за
допомогою клавіатури, а вихід реєструється в терміналі. Коли ви вводите
команду exitдля завершення / bin / bashкоманди, контейнер зупиняється, але не
видаляється. Ви можете запустити його знову або видалити. [12]
Сервіси
Послуги, щоб змінити масштаб контейнери з кількох демонам докера,
які всі працюють разом, як зграя з декількома менеджерами і робітниками.
Кожен учасник рою є демоном Docker, і все демони спілкуються за допомогою
API Docker. Служба дозволяє вам визначити бажаний стан, наприклад кількість
реплік служби, які повинні бути доступні в будь-який момент часу. За
замовчуванням сервіс збалансований по всіх робочих вузлів. Для споживача
послуга Docker представляється одним додатком. Docker Engine підтримує
режим рою в Docker 1.12 і вище. [13]

2.3 Принцип роботи Docker

Відомо, що:
 можливо створювати образи, в яких знаходяться додатки;
 можливо створювати контейнери з образів, для запуску додатків;
 можливо поширювати образи через Docker Hub або інший реєстр образів.

Швидка і послідовна доставка ваших додатків


Docker оптимізує життєвий цикл розробки, дозволяючи розробникам
працювати в стандартизованих середовищах, використовуючи локальні
контейнери, які надають ваші програми та послуги. Контейнери відмінно
підходять для безперервної інтеграції і робочих процесів з безперервною
доставкою (CI / CD). [14]
Розглянемо наступний приклад сценарію:

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

Адаптивне розгортання і масштабування


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

2.4 Сервіси та технології Docker

Основна технологія

23
Docker написаний на Go і використовує кілька функцій ядра Linux для
забезпечення його функціональності.

Простори імен

Docker використовує технологію, покликану namespaces обеспечіть


ізольоване робоче простір, який називається контейнером. Коли ви запускаєте
контейнер, Docker створює набір просторів імен для цього контейнера. Ці
простору імен забезпечують рівень ізоляції. Кожен аспект контейнера
виконується в окремому просторі імен, і його доступ обмежений цим
простором імен. [12]

Docker Engine використовує простору імен, такі як такі в Linux:

 Простір pidімен: ізоляція процесу (PID: ідентифікатор процесу).


 Простір netімен: Управління мережевими інтерфейсами (NET: Мережа).
 Простір ipcімен: управління доступом до ресурсів IPC (IPC: InterProcess
Communication).
 Простір mntімен: Управління точками монтування файлової системи
(MNT: Mount).
 Простір utsімен: ізоляція ідентифікаторів ядра і версії. (UTS: Unix
Timesharing System).

Контрольні групи
Docker Engine в Linux також використовує іншу технологію, звану
контрольними групами (cgroups). Cgroup обмежує додаток певним набором
ресурсів. Групи управління дозволяють Docker Engine обмінюватися
доступними апаратними ресурсами з контейнерами і додатково встановлювати
обмеження і обмеження. Наприклад, ви можете обмежити доступну пам'ять для
конкретного контейнера.
Союз файлових систем

24
Файлові системи Union, або UnionFS, - це файлові системи, які
працюють шляхом створення шарів, що робить їх дуже легкими і швидкими.
Docker Engine використовує UnionFS для надання будівельних блоків для
контейнерів. Docker Engine може використовувати кілька варіантів UnionFS,
включаючи AUFS, btrfs, vfs і DeviceMapper.
Формат контейнера
Docker Engine об'єднує простору імен, групи управління і UnionFS в
оболонку, звану форматом контейнера. Формат контейнера за замовчуванням
libcontainer. В майбутньому Docker може підтримувати інші формати
контейнерів шляхом інтеграції з такими технологіями, як BSD Jails або Solaris
Zones. [14]

25
РОЗДІЛ ІІІ. ПРАКТИЧНЕ ВИКОНАННЯ ЗАВДАННЯ РЕАЛІЗАЦІЇ DOCKER

Постановка завдання :

Встановлення контейнеру Docker

Реалізуйте веб-сервер в контейнері Docker. Зверніться до цього веб-


сервера з іншої машини.

1. Встановлення Docker.
2. Робота з образами Docker
3. Запуск контейнера Docker
4. Використання команди Docker

5. Відображення контейнерів Docker

Виконання завдання[14] [16]

Для початку відновимо базу даних пакетів:

sudo apt-get update

Тепер встановимо Docker. Додамо ключ GPG офіційного репозиторію


Docker в нашу систему:

sudo apt-key adv --keyserver hkp://p80.pool.sks-keyservers.net:80 --recv-keys


58118E89F3A912897C070ADBF76221572C52609D

26
Рис.3.1

Тепер встановимо Docker. Додайте ключ GPG офіційного репозиторію


Docker в нашу систему:

Рис.3.2

Додамо репозиторій Docker в список джерел пакетів утиліти APT:


apt-add-repository 'deb https://apt.dockerproject.org/repo ubuntu-xenial main'

Оновимо базу даних пакетів інформацією про пакети Docker з знову


доданого сховища:

sudo apt-get update

27
Рис.3.3
Переконаємося, що ми збираємося встановити Docker зі сховищ Docker,
а не зі сховищ за замовчуванням Ubuntu 16.04:

Рис.3.4
28
Далі встановимо Docker:
apt-get install -y docker-engine

Рис.3.5

Після завершення виконання цієї команди Docker повинен бути


встановлений, демон запущений, і процес повинен запускатися при
завантаженні системи. Перевіримо, що процес запущений:

sudo systemctl status docker

Висновок повинен бути схожий на представлений нижче, сервіс


повинен бути запущений і активний:

Рис.3.6

При установці Docker ми отримуємо не тільки сервіс (демон) Docker,


але і утиліту командного рядка docker або клієнт Docker.

29
Використання команди Docker
Утиліта дозволяє використовувати різні опції, команди і аргументи.
Загальний вигляд синтаксису виглядає наступним чином:

docker [опція] [команда] [аргументи]


Для перегляду всіх доступних підкоманду:

Рис.3.7

Для перегляду подробиць використання кожної з підкоманду


використовується наступний формат:

docker docker-subcommand –help

Робота з образами Docker


30
Контейнери Docker запускаються з образів Docker. За замовчуванням
Docker отримує образи з Docker Hub, що представляє собою реєстр образів,
підтримуваний компаній Docker (ця компанія стоїть за всім проектом Docker).
Хто завгодно може створити і завантажити свої образи Docker в Docker Hub,
тому для більшості додатків і дистрибутивів Linux, які можуть знадобитися вам
для роботи, вже є відповідні образи в Docker Hub.
Для того, щоб перевірити, чи можете ви здійснювати доступ і
завантажувати образи з Docker Hub, введіть наступну команду:

Рис.3.8

Запуск контейнера Docker


Створені контейнери можна запускати, зупиняти, перевіряти їх статус і
т д. При створенні контейнера можна додатково передати Докерові деякі
параметри. Наприклад, попросити докер автоматично рестартовать контейнер,
якщо той впаде. [15]

31
Контейнер hello-world, який ми запускали раніше, є прикладом
контейнера, який запускається і завершує роботу після виведення тестового
повідомлення. Контейнери можуть виконувати і більш корисні дії, а також вони
можуть бути інтерактивними. Зрештою, вони дуже схожі на віртуальні машини,
тільки менш вимогливі до ресурсів.
Як приклад запустимо контейнер, який використовує останню версію
образу Ubuntu. Комбінація ключів -i і -t дозволяє здійснювати інтерактивний
доступ до контейнера:

Рис.3.9

Консольний ввід повинен змінитися для відображення факту, що ви


працюєте всередині контейнера. [16]
Тепер можна виконувати будь-які команди всередині контейнера. Для
прикладу оновимо базу пакетів всередині контейнера.

32
Рис.3.10

Тепер встановимо будь-який додаток в контейнер. Наприклад, NodeJS.


apt-get install -y nodejs

Збереження змін в контейнері в образ Docker

При запуску контейнера з образу Docker, можна створювати, змінювати


і видаляти файли, як і на віртуальній машині. Внесені зміни будуть мати силу
тільки в занедбаному контейнері. Можна запускати і зупиняти контейнер, але,
як тільки знищимо його командою docker rm, всі зміни будуть безповоротно
втрачені.
Після установки NodeJS в ваш контейнер Ubuntu, ваш запущений
контейнер відрізняється від образу, який був використаний для його створення.
Для збереження стану контейнера у вигляді нового способу, вийдіть з нього:

33
exit
Далі зробимо Комміт змін в новий образ Docker з використанням
наступної команди. Ключ -m дозволяє задати повідомлення коммітов для того,
щоб полегшити вам та іншим користувачам способу розуміння того, які зміни
були внесені. Ключ -a дає змогу вказати автора коммітов. Ідентифікатор
контейнера - цей той самий ідентифікатор, який ми бачили трохи раніше, коли
починали інтерактивну сесію в контейнері. [16]
Якщо ви не створювали додаткових репозиторіїв в Docker Hub, ім'я
сховища зазвичай є вашим ім'ям користувача в Docker Hub:

Рис.3.11

Після завершення операції виведення списку образів Docker на машині


повинен відображатися і щойно створений образ, а також вихідний образ, з
якого ми побудували новий образ:
docker images

Рис.3.12

В наведеному вище прикладі ubuntu-nodejs – це новий образ, створений


на основі образу ubuntu з Docker Hub. Різниця в розмірі відображає внесені
зміни. У цьому прикладі різниця в розмірі викликана встановленим NodeJS.

34
Наступного разу, коли вам буде потрібно запустити контейнер з Ubuntu з
передвстановленим NodeJS, ви можете використовувати цей новий образ.
Образи можуть будуватися і за допомогою так званого файлу Docker
(Dockerfile). Але це більш складний процес і ми не будемо описувати його в цій
статті. [14]

Відображення контейнерів Docker


Через деякий час після початку використання вами Docker, на вашій
машині буде безліч активних (запущених) і неактивних контейнерів. Щоб
переглянути список активних контейнерів використовуйте команду:
docker ps
Для перегляду всіх контейнерів – і активних, і неактивних, додайте до
цієї команди ключ –a:
docker ps –a
Для відображення останнього створеного контейнера використовуйте
ключ –l:
docker ps –l
Для зупинки запущеного контейнера введіть:
docker stop ідентифікатор-контейнера

Ідентифікатор-контейнера можна знайти за допомогою команди:


docker ps

35
Рис.3.13

В термінології Docker є зображення і контейнери. Два тісно пов'язані, але


різні.

Зображення насправді є шаблоном, який можна перетворити в контейнер,


по суті, це знімок контейнера. Контейнер є екземпляром зображення. Щоб
перетворити зображення в контейнер, движок Docker бере зображення, додає
читання-запис файлова система зверху і ініціалізує різні настройки, включаючи
мережеві порти, ім'я контейнера, ідентифікатор і обмеження ресурсів.
Працюючий контейнер має виконуваний в даний момент процес, але контейнер
також можна зупинити (або закрити, щоб використовувати термінологію
Docker). Вихід з контейнера не збігається із зображенням, так як він може бути
перезапущений і збереже свої настройки і будь-які зміни файлової системи.

Тому для побудови контейнера нам потрібно вказати зображення, з якого


буде отримано контейнер:

sudo docker search Ubuntu --no-trunc


Буду використовувати вибране зображення для створення веб-сервера
Docker:

Docker run --name web --hostname web -m 2g -p 80:80 -P -i -t ubuntu / bin / bash

36
-Name дати контейнеру описову назву

-Hostname, що задає ім'я хоста контейнера (за замовчуванням ім'я хоста


контейнера - щось на зразок a23dvef)

-m 2g (виділити 2 ГБ ОЗУ для цього контейнера

-p опублікувати порт (и) контейнера на хост докера

-P без цього перемикача веб-сайт докера буде доступний тільки з хоста докера,
а не з зовнішніх комп'ютерів

-tИ -iфлагі виділити псевдо-термінал і тримати відкритими, навіть стандартний


ввід, якщо не додається. Це дозволить вам використовувати контейнер як
традиційну віртуальну машину, поки працює запрошення bash. У цьому
прикладі ми хочемо взаємодіяти з контейнером, тому ми підключили / bin / bash

Ubuntu (позаду -t) це зображення, з якого ми хочемо створити контейнер

Після створення контейнера ви повинні бути перенаправлені на bash


контейнера

Рис.3.14

37
Рис.3.15

Оновити контейнер:

apt-get update –y

Встановіть apache, net tolls і редактор vi:

apt-get встановити apache2 vim net-tools –y

Рис.3.16

38
Підключаємося і перевіряємо:

Рис.3.17

Рис.3.18

39
ВИСНОВОК

Докер - універсальний спосіб доставки додатків на машини (локальний


комп'ютер або віддалені сервера) і їх запуск в ізольованому оточенні.
Працівникам часто доводиться збирати програми з початкових кодів.
Цей процес включає в себе наступні кроки:
• Встановити всі необхідні залежності під вашу операційну систему (їх
список ще треба знайти).
• Завантажити архів, розпакувати.
• Запустити конфігурація make configure.
• Запустити компіляцію make compile.
• Встановити make install.

Цей, процес нетривіальний і далеко не завжди швидкий. Іноді навіть


нездійсненний через незрозумілі помилок. І це не кажучи про забруднення
операційної системи.
Докер дозволяє спростити цю процедуру до запуску однієї команди
причому з майже 100% гарантією успіху.
Процесу, запущеного під Docker, здається, що він працює в
мінімальному оточенні, де крім нього є тільки його діти. Хоча при цьому
процес працює в тій же операційній системі, що і інші, нормальні, процеси, він
просто їх не бачить, рівно як не бачить файлів і всього іншого за межами своєї
«пісочниці» тим самим виконує функції безопасністі, що перш за все
представлені ізоляцією на основі віртуалізації,
що дозволяє запускати всередині себе неперевірених або шкідливі програми,
сирої код безпечно і аналізувати його.

40
СПИСОК ВИКОРИСТАНИХ ДЖЕРЕЛ

1. https://dzone.com/articles/container-technologies-overview
2. https://www.cloud4y.ru/about/news/obzor-tekhnologii-konteynerizatsii/
3. https://habr.com/company/selectel/blog/279281/
4. https://lwn.net/Articles/531114/
5. http://man7.org/linux/man-pages/man7/namespaces.7.html
6. http://www.haifux.org/lectures/299/netLec7.pdf
7. https://habr.com/company/selectel/blog/303190/
8. https://www.kernel.org/doc/Documentation/cgroup-v1/cgroups.txt —
документація першої версії cgroups;
9. https://ru.wikipedia.org/wiki/LXC
10.https://linuxcontainers.org/lxc/downloads/
11.https://linuxcontainers.org/ru/lxc/security/
12.https://habr.com/post/253877/
13.https://vps.ua/blog/how-to-install-software-with-docker/
14.https://docs.docker.com/get-started/#docker-concepts
15.https://linuxcontainers.org/
16.https://docs.docker.com/g

41

You might also like