Статья также доступна на украинском (перейти к просмотру).
Содержание
- Основные определения и концепции
- Предварительные условия и этапы тестирования
- Обновление системы
- Создание пользователя
- Развертывание 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 с удобным графическим инструментом управления. Портаинер. Уже через несколько минут после подтверждения заказа вы можете пользоваться полностью настроенным сервером. Закажите VPS хостинг с Docker и начинайте использовать его гибкость и мощность.
Подписывайтесь на наш телеграмм-канал https://t.me/freehostua, чтобы быть в курсе новых полезных материалов.
Смотрите наш канал Youtube на https://www.youtube.com/freehostua.
Мы в чем ошиблись, или что-то пропустили?
Напишите об этом в комментариях, мы с удовольствием ответим и обсуждаем Ваши замечания и предложения.
Дата: 17.05.2024 Автор: Александр Ровник
|
|
Авторам статьи важно Ваше мнение. Будем рады его обсудить с Вами:
comments powered by Disqus