Контейнерне середовище розробки багатокомпонентних веб-додатків прийшло на зміну платформам, побудованим на основі віртуальних машин. Його застосування дає змогу уникнути багатьох проблем, пов'язаних зі спільним використанням машинних ресурсів та їхньою економією. Однією з найпоширеніших платформ такого типу є система Docker, що забезпечує наявність повноцінного контейнерного середовища, придатного для розроблення та тестування багатокомпонентних розподілених додатків. Розглянемо питання, пов'язані зі встановленням програми на сервері Ubuntu, і продемонструємо деякі з її можливостей на практиці.
Способи побудови програмного середовища для роботи веб-додатків
Для роботи поштових і веб-серверів, сайтів і будь-яких інших інтернет-ресурсів потрібна наявність підготовленого програмного середовища, що має певні характеристики. Згодом виділилися три основні напрямки побудови такого середовища:
- Традиційне середовище, засноване на безпосередньому використанні фізичних ресурсів комп'ютера;
- Віртуальні машини;
- Контейнерні середовища.
Основним недоліком використання традиційного середовища є його велика ресурсоємність і, відповідно, затратність, що обмежує можливості його широкого застосування у зв'язку з постійно зростаючими ресурсними вимогами програмного забезпечення.
Віртуалізація програмного середовища дала змогу на певний час зняти проблему нестачі ресурсів, що, наприклад, відобразилося в появі безлічі типів віртуальних серверів на хостинг-майданчиках. VPS-сервери багато в чому здатні конкурувати з фізичними серверами за мінімального рівня використовуваних ресурсів.
Контейнерні середовища з'явилися як відповідь на постійно зростаючі запити щодо ефективності використання фізичних ресурсів комп'ютера під час розроблення багатокомпонентних розподілених веб-додатків. На відміну від віртуальних машин, віртуалізація середовища тут реалізується на рівні операційної системи (ОС), а не фізичних ресурсів комп'ютера. Причому контейнери є більш "легковагими" і "гнучкими" в контексті використання загальних ресурсів операційної системи. У результаті стало можливим отримати в межах однієї фізичної машини або VPS-сервера більшу кількість "незалежних" середовищ функціонування та/або розробки багатокомпонентних веб-додатків.
На Рисунку 1. представлено розглянуті нами варіанти організації програмного середовища: традиційне (Traditional Deployment), віртуальне (Virtualized Deployment) і контейнерне (Container Deployment).
Рисунок 1. Види програмних середовищ виконання веб-додатків.
Програмний інструмент Docker
На ринку програмного забезпечення є безліч засобів створення контейнерних середовищ виконання додатків, проте далеко не всі з них відповідають вимогам Міжнародного стандарту OCI (Open Container Initiative). Він визначає формальні правила реалізації віртуального середовища на рівні операційної системи, які описані у двох специфікаціях. Одна зі специфікацій формалізує правила створення та використання загального контейнерного середовища Container Runtime (див. Малюнок 1), а інша визначає правила роботи з образами(image) - створення, обробка тощо.
Контейнери замінюють собою віртуальні машини, маючи своє власне середовище виконання, ресурси і можливості налаштування параметрів конфігурації. Їх активація в Docker відбувається одразу ж після запуску спеціального шаблону або образу, який попередньо має бути завантажений з репозиторію або створений локально за допомогою спеціальної команди.
Платформа Docker відповідає всім вимогам стандарту OCI і може бути використана для роботи в середовищі більшості відомих OC - Windows, MacOS, Linux тощо. Програму випускають у двох виконаннях - для комерційного використання (Enterprise) і "вільна" версія (CE), яка стала досить популярною на платформах хостинг-провайдерів. Ми тут будемо використовувати саме цю версію програми як найбільш доступну.
Практичне використання CE Docker
Процес ознайомлення з програмою розіб'ємо на кілька етапів, що дасть змогу сконцентруватися на кожному з напрямків. Це такі етапи:
- Підготовка програмного середовища Ubuntu для встановлення Docker;
- Встановлення та розгортання;
- Ознайомлення з вбудованою системою підтримки користувача;
- Робота з контейнерами.
Здійснимо послідовне виконання кожного з етапів.
Підготовка програмного середовища Ubuntu для встановлення Docker
Для початку оновимо індекс пакетів нашої системи з репозиторію Ubuntu. Для цього введемо таку команду в командному рядку терміналу:
$ sudo apt update
Як бачимо, може бути оновлений 51 пакет. Ініціюємо цю процедуру за допомогою такої команди:
$ apt list –upgradable
Оновлення пакетів пройшло успішно.
Тепер встановимо програмні пакети, необхідні для забезпечення безперешкодної роботи протоколу, що керує завантаженнями по мережі. Для цього введемо в терміналі:
$ sudo apt install apt-transport-https ca-certificates curl software-properties-common
Пакети успішно встановлено.
Завантажимо програмний ключ із Docker-репозиторію:
$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add –
У результаті ключ було завантажено на наш сервер, про що свідчить вихід команди (OK).
Для можливості здійснювати завантаження з Docker-репозиторію необхідно додати його до списку допустимих джерел даних для нашого apt-протоколу. Це можна зробити за допомогою такої команди:
$ sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu focal stable"
Список сформовано. Тепер можна приступати до встановлення програми.
Встановлення та розгортання
Ініціюємо процес розгортання Docker CE за допомогою такої команди:
sudo apt install docker-ce
Підтверджуємо свою згоду на продовження встановлення за допомогою символу Y (Yes).
Підсумкове вікно результатів виконання команди представлено нижче.
Можна переконатися, що програма була успішно встановлена в системі.
Перевіримо її статус. Для цього введемо в терміналі:
$ sudo systemctl status docker
Вихід команди:
● docker.service - Docker Application Container Engine
Loaded: loaded (/lib/systemd/system/docker.service; enabled; vendor preset: enabled)
Active: active (running) since Fri 2024-02-02 17:44:37 UTC; 1 week 6 days ago
TriggeredBy: ● docker.socket
Docs: https://docs.docker.com
Main PID: 779607 (dockerd)
Tasks: 16
Memory: 33.3M
CPU: 4min 13.066s
CGroup: /system.slice/docker.service
└─779607 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
Результати свідчать про те, що Docker-машина (контейнерне середовище) створена; даемон сервісу запущено (active); PID процесу: 779607.
Тепер контейнерне середовище готове до роботи.
Ознайомлення з вбудованою системою підтримки користувача
Як і будь-яка інша програмна система, Docker надає низку вбудованих засобів, необхідних для його освоєння. Скористаємося ними.
Для початку виведемо список усіх доступних користувачеві команд управління контейнерним середовищем і Docker-образами. Для цього введемо в командному рядку терміналу:
$ docker
Опишемо найважливіші із загальних Docker-команд:
run – Створення та запуск контейнера з наявного образу;
exec – Запуск на виконання команд в активному контейнері;
ps – Виведення списку активних контейнерів;
build – Створення образу з Docker-файлу;
pull – Завантаження образу з сховища;
images – Виведення списку наявних у системі образів.
Кожна із зазначених команд має свої параметри, що використовуються для її запуску. Переглянемо, наприклад, параметри загальної команди build. Це можна зробити за допомогою такої керівної конструкції:
$ docker build --help
Як бачимо, команда має безліч опцій для використання в тому чи іншому випадку.
Для отримання повного набору даних щодо створеного програмного середовища можна скористатися такою командою:
$ docker info
Вивід команди:
Client: Docker Engine - Community
Version: 25.0.2
Context: default
Debug Mode: false
Plugins:
buildx: Docker Buildx (Docker Inc.)
Version: v0.12.1
Path: /usr/libexec/docker/cli-plugins/docker-buildx
compose: Docker Compose (Docker Inc.)
Version: v2.24.5
Path: /usr/libexec/docker/cli-plugins/docker-compose
Server:
Containers: 0
Running: 0
Paused: 0
Stopped: 0
Images: 1
Server Version: 25.0.2
Storage Driver: overlay2
Backing Filesystem: extfs
Supports d_type: true
Using metacopy: false
Native Overlay Diff: true
userxattr: false
Logging Driver: json-file
Cgroup Driver: systemd
Cgroup Version: 2
Як бачимо, інформація про програмне середовище розділена на дві частини - клієнтську та серверну. У клієнтській частині вказано версію Docker-машини, режим роботи, список встановлених плагінів, їхні версії та розміщення.
У серверній частині, зокрема, містяться дані про контейнери, образи, тип файлової системи та встановлені для неї драйвери.
Усе це дає повну картину конфігурації програмного середовища.
Робота з контейнерами в Docker-середовищі
Для можливості активації контейнера необхідна наявність його образу, який може бути завантажений із загальнодоступного репозиторію або створений за допомогою спеціальної команди. Розглянемо перший спосіб.
Припустімо, нам необхідний контейнер, що містить інтерпретатор мови Python для роботи з Python-додатками. Для початку переглянемо наявні образи Python у загальнодоступному репозиторії:
$ docker search python
Можна переконатися, що в репозиторії є безліч образів, пов'язаних із цією мовою. Три з них є офіційними: python, pypy і hylang. Для нас найбільш підходить образ з іменем python. Завантажимо його на наш сервер. Це можна зробити за допомогою такої команди:
$ docker pull python
Тепер цей образ знаходиться на нашому сервері. Перевіримо це, а заодно дізнаємося про наявність інших образів.
Введемо в терміналі:
$ docker images
Виведення команди:
DESCRIPTION | TAG | IMAGE ID | CREATED | SIZE |
python | latest | a3aef63c6c10 | 9 days ago | 1.02GB |
gcr.io/k8s-minikube/kicbase | v0.0.42 | dbc648475405 | 3 months ago | 1.2GB |
Як бачимо, на нашому сервері є два образи, один з яких ми щойно завантажили. Команда вивела їхні атрибути: назву, тег, ідентифікатор, час створення і розмір. Ідентифікатор дасть нам змогу надалі керувати контейнером.
Активуємо контейнер на базі python-образу. Це можна зробити за допомогою такої керуючої конструкції:
$ docker run -it python
Параметр -it дає змогу ввімкнути інтерактивний режим роботи зі створюваним контейнером.
У результаті ми отримали доступ до інтерпретатора мови Python, де ми можемо безперешкодно вводити потрібні команди.
Наприклад, введемо в командному рядку команду для переходу в інтерактивну довідку Python:
>>> help ()
Натискаємо комбінацію клавіш ctrl+C і повертаємося в режим інтерпретатора, як показано нижче:
Повернемося в командний рядок термінала:
>>> exit()
У процесі роботи в контейнерному середовищі може накопичуватися безліч різних контейнерів. Існує відповідна команда, щоб дізнатися їхній статус на даний момент часу. Скористаємося нею для визначення статусу нашого контейнера:
$ docker ps -a
Ми бачимо, що в списку присутній наш контейнер зі статусом Exited (0). Це означає, що він неактивний. Звертаємо увагу на наявність двох ідентифікаторів - цифрового (9b91b4cb047e) і символьного (eager_morse), за допомогою яких ми зможемо згодом керувати нашим ресурсом.
Для виведення тільки активних контейнерів існує така керуюча конструкція:
$ docker ps
Результат очевидний - список порожній.
Однак, знаючи ідентифікатори, ми можемо знову запустити контейнер. Введемо в терміналі:
$ docker start 9b91b4cb047e
Знову перевіримо список активних ресурсів:
$ docker ps
Можна переконатися, що список уже не порожній і наш ресурс має активний статус.
Зупинимо його, скориставшись для ідентифікації символьним ім'ям:
$ docker stop eager_morse
Знову перевіримо активні ресурси:
$ docker ps
Ми бачимо, що список знову порожній, що означає, що тип використовуваного в команді ідентифікатора не має значення.
Тепер створимо новий образ на основі умовно модифікованого нами контейнера python.
Для цього введемо в терміналі:
$ docker commit -m "Modify Python " -a "Admin" 9b91b4cb047e new_python
Тут new_python – довільне ім'я створюваного образу, Admin – ім'я користувача.
Переглянемо список образів, зареєстрованих у системі:
$ docker images
Як видно, у списку з'явився новий шаблон, якого не було раніше. Його ім'я new_python, як і слід було очікувати.
Розглянуті нами можливості Docker-середовища є більш ніж скромними. Насправді ці можливості набагато ширші й дають змогу проводити як завгодно складні маніпуляції з об'єктами віртуального середовища, але їхній розгляд виходить за рамки цієї статті.