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

Зміст
- Основні визначення та концепції
- Попередні умови та етапи тестування
- Оновлення системи
- Створення користувача
- Розгортання Docker-середовища
- Пошук та завантаження тестового шаблону
- Запуск контейнерів та робота з ними у різних режимах
- Запуск контейнеру у фоновому режимі
- Інтерактивний режим роботи з контейнером
- Запуск команд із вибіркового каталогу контейнера
- Виконання команд від імені інших користувачів системи
- Шляхи передачі значень змінних середовища виконання
- Можливі системні помилки та їх виправлення
Інструмент контейнеризації Docker CE надає широкі можливості для роботи із багатокомпонентними додатками на найвищому рівні абстракції – рівні контейнерного середовища. Ефективність такої роботи, зокрема, забезпечується внутрішніми механізмами керування контейнерами зсередини. Одним з них є утиліта exec, котра дозволяє запускати команди всередині активного контейнеру та керувати усіма внутрішніми процесами у інтерактивному режимі. Як і будь-який програмний засіб, утиліта має свої особливості використання, зокрема, це стосується параметрів її запуску. Розглянемо більш детально роботу з нею у реальному Docker-середовищі на VPS-сервері під керуванням Ubuntu 22.04.
Основні визначення та концепції
Перед початком тестування роботи утиліти у Docker-середовищі визначимо ряд основних концепцій та наведемо деякі визначення, на котрі ми будемо спиратися у подальшому.
Платформа Docker є однією з основних реалізацій стандарту віртуалізації OCI (Open Container Initiative), котра забезпечує існування платформнонезалежного середовища виконання та підтримує набір методів для роботи із шаблонами (image).
Контейнер утворюється одразу ж після завантаження шаблону із відповідними параметрами. Контейнер може знаходитися у двох станах (активний та неактивний), котрі можуть змінюватися у реальному режимі часу за допомогою відповідних команд.
На базі лише одного шаблону може бути створено безліч контейнерів із різними характеристиками, котрі можна визначати за допомогою параметрів його запуску у командній строчці.
На одному хості може бути запущено безліч слабо ізольованих контейнерів, котрі можуть одночасно працювати у загальному середовищі виконання. У якості хоста може виступати дата центр провайдера, локальна станція або хмарний сервіс.
Попередні умови та етапи тестування
Docker-середовище може бути створене на базі будь-якої з основних операційних систем (ОС). Однак, наявність кількох програм-драйверів для сховищ image для Linux-систем робить платформу найбільш зручною саме для них. Саме тому на сервері нами буде використана ОС Ubuntu 22.04.
Розіб’ємо процес тестування на кілька етапів:
- Оновлення системи;
- Створення користувача з правами sudo;
- Розгортання Docker-середовища;
- Пошук та завантаження тестового шаблону;
- Запуск контейнерів та робота з ними у різних режимах;
- Шляхи передачі значень змінних середовища виконання;
- Можливі системні помилки та їх виправлення.
Нижче буде розглянуто окремо кожен із вказаних етапів.
Оновлення системи
Встановлення та розгортання будь-якого програмного засобу, як відомо, починається із оновлення системи. Зробимо це і ми.
Введемо в терміналі:
$ sudo apt update

40 пакетів може бути оновлено. Введемо відповідну команду:
$ apt list --upgradable

Пакети успішно оновлено. Переходимо до наступного етапу.
Створення користувача
Для можливості безпечного запуску Docker-команд з адміністраторськими правами нам знадобиться користувач з правами sudo. Створимо його:
$ adduser testing_dock

Користувач із ім'ям testing_dock успішно створений. Додамо його до групи sudo:
$ adduser testing_dock sudo

Результат позитивний: «Adding user testing_dock to group sudo Done».
Змінимо поточний акаунт:
$ su -l testing_dock

Запрошення командної строчки: testing_dock@dedicated:~$ . Отже, акаунт змінено. Можна переходити до наступного етапу.
Розгортання Docker-середовища
Раніше у статті, присвяченій вивченню базових Docker-команд ми детально розглядали процес розгортання платформи на сервері Ubuntu і тому не будемо тут дублювати відповідні дії, а лише вкажемо на їх послідовність. Вона буде наступною:
- Встановлюються залежності, необхідні для безперешкодної роботи apt-протоколу;
- Завантажується GPG-ключ для офіційного Docker-репозиторію;
- Docker-репозиторій додається до джерел apt-протоколу;
- Перевіряється, що програма буде завантажуватися саме із офіційного репозиторію;
- Активується процес інсталяції програми;
- Відбувається перевірка статусу програми після завершення процесу її встановлення.
Після завершення процесу інсталяції переконаємося, що управляючий процес запущений і сервіс готовий до використання. Для цього введемо в терміналі:
$ sudo systemctl status docker

Результат:
? docker.service - Docke
Application Container Engine
Loaded: loaded (/lib/systemd/system/docker.service; enabled; vendor preset: enabled)
Active: active (running) since Fri 2024-05-10 15:04:02 UTC; 1min 17s ago
TriggeredBy: ? docker.socket
Docs: https://docs.docker.com
Main PID: 348952 (dockerd)
Tasks: 11
Memory: 39.7M
CPU: 537ms
CGroup: /system.slice/docker.service
L-348952 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
.....
May 10 15:04:02 dedicated systemd[1]: Started Docker Application Container Engine.
Можна переконатися, що процес запущений і контейнерне середовище сформоване. І тому переходимо до наступного етапу.
Пошук та завантаження тестового шаблону
Як відомо шаблон можна створити самостійно або завантажити з одного із відкритих репозиторіїв. Скористаємося другим шляхом для отримання тестового шаблону, створеного на базі ОС Lubuntu. Для цього введемо наступну команду:
$ sudo docker search lubuntu

Інформація по наявним шаблонам виведена із репозиторію Docker Hub, пошук у якому ведеться в першу чергу за замовчуванням. Завантажимо шаблон для Lubuntu 18.04 Dektop із встановленим VNC-сервером. Його ім’я – vncserver/lubuntu.
Завантажимо його за допомогою наступної команди:
$ sudo docker pull vncserver/lubuntu


Статус: «Downloaded newer image for vncserver/lubuntu:latest docker.io/vncserver/lubuntu:latest». Тобто, операція успішно виконана.
Переглянемо список доступних на нашому сервері шаблонів:
$ sudo docker images

Інформація по завантаженому нами image:
REPOSITORY TAG IMAGE ID CREATED SIZE vncserver/lubuntu latest 6c5de4d6a56a 4 years ago 2.71GB
Шаблон має свій ID, за допомогою котрого потім можна буде ним керувати.
Запуск контейнерів та робота з ними у різних режимах
Використання команди docker exec можливе лише при умові наявності активного контейнеру, котрий може бути створений при запуску image із різними параметрами.
Запуск контейнеру у фоновому режимі
Розглянемо процес активації контейнеру для його роботи у фоновому режимі.
Команда створення контейнеру на базі нашого image виглядає наступним чином:
$ sudo docker run -d --name testing_lubuntu 6c5de4d6a56a
Тут testing_lubuntu – назва контейнеру, що створюється, вона може бути будь-якою; 6c5de4d6a56a – ідентифікатор image із ОС Lubuntu, котрий ми завантажили раніше; параметр -d визначає фоновий режим роботи контейнеру.

В результаті ми отримали ідентифікатор створеного контейнеру – «a407f65f14......885».
Переконатися в тому, що він на даний час активний можна за допомогою наступної команди:
$ sudo docker ps

Результат:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES a407f65f1465 6c5de4d6a56a "/sbin/my_init" About a minute ago Up About a minute (healthy) 5901/tcp testing_lubuntu
Тут ми можемо отримати повну інформацію по створеному контейнеру.
Інтерактивний режим роботи з контейнером
Тепер створимо контейнер для роботи з ним у інтерактивному режимі. При цьому скористаємося утилітою exec для можливості запуску команд зсередини.
Завдання полягає в тому, щоб отримати можливість за допомогою оболонки bash здійснювати керування системою lubuntu, котра знаходиться у контейнері. Для цього введемо в терміналі:
$ sudo docker exec -it testing_lubuntu bash
Тут параметр -i зберігає вхідні дані відкритими для контейнеру; параметр -t утворює псевдотермінал для взаємодії з оболонкою bash.

В результаті виконання команди запрошення командної строчки стало іншим:
root@a407f65f1465:/#.
Тут a407f65f1465 – ідентифікатор контейнеру testing_lubuntu; root – ім’я користувача, котрий за замовчуванням має права root.
Для прикладу, створимо нову директорію із ім’ям new_dir, котра у подальшому нам знадобиться для демонстрації запуску команд із визначеного каталогу. Введемо в терміналі:
$ mkdir new_dir

Вийдемо з оболонки:
$ exit

Можна переконатися, що тепер ми знаходимося у звичайному термінальному режимі системи Ubuntu. Це видно із вигляду запрошення командної строчки:
testing_dock@dedicated:~$.
Тепер скористаємося іншим варіантом запуску шаблону для виведення результатів виконання заданої команди в реальному режимі часу. При цьому буде створений новий контейнер зі своїм ID. Введемо в терміналі:
$ sudo docker run -it vncserver/lubuntu watch "date >> /var/log/date.log"
Тут кожні дві секунди у терміналі буде виводитися поточний час та дата. Всі результати роботи команди будуть заноситися до файлу date.log у вигляді окремих строчок.

Можна переконатися, що в правій частині вікна виводиться дата та час, котрі оновлюються кожні дві секунди. Для повернення до термінального режиму слід натиснути комбінацію клавіш Ctrl+C. При цьому запущений контейнер деактивується.
Переглянемо всі дані для вже неактивного контейнеру:
$ sudo docker ps -a

Йому було присвоєне ім’я elated_shirley.
Для його запуску слід використати наступну команду:
$ sudo docker start elated_shirley

Тепер скористаємося утилітою exec для виводу інформації із файлу date.log, котрий містить строчки із датою та часом, котрий визначався через кожні дві секунди.
Введемо в терміналі:
$ sudo docker exec elated_shirley tail /var/log/date.log
Тут tail – команда для виведення останніх десяти строчок вказаного файлу.

Результат:
Fri May 10 17:55:39 UTC 2024 Fri May 10 17:55:41 UTC 2024 Fri May 10 17:55:43 UTC 2024 Fri May 10 17:55:45 UTC 2024 Fri May 10 17:55:47 UTC 2024 Fri May 10 17:55:49 UTC 2024 Fri May 10 17:55:51 UTC 2024 Fri May 10 17:55:53 UTC 2024 Fri May 10 17:55:55 UTC 2024 Fri May 10 17:55:57 UTC 2024
Вказана управляюча конструкція дозволяє спростити процес отримання результатів виконання команди, минаючи необхідність відкривати інтерактивну оболонку контейнеру, тобто створювати псевдотермінал. Цей варіант є більш оптимізованим.
Запуск команд із вибіркового каталогу контейнера
Ми маємо можливість запускати команди з будь-якої директорії контейнеру. Для цього необхідно в команді серед параметрів запуску вказати опцію --workdir, а також шлях та ім’я каталогу запуску команди. Наприклад, запустимо команду визначення поточного каталогу із директорії /new_dir, котра була нами створена раніше за допомогою псевдотерміналу. Для цього введемо в терміналі:
$ sudo docker exec --workdir /new_dir testing_lubuntu pwd

Результат: /new_dir. Тобто, команда підтвердила, що вказаний нами каталог є робочим.
Виконання команд від імені інших користувачів системи
Утиліта docker exec дозволяє запускати внутрішні команди контейнера від імені іншого користувача системи. Для прикладу запустимо команду від імені root-користувача, котра виводить ім’я поточного користувача системи. Для цього введемо в терміналі:
$ sudo docker exec --user root testing_lubuntu whoami

Можна переконатися в тому, що програма вивела ім'я root-користувача, хоча реально ми знаходимося в акаунті користувача testing_dock, що видно із вигляду запрошення командної строчки. Це означає, що система дійсно прив’язує запуск команди до користувача, вказаного серед параметрів її запуску, як у нашому випадку.
Шляхи передачі значень змінних середовища виконання
Нерідко зустрічаються ситуації, коли разом із командою запуску контейнера необхідно передати змінні програмного середовища. Для цього можна застосувати наступну управляючу конструкцію:
$ sudo docker exec -e TEST=one testing_lubuntu env
Тут команда запуску присвоює значення one змінній оточення із ім’ям TEST усередині контейнеру testing_lubuntu. Після цього команда env виводить а термінал поточні значення змінних, серед котрих є змінна TEST.

Результат:
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin HOSTNAME=a407f65f1465 DEBIAN_FRONTEND=teletype LANG=en_US.UTF-8 LANGUAGE=en_US:en LC_ALL=en_US.UTF-8 KILL_PROCESS_TIMEOUT=300 KILL_ALL_PROCESSES_TIMEOUT=300 TEST=one HOME=/root
Можна водночас встановити кілька змінних. У такому разі управляюча команда буде виглядати наступним чином:
$ docker exec -e TEST=one -e ENVIRONMENT=teka testing_lubuntu env
Тут додатково змінній із ім’ям ENVIRONMENT присвоюється значення teka. Вивід поточних значень змінних оточення підтверджує успішність виконання команди:

Результат:
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin ..... TEST=one ENVIRONMENT=teka
У випадку, якщо необхідно передати змінні оточення, розміщені у вигляді списку у файлі, можна скористатися опцією --env-file, після котрої ввести ім’я файлу .env.
Створимо цей файл за допомогою звичайного редактору та внесемо до нього тіж самі змінні, але з іншими значеннями:
TEST=one1 ENVIRONMENT=teka2 $ nano .env

Збережемо внесені зміни та вийдемо із редактору.
Тепер запустимо команду для зміни значень змінних:
$ sudo docker exec --env-file .env testing_lubuntu env

Можна переконатися, що значення вказаних змінних змінилися:
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin ............ TEST=one1 ENVIRONMENT=teka2
При необхідності можна вказати одразу кілька файлів, додаючи перед кожним з них опцію --env-file. У випадку, якщо значення змінної будуть перекриватися одне одним, значення змінної в останньому файлі перекриває всі попередні.
Можливі системні помилки та їх виправлення
При використанні утиліти exec можливе виникнення системних помилок, що зазвичай супроводжується відповідними повідомленнями. Розглянемо найбільш розповсюджені з них.
Error response from daemon: Container 3125trea78923ed2a12e30b13d0613dd79ae1365kod73e62e157aetf57gopae5 is not running
Повідомлення говорить про те, що контейнер із відповідним ідентифікатором не є активним, хоча і існує. Для вирішення проблеми достатньо його активувати за допомогою команди docker start, приклад використання якої був наведений вище.
Error response from daemon: Container new_name is paused, unpause the container before exec
Повідомлення вказує на факт призупинення роботи контейнеру із ім’ям new_name. Для її продовження необхідно зняти його з паузи. Це можна зробити за допомогою наступної управляючої конструкції: docker unpause new_name.
Error: No such container: test_cont
Повідомлення вказує на відсутність контейнеру із ім’ям test_cont. Причини можуть бути різними: неправильне написання імені, випадкове видалення контейнеру тощо. Для з’ясування деталей можна скористатися командою перегляду усіх наявних у системі контейнерів: docker ps -a, приклад використання якої був наведений нами раніше.
Для швидкого старту Docker на VPS хостингу дата-центр FREEhost.UA пропанує Docker з зручним графічним інструментом керування Portainer. Вже через кілька хвилин після підтвердження замовлення, Ви можете користуватися повністю налаштованим сервером. Замовте VPS хостинг з Docker і починайте використовувати його гнучкість та потужність.
Підписуйтесь на наш телеграм-канал https://t.me/freehostua, щоб бути в курсі нових корисних матеріалів.
Дивіться наш канал Youtube на https://www.youtube.com/freehostua.
Ми у чомусь помилилися, чи щось пропустили?
Напишіть про це у коментарях, ми з задоволенням відповімо та обговорюємо Ваші зауваження та пропозиції.
|
Дата: 17.05.2024 Автор: Олександр Ровник
|
|

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