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

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

Як використовувати docker exec

Зміст

Інструмент контейнеризації 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

Оновлення cсистеми

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

$ apt list --upgradable

 Оновлення пакетів

Пакети успішно оновлено. Переходимо до наступного етапу.

Створення користувача

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

$ adduser testing_dock

Створення нового користувача

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

$ adduser testing_dock sudo

Додавання користувача в групу 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

Результат:

? 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

Інформація по наявним шаблонам виведена із репозиторію 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.

Керування ОС Lubuntu, що розміщується в контейнері

В результаті виконання команди запрошення командної строчки стало іншим:

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

Застосування опції --workdir

Результат: /new_dir. Тобто, команда підтвердила, що вказаний нами каталог є робочим.

Виконання команд від імені інших користувачів системи

Утиліта docker exec дозволяє запускати внутрішні команди контейнера від імені іншого користувача системи. Для прикладу запустимо команду від імені root-користувача, котра виводить ім’я поточного користувача системи. Для цього введемо в терміналі:

$ sudo docker exec --user root testing_lubuntu whoami

Запуск команд контейнера під root-користувачем

Можна переконатися в тому, що програма вивела ім'я 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
navigate
go
exit
Дякуємо, що обираєте FREEhost.UA