• База знань
  • /
  • Блог
  • /
  • Wiki
  • /
  • ONLINE CHAT
+380 (44) 364 05 71

Стаття також доступна російською (перейти до перегляду).

Вивчення базових команд розгалуженої системи керування додатками Docker

Вступ

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

Віртуальні середовища керування додатками

Незважаючи на різноманітність існуючих засобів розробки розгалужених додатків, далеко не всі з них відповідають OCI (Open Container Initiative) – стандарту віртуалізації на рівні операційної системи (ОС). Деякі взагалі його ігнорують, інші відповідають лише одній з двох наявних специфікацій OCI – часу виконання (runtime) або образу (image). Саме вказаний стандарт відкриває перспективи для створення автономних, незалежних від будь-якої платформи середовищ розробки та виконання коду.

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

Стандарт OCI саме й визначає правила формування загального середовища виконання для контейнерів (runc), а також правила створення, збереження та обробки їх образів.

Платформа Docker є однією з основних реалізацій вказаного стандарту наряду із системою Podman від компанії Red Hat. Основною відмінністю між ними є наявність у Docker загального демона для всіх контейнерів, у той час як у Podman загальний процес відсутній і, відповідно, контейнери запускаються лише як дочірні процеси. Також відрізняються підходи до управління системою – у Docker за замовченням керування системою встановлюється лише для root-доступу, у той час як у Podman «працює» доступ звичайний. Хоча останнім часом й у Docker з'явився rootless-режим, тобто, тут системи майже зрівнялись.

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

Існує багато проміжних розробок, які забезпечують сервісні функції для роботи декотрих з модулів Docker–системи. Наприклад, в AWS вже реалізований високопродуктивний сервіс керування контейнерами ECS (Amazon Elastic Container Service ). А багато хто з хостер-провайдерів має власні шаблони програми. Наприклад, компанія FREEhost.UA має власний шаблон VPS з Docker на основі ОС Debian, котрий можна розгорнути в один клік.

Релізи Docker випускаються двох видів – як вільно розповсюджуване програмне забезпечення (Community Edition) та для комерційного використання (Enterprise). Він підтримує роботу у більшості існуючих операційних систем – Mac, Windows, Linux та інших. Зокрема, для Ubuntu Docker CE підтримує наступні програми-драйвери для сховищ образів: Overlay2, btrfs та aufs, що створює вельми комфортні умови для роботи з ним саме у середовищі Linux-систем.

Розгортання середовища Docker на Ubuntu

Встановимо «з нуля» Docker CE на ОС Ubuntu. Встановлювати програму будемо з офіційного репозиторію Docker, а не з репозиторію Ubuntu, щоб гарантовано отримати останню версію програми. Послідовність дій буде наступною:

  • Оновлення версій пакетів ОС;
  • Встановлення пакетів, необхідних для роботи менеджера apt через протокол https;
  • Копіювання в нашу систему ключа GPG з офіційного репозиторію Docker для можливості виконувати завантаження;
  • Встановлення та розгортання програми.

Отже, оновимо версії пакетів нашої ОС. Для цього наберемо у терміналі команди:

$ sudo apt update

Оновлення паетів ОС.

$ apt list –upgradable

Перелік оновлень.

Перелік оновлень

Встановимо додаткові пакети для менеджера apt:

$ sudo apt install apt-transport-https ca-certificates curl software-properties-common

Оновлення пакетів менеджера apt

Додамо ключ з репозиторію Docker:

$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -

Додавання ключа Docker

Додамо репозиторій програми до джерел apt-менеджера. Це розширить базу пакетів нашої системи за рахунок нових пакетів Docker:

$ sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu focal stable"

Підключення репозиторію Docker до менеджера apt

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

apt-cache policy docker-ce

Перевірка джерела репозиторію

Перевірка джерела репозиторію

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

https://download.docker.com/linux/ubuntu focal/stable amd64 Packages

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

Тепер розпочнемо процес інсталяції програми. Наберемо у терміналі:

sudo apt install docker-ce

Інсталяція Docker

Після підтвердження згоди на виділення додаткових 401 Mb, процес інсталяції продовжиться:

Процес інсталації Docker

Процес інсталяції Docker

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

$ sudo systemctl status docker

Перевірка статусу програми

Можна бачити, що процес запущений, його PID = 630938. Також вказаний шлях до місця збереження інформації для групи Docker. Треба зазначити, що для можливості користуватися сервісом необхідно мати права root, або бути членом відповідної групи. Тому доцільно заздалегідь додати користувачів програми до вказаної групи. Для прикладу, додамо користувача нашої системи із ім'ям new_user до групи Docker. Це можна зробити за допомогою наступної конструкції:

$ sudo usermod -aG docker new_user

додавання нового користувача до групи docker

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

Запуск та використання довідкової системи Docker

Загальний формат запуску додатку має наступний вигляд:

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

Спочатку запустимо додаток без параметрів. У цьому випадку буде показано список доступних команд для роботи з середовищем та образами. Введемо у терміналі:

$ docker

Запуск Docker

Для того, щоб переглянути параметри визначеної команди, наприклад, images (робота з образами) введемо у терміналі:

$ docker images --help

Перегляд довідки для команди images

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

Для перегляду більш широкої інформації про програмний засіб, скористаємося наступною конструкцією:

$ docker info

Довідка Docker

Довідка Docker

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

Керування контейнерами у середовищі Docker

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

Для прикладу, спробуємо знайти образ ОС Ubuntu. Для цього введемо:

$ docker search ubuntu

Пошук образу Ubuntu

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

$ docker pull ubuntu

Завантаження Ubuntu

Отже, вказаний шаблон тепер знаходиться на нашій машині і ми зможемо у будь-який час його активізувати та перетворити на контейнер. Однак, спочатку знайдемо ще один шаблон, наприклад, для мови програмування perl:

$ docker search perl

Пошук шаблону perl

Тепер завантажимо на машину офіційну версію мови perl, котра позначена ОК у розділі OFFICIAL:

$ docker pull perl

Завантаження Perl

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

$ docker images

Список завантажених образів

Як бачимо, кожному шаблону присвоюється свій ідентифікатор, щоб ним потім можна було керувати – запускати, видаляти і т. д. Тепер за допомогою конструкції run спробуємо запустити якийсь з шаблонів для перетворення його на робочий контейнер у середовищі Docker. Введемо у терміналі:

$ docker run -it perl

Запуск шаблону perl

Аргумент -it дозволив нам включити інтерактивний режим роботи з нашим контейнером. У даному випадку, ми отримали інтерактивний відладник мови perl. Переглянемо довідкові інформацію по відладнику за допомогою інструкції h:

Довідка по відлачику

За допомогою комбінації клавіш Ctrl+D вийдемо з інтерактивного режиму роботи з контейнером perl.

Так само запустимо контейнер для ОС Ubuntu:

$ docker run -it ubuntu

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

Звернімо увагу на його ідентифікатор після символу «@». Його ми потім використаємо для управління модулем. Отже, тепер ми можемо працювати з Ubuntu в окремому контейнері. Для прикладу, інсталюємо мову java

$ apt install java

Установка Java

Інсталяція пройшла успішно. Тепер вийдемо з нього:

$ exit

Вихід з контейенру

Тепер ми знову в нашому звичайному середовищі Ubuntu.

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

docker ps

Перевірка активності контейнерів

Отже, активний тільки модуль з Ubuntu. Тепер виведемо всі наявні у системі контейнери:

docker ps -a

Список всіх наявних контейнерів

Їх виявилося три – два з perl та один з Ubuntu. Тепер з'ясуємо, який з них запускався останнім:

$ docker ps -l

Останній контейнер який запускався

Це контейнер з ідентифікатором 270c0219c951. Тепер запустимо його ще раз:

$ docker start confident_wozniak

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

Звернімо увагу, що для управління контейнерами можна використовувати як числові ідентифікатори, так і символьні (вказані у стовпчику NAME).

Запустимо ще один модуль з мовою perl:

$ docker start peaceful_snyder

Запуск ще одного контейнера perl

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

docker ps

Список активних модулів

Можна переконатися, що їх вже три – два з perl та один з Ubuntu. Зупинимо останній за допомогою його ідентифікатора:

$ docker stop 4939fb8b85fd

Зупинка контейнера по ID

Перевіримо список активних:

Список активних контейнерів

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

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

docker commit -m "Опис внесених змін" -a "Ім`я автора" container_id repository/new_image_name

Де repository/new_image_name – шлях до місця збереження нового шаблону; container_id – ідентифікатор модуля.

Створимо новий шаблон на основі внесених нами змін у контейнер з Ubuntu. Для цього введемо у терміналі:

$ docker commit -m "added Java" -a "new_user" 4939fb8b85fd new_user/ubuntu-java

Створення нового щаблону на базі внесених змін в контейнері

Переконаємося, що кількість наших шаблонів збільшилася:

$ docker images

Список всіх шаблонів

Таким чином, ми отримали новий шаблон з Ubuntu на базі внесених нами змін у запущений контейнер.

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

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

Підписуйтесь на наш телеграм-канал https://t.me/freehostua, щоб бути в курсі нових корисних матеріалів.

Дивіться наш канал Youtube на https://www.youtube.com/freehostua.

Ми у чомусь помилилися, чи щось пропустили?

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

Дата: 02.06.2023
Автор: Євген
Голосування

Авторам статті важлива Ваша думка. Будемо раді його обговорити з Вами:

comments powered by Disqus
navigate
go
exit
Дякуємо, що обираєте FREEhost.UA