• База знаний
  • /
  • Блог
  • /
  • 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 с удобным графическим инструментом управления. Портаинер. Уже через несколько минут после подтверждения заказа вы можете пользоваться полностью настроенным сервером. Закажите VPS хостинг с Docker и начинайте использовать его гибкость и мощность.

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

Смотрите наш канал Youtube на https://www.youtube.com/freehostua.

Мы в чем ошиблись, или что-то пропустили?

Напишите об этом в комментариях, мы с удовольствием ответим и обсуждаем Ваши замечания и предложения.

Дата: 17.05.2024
Автор: Александр Ровник
Голосование

Авторам статьи важно Ваше мнение. Будем рады его обсудить с Вами:

comments powered by Disqus
navigate
go
exit
Спасибо, что выбираете FREEhost.UA