Как использовать команду docker container exec для выполнения команд в работающем контейнере

DockerBeginner
Практиковаться сейчас

Введение

В этой лабораторной работе (lab) вы научитесь эффективно использовать команду docker container exec для выполнения команд внутри работающего Docker-контейнера. Мы начнём с запуска контейнера для выполнения, затем изучим, как выполнить одиночную команду в работающем контейнере и как запустить интерактивную оболочку (shell) для более сложных взаимодействий.

Кроме того, в этой лабораторной работе будет рассмотрено, как настроить среду выполнения, устанавливая переменные окружения (environment variables) и указывая рабочую директорию для процесса exec, что даст вам навыки управления и взаимодействия с вашими работающими контейнерами.

Запуск контейнера для выполнения команд

На этом шаге вы узнаете, как запустить Docker-контейнер и выполнить команду внутри него. Docker-контейнеры — это легковесные, переносимые и самодостаточные единицы, которые инкапсулируют приложение и его зависимости.

Сначала загрузим образ ubuntu из Docker Hub. Этот образ содержит минимальную среду операционной системы Ubuntu.

docker pull ubuntu:latest

Вы увидите вывод, указывающий на загрузку образа. После завершения загрузки вы можете запустить контейнер на основе этого образа и выполнить простую команду. Мы используем команду echo для вывода сообщения.

docker run ubuntu:latest echo "Hello from Docker container!"

Разберём эту команду:

  • docker run: Команда для создания и запуска нового контейнера.
  • ubuntu:latest: Указывает используемый образ. ubuntu — имя образа, а latest — тег, обозначающий последнюю версию.
  • echo "Hello from Docker container!": Команда, которая будет выполнена внутри контейнера.

В терминале должно появиться сообщение Hello from Docker container!, что подтверждает успешный запуск контейнера и выполнение команды.

Выполнение команды в работающем контейнере

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

Сначала запустим контейнер, который будет работать постоянно. Снова используем образ ubuntu и выполним команду, которая поддерживает работу контейнера, например sleep infinity.

docker run -d ubuntu:latest sleep infinity

Разберём использованные опции:

  • -d: Запускает контейнер в фоновом режиме (detached), не блокируя терминал.
  • sleep infinity: Команда внутри контейнера, которая переводит его в бесконечное ожидание, поддерживая работу контейнера.

Теперь получим ID работающего контейнера. Для этого используем команду docker ps, которая выводит список работающих контейнеров.

docker ps

Вы увидите примерно такой вывод с информацией о вашем контейнере:

CONTAINER ID   IMAGE          COMMAND           CREATED         STATUS         PORTS     NAMES
<container_id>   ubuntu:latest   "sleep infinity"   About a minute ago   Up About a minute             <container_name>

Скопируйте CONTAINER ID из вывода. Теперь мы можем использовать команду docker exec для выполнения команд внутри этого контейнера. Замените <container_id> на скопированный ID.

docker exec / < container_id > ls

Эта команда выполнит ls / внутри указанного контейнера, выводя список содержимого корневой директории файловой системы контейнера. Вы увидите перечень директорий и файлов, аналогичный стандартной структуре Linux.

Это демонстрирует, как выполнять команды в работающем контейнере без его остановки или перезапуска.

Запуск интерактивной оболочки в работающем контейнере

На предыдущем шаге мы выполнили отдельную команду в работающем контейнере. Часто требуется более глубокое взаимодействие с контейнером — например, для отладки или изучения его файловой системы. В этом шаге вы научитесь открывать интерактивную сессию оболочки внутри работающего контейнера.

Мы продолжим использовать контейнер ubuntu, запущенный ранее. Если контейнер не работает, его можно перезапустить командой из предыдущего шага:

docker run -d ubuntu:latest sleep infinity

Получите ID работающего контейнера ubuntu с помощью docker ps:

docker ps

Теперь используйте команду docker exec с опциями -it для открытия интерактивной терминальной сессии внутри контейнера. Замените <container_id> на фактический ID вашего контейнера.

docker exec -it < container_id > bash

Разберём новые опции:

  • -i: Оставляет STDIN открытым, даже если не подключён. Необходимо для интерактивных сессий.
  • -t: Выделяет псевдо-TTY, что требуется для работы оболочки.
  • bash: Команда для выполнения внутри контейнера (в данном случае — оболочка Bash).

После выполнения команды приглашение терминала изменится, указывая, что вы теперь находитесь в оболочке контейнера. Теперь можно выполнять команды в среде контейнера. Например, выведите список файлов в текущей директории:

ls

Теперь вы взаимодействуете напрямую с файловой системой и средой контейнера. Для выхода из оболочки контейнера и возврата в терминал хоста введите:

exit

Вы вернётесь в исходную терминальную сессию. Интерактивный доступ к оболочке — мощный инструмент для отладки и управления контейнерами.

Установка переменных окружения для процесса exec

В этом шаге вы узнаете, как устанавливать переменные окружения для команды, выполняемой через docker exec. Это позволяет передавать конфигурацию или другую информацию процессу внутри контейнера без постоянного изменения окружения контейнера.

Мы продолжим использовать работающий контейнер ubuntu из предыдущих шагов. Если он не запущен, выполните:

docker run -d ubuntu:latest sleep infinity

Получите ID контейнера с помощью docker ps:

docker ps

Теперь выполним команду внутри контейнера, установив переменную окружения только для этого выполнения. Используем команду printenv для отображения переменных. Замените <container_id> на ID вашего контейнера.

docker exec -e MY_VARIABLE="Hello from LabEx" MY_VARIABLE < container_id > printenv

Разберём новую опцию:

  • -e MY_VARIABLE="Hello from LabEx": Устанавливает переменную окружения MY_VARIABLE со значением "Hello from LabEx" для выполняемой команды printenv.

В терминале должно появиться значение Hello from LabEx, подтверждающее успешную установку переменной.

Чтобы показать, что эта переменная действует только для процесса exec, а не для основного процесса контейнера, выполним printenv MY_VARIABLE без опции -e:

docker exec MY_VARIABLE < container_id > printenv

Теперь вы не увидите вывода (или получите ошибку о том, что переменная не установлена). Это демонстрирует, что переменная была доступна только команде, выполненной с флагом -e.

Использование docker exec -e — удобный способ передачи динамической конфигурации процессам внутри контейнеров.

Установка рабочей директории для процесса exec

В этом завершающем шаге вы узнаете, как установить рабочую директорию для команды, выполняемой через docker exec. По умолчанию docker exec выполняет команды в рабочей директории контейнера (обычно /). Это можно изменить с помощью опции -w.

Мы продолжим использовать работающий контейнер ubuntu. Если он не запущен, выполните:

docker run -d ubuntu:latest sleep infinity

Получите ID контейнера с помощью docker ps:

docker ps

Теперь выполним команду, которая выводит текущую рабочую директорию внутри контейнера. Используем команду pwd. Замените <container_id> на ID вашего контейнера.

docker exec < container_id > pwd

Вы увидите / — рабочую директорию по умолчанию в образе ubuntu.

Теперь выполним pwd снова, но установим рабочую директорию /tmp через опцию -w:

docker exec -w /tmp < container_id > pwd

Разберём новую опцию:

  • -w /tmp: Устанавливает рабочую директорию /tmp для выполняемой команды pwd.

Теперь вывод будет /tmp. Это показывает возможность указания рабочей директории для команд, выполняемых через docker exec. Особенно полезно при работе с файлами в конкретных директориях контейнера.

На этом лабораторная работа по выполнению команд в Docker-контейнерах завершена. Вы научились:

  • Запускать контейнеры для выполнения команд
  • Выполнять команды в работающих контейнерах
  • Открывать интерактивные сессии оболочки
  • Устанавливать переменные окружения
  • Задавать рабочую директорию для процессов exec

Резюме

В этой лабораторной работе вы научились:

  • Запускать Docker-контейнер и выполнять в нём команды с помощью docker run
  • Выполнять команды в уже работающем контейнере через docker container exec — важный инструмент для проверки и управления активными контейнерами

Вы также освоили расширенные возможности docker container exec:

  • Установку переменных окружения для выполняемого процесса
  • Указание рабочей директории

Эти функции обеспечивают более гибкое и контролируемое взаимодействие с работающими контейнерами.