Розуміючи Docker

Вже кілька місяців використовую docker для структуризації процесу розробки/доставки веб-проектів. Пропоную читачам «Хабрахабра» переклад вступної статті про docker "Understanding docker".

Що таке докер?

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

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

Платформа та засоби контейнерної віртуалізації можуть бути корисними у таких випадках:

  • упаковка вашої програми (і так само використовуваних компонентів) в контейнери docker;
  • роздача та доставка цих контейнерів вашим командам для розробки та тестування;
  • викладання цих контейнерів на ваші продакшени, як у дата центри так і в хмари.

Навіщо я можу використовувати docker?

Швидке викладання ваших додатків

Docker чудово підходить для організації циклу розробки. Docker дозволяє розробникам використовувати локальні контейнери з програмами та сервісами. Що надалі дозволяє інтегруватися з процесом постійної інтеграції та викладання (continuous integration and deployment workflow).

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

Простіше викладання та розгортання

Заснована на контейнерах платформа docker дозволять легко портувати ваше корисне навантаження. Docker контейнери можуть працювати на вашій локальній машині як реальної так і на віртуальній машині в дата центрі, так і в хмарі.

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

Високі навантаження та більше корисних навантажень

Docker легковажний та швидкий. Він надає стійку, рентабельну альтернативу віртуальним машинам з урахуванням гіпервізора. Він особливо корисний в умовах високих навантажень, наприклад, при створенні власної хмари або платформа-як-сервіс (platform-as-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-образ - це read-only шаблон. Наприклад, образ може містити операційну систему Ubuntu c Apache та додатком на ній. Образи використовуються створення контейнерів. Docker дозволяє легко створювати нові образи, оновлювати існуючі, або ви можете завантажити образи, створені іншими людьми. Образи - це компонент складання docker-а.

Реєстр

Docker-реєстр зберігає образи. Існують громадські і приватні реєстри, у тому числі можна завантажити чи завантажити образи. Публічний Docker-реєстр - це Докер-концентратор. Там зберігається величезна колекція образів. Як ви знаєте, образи можуть бути створені вами або ви можете використовувати образи, створені іншими. Реєстри – це компонента поширення.

контейнери

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

То як працює Docker?

Поки що ми знаємо, що:

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

Погляньмо, як ці компоненти поєднуються.

Як працює образ?

Ми вже знаємо, що образ це read-only шаблон, з якого створюється контейнер. Кожен образ складається із набору рівнів. 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 використовує його створення контейнера;
  • ініціалізує файлову систему та монтує read-only рівень: контейнер створений у файловій системі і read-only рівень доданий образ;
  • ініціалізує мережу/міст: створює мережевий інтерфейс, який дозволяє docker-у спілкуватися хост машиною;
  • Встановлення IP-адреси: знаходить та задає адресу;
  • Запускає цей процес: запускає вашу програму;
  • Обробляє та видає висновок вашої програми: підключається та логує стандартний вхід, висновок та потік помилок вашої програми, що б ви могли відстежувати як працює ваша програма.

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

Використовувані технології

Докер написаний на Go і використовує деякі можливості ядра Linux, щоб реалізувати наведений вище функціонал.

Простір імен(namespaces)

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

Це створює ізольований рівень, кожен аспект контейнера запущений у своєму просторі імен і не має доступу до зовнішньої системи.

Список деяких просторів імен, які використовує docker:

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

Control groups (контрольні групи)

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

Union File System

Union File Sysem або UnionFS - це файлова система, яка працює створюючи рівні, роблячи її дуже легковагою та швидкою. Docker використовує UnionFS для створення блоків, із яких будується контейнер. Docker може використовувати кілька варіантів UnionFS, включаючи: AUFS, btrfs, vfs і DeviceMapper.

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

Docker поєднує ці компоненти в обгортку, яку ми називаємо форматом контейнера. Формат, який використовується за замовчуванням, називається libcontainer. Також docker підтримує традиційний формат контейнерів у Linux за допомогою LXC. У майбутньому Docker можна буде підтримувати інші формати контейнерів. Наприклад, інтегруючись із BSD Jails або Solaris Zones.

Джерело: habr.com

Додати коментар або відгук