Как выполнить команду docker exec в Docker-контейнере? (docker exec в контейнер)
Чтобы выполнить команду внутри запущенного Docker-контейнера, используйте:
docker exec -it <container_id> <command>
Например, чтобы открыть оболочку bash:
docker exec -it mycontainer bash
Чтобы выполнить одну команду:
docker exec mycontainer ls /app
Docker - это популярный инструмент с открытым исходным кодом, который упрощает развёртывание, масштабирование и управление приложениями с помощью технологии контейнеров. Благодаря Docker-контейнерам разработчики могут упаковывать приложения вместе с зависимостями в переносимые контейнеры, обеспечивая единообразную работу в разных средах.
Запускаете docker exec на VPS? Убедитесь, что вашему серверу хватает ресурсов: ознакомьтесь с Docker VPS-хостингом от BlueVPS.
Что делает docker exec?
Одна из ключевых команд Docker - docker exec, которая позволяет выполнять команды внутри запущенного контейнера. Эта возможность даёт прямой доступ к процессам и среде контейнера, что полезно для устранения неполадок или управления приложениями.
Docker универсален и совместим с различными операционными системами, включая Linux, Windows и macOS. Его даже можно установить на виртуальный частный сервер (VPS). Чтобы настроить Docker, нужно выполнить определённые шаги конфигурации для выбранной платформы.
Как использовать команду docker exec?
Прежде чем использовать команду docker exec, убедитесь, что Docker правильно установлен в вашей системе. Затем определите конкретный контейнер, в котором хотите выполнить команду.
В этом гайде разберём команду docker exec. Мы покажем, как запускать docker exec от имени root внутри Docker-контейнера на разных примерах использования.
Предварительные требования
- Убедитесь, что в вашей системе установлена последняя версия Ubuntu.
- Установите Docker, выполнив шаги из официальной документации Docker.
- Добавьте своего пользователя в группу docker, чтобы запускать команды Docker без необходимости каждый раз вводить пароль администратора.
Запуск Docker-контейнера
Чтобы показать, как использовать команду docker exec, сначала запустим контейнер.
Сначала загрузите образ в Docker-контейнер:
# docker pull redis
Вот пример с контейнером Redis:
# docker run -d --name myredis redis
Эта команда запускает контейнер Redis в фоновом режиме (флаг -d). Контейнер с именем myredis будет служить нашим примером среды для выполнения команд.
Выполнение команд внутри Docker-контейнера (Docker Container)
Чтобы выполнять команды внутри контейнера, сначала нужен его ID. Найти ID контейнера можно, выведя список всех запущенных контейнеров следующей командой:
# docker ps
Когда у вас есть ID контейнера (например, 6a8b7d170a12), вы можете использовать его для выполнения команд внутри контейнера.

Синтаксис команды docker exec (docker exec от имени root)
Общий синтаксис команды docker exec такой:
docker exec [OPTIONS] CONTAINER COMMAND [ARG...]
Вот наиболее часто используемые опции:
-d, --detach: Runs the command in the background.
--detach-keys: Sets a custom key sequence to detach from the container.
-e, --env: Specifies environment variables for the command.
--env-file: Loads environment variables from a file.
-i, --interactive: Keeps the standard input (STDIN) open even if not attached to a terminal.
--privileged: Grants the command extended privileges.
-t, --tty: Allocates a pseudo-terminal for the command.
-u, --user: Runs the command as a specific user or UID.
-w, --workdir:Sets the working directory inside the container for the command.
Выполнение docker exec в контейнере в неинтерактивном режиме (docker exec в контейнер)
В неинтерактивном режиме можно выполнить одну команду внутри запущенного контейнера. Например, чтобы проверить версию Redis в запущенном контейнере, используйте следующую команду:
# docker exec <container_id> redis-server --version
Эта команда выполняет redis-server --version внутри указанного контейнера (замените <container_id> на реальный ID, например 6a8b7d170a12). Она получает и выводит версию Redis прямо в вашем терминале.
Выполнение команд в интерактивной оболочке
Интерактивный режим позволяет открыть сеанс оболочки внутри контейнера, чтобы выполнять несколько команд и исследовать среду контейнера. Чтобы получить доступ к интерактивной оболочке, используйте следующий синтаксис:
docker exec -it CONTAINER COMMAND [ARG...]
Например, чтобы открыть оболочку в запущенном контейнере Redis, используйте:
# docker exec -it 6a8b7d170a12 bash
Замените <container_id> на ID вашего контейнера Redis (например, 6a8b7d170a12). Эта команда открывает сеанс оболочки внутри контейнера, позволяя взаимодействовать со средой и выполнять несколько команд.
Пример: выполнение команды в интерактивной оболочке (Docker bash)
Оказавшись в оболочке, вы можете выполнять специфичные для Redis команды. Например:
# redis-cli ping
Эта команда проверяет состояние сервера Redis, работающего в контейнере, и возвращает PONG, если он работает правильно. Теперь вы можете при необходимости исследовать файловую систему и среду контейнера.

Выполнение docker exec от имени другого пользователя (docker exec as user)
По умолчанию docker exec выполняет команды внутри контейнера от имени root. Однако вы можете указать для команды другого пользователя. Чтобы выполнить команду от имени конкретного пользователя, используйте следующий синтаксис:
docker exec -u USERNAME CONTAINER COMMAND [ARG...]
Например, чтобы выполнить команду «whoami» от имени пользователя redis внутри контейнера Redis, нужно использовать:
# docker exec -u redis 6a8b7d170a12 whoami

Выполнение команд с переменными окружения
Вы можете выполнять команды внутри контейнера, задавая определённые переменные окружения, с помощью следующего синтаксиса:
docker exec -e VAR_NAME=VAR_VALUE CONTAINER COMMAND [ARG...]
Например, чтобы выполнить команду env внутри контейнера Redis с собственной переменной окружения, используйте:
# docker exec -e MY_VARIABLE='testing_env' <container_id> env
Это задаёт MY_VARIABLE значение testing_env, а затем выполняет команду env, чтобы показать переменные окружения контейнера. Этот способ полезен для безопасной передачи конфиденциальных данных, например API-ключей, в контейнер без их раскрытия в среде контейнера.
Примеры docker exec (типичные сценарии использования)
Команда docker exec позволяет выполнять команды внутри активного Docker-контейнера без его остановки или перезапуска. Её широко используют для устранения неполадок, обслуживания, диагностики и разовых административных операций. Типичный пример docker exec - открытие интерактивной оболочки внутри запущенного контейнера, чтобы просмотреть файлы, проверить процессы или разобраться с проблемами приложения.
Типичные сценарии использования docker exec:
1. Открытие оболочки внутри запущенного контейнера.
Используйте docker exec -it с Bash или другой оболочкой, чтобы просмотреть файлы, процессы, права доступа и среду контейнера.
2. Просмотр конфигурационных файлов.
Администраторы могут проверить настройки приложения, переменные окружения, смонтированные каталоги и права доступа к файлам. Изменения, внесённые вручную, могут быть потеряны при повторном создании контейнера, поэтому постоянные изменения следует добавлять в образ или в смонтированную конфигурацию.
3. Выполнение команд базы данных.
docker exec удобно использовать для запуска клиентов баз данных, выполнения SQL-запросов, применения миграций, создания резервных копий или выполнения задач обслуживания.
4. Проверка системной информации.
Команды ps, top, df, free и env помогают диагностировать использование ресурсов, запущенные процессы, дисковое пространство и настройки окружения.
5. Очистка кеша приложения.
Команды очистки кеша, специфичные для фреймворка, можно выполнять после изменений в коде, маршрутизации, шаблонах или конфигурации.
6. Проверка сетевого соединения.
Такие инструменты, как curl, ping, wget или nslookup, помогают проверить соединения между контейнерами, базами данных, API и внешними сервисами.
7. Запуск скриптов обслуживания.
Вы можете выполнять импорт данных, исправление прав доступа, команды очередей, тестирование запланированных задач и другие разовые операции.
Эти примеры docker exec показывают, почему команда незаменима для отладки и администрирования контейнеров. Однако её стоит использовать в основном для временных задач, а постоянные изменения следует вносить в Dockerfile, конфигурацию Docker Compose, переменные окружения или смонтированные тома.
Как войти в запущенный Docker-контейнер
Иногда нужно заглянуть внутрь контейнера, пока приложение ещё работает. Это может понадобиться, чтобы проверить файлы, просмотреть конфигурацию, протестировать команду, проверить процессы или найти причину ошибки. В большинстве случаев вход в Docker-контейнер выполняют с помощью docker exec, поскольку эта команда позволяет запустить оболочку внутри существующего контейнера без его повторного создания или остановки.
Сначала проверьте, какие контейнеры сейчас активны:
docker ps
Скопируйте имя или ID нужного контейнера, а затем откройте интерактивную оболочку:
docker exec -it container_name /bin/bash
Эта команда создаёт терминальный сеанс внутри контейнера. Опция -i оставляет поток ввода открытым, а -t предоставляет удобный терминальный интерфейс.
Не каждый образ содержит Bash. Минимальные образы, особенно на основе Alpine Linux, часто предоставляют только стандартную оболочку sh. В таком случае используйте:
docker exec -it container_name /bin/sh
Это обычный подход, когда нужно выполнить exec в Docker-контейнер, а Bash недоступен.
Пользователи иногда ищут «docker get into container» или «docker login into container», но эти формулировки могут вводить в заблуждение. Команда docker login не открывает контейнер. Она используется для аутентификации в Docker Hub или другом реестре контейнеров. Чтобы получить доступ к среде запущенного контейнера, правильная команда - docker exec.
Для сервиса, запущенного через Docker Compose, синтаксис немного другой:
docker compose exec service_name sh
Оказавшись внутри, вы можете просматривать каталоги, запускать диагностические инструменты, проверять переменные окружения или выполнять разовые задачи обслуживания. Чтобы закрыть оболочку, введите exit или нажмите Ctrl + D. Это завершает только интерактивный сеанс, а сам контейнер продолжает работать.
Оболочка в docker exec: Bash или sh
При работе с оболочкой через docker exec одно из первых решений - запускать bash или sh. Правильный выбор зависит от операционной системы и инструментов, входящих в образ контейнера.
Bash - функциональная оболочка, которая обычно доступна в Ubuntu, Debian и похожих дистрибутивах. Она поддерживает историю команд, автодополнение по клавише Tab, алиасы, возможности для скриптов и другие инструменты, которые делают устранение неполадок и администрирование удобнее. Если вам нужно запустить bash в работающем контейнере, обычно это предпочтительный вариант:
docker exec -it container_name /bin/bash
Однако многие легковесные образы, например Alpine Linux, не содержат Bash, чтобы сохранить небольшой размер образа. Вместо этого они предоставляют POSIX-совместимую оболочку sh, которой достаточно для большинства административных задач:
docker exec -it container_name /bin/sh
Если вы не уверены, какая оболочка доступна, сначала попробуйте Bash. Если команда возвращает ошибку о том, что /bin/bash не существует, просто используйте sh. Этот подход работает с большинством минимальных Docker-образов.
На практике обе оболочки позволяют просматривать файлы, проверять логи, редактировать конфигурацию и выполнять команды внутри контейнера. Bash обеспечивает более удобную интерактивную работу, а sh даёт максимальную совместимость с разными образами контейнеров.
docker exec, docker run и docker attach: сравнение
В Docker есть несколько команд для взаимодействия с контейнерами, но они решают разные задачи. Понимание того, когда использовать каждую из них, помогает избежать типичных ошибок, особенно при устранении неполадок или управлении рабочими нагрузками в продакшене.
|
Команда |
Что делает |
Создаёт новый контейнер |
Работает с запущенным контейнером |
Типичный сценарий |
|
docker run |
Создаёт и запускает новый контейнер из образа |
Да |
Нет |
Запуск приложения или сервиса |
|
docker exec |
Запускает новую команду или оболочку внутри существующего контейнера |
Нет |
Да |
Отладка, обслуживание, выполнение разовых команд |
|
docker attach |
Подключается к основному процессу контейнера и его стандартному вводу/выводу |
Нет |
Да |
Просмотр основного приложения или взаимодействие с ним |
Для большинства задач администрирования и устранения неполадок рекомендуется использовать docker exec, поскольку эта команда позволяет работать внутри запущенного контейнера, не вмешиваясь в его основной процесс.
Заключение
В этом гайде рассмотрены различные способы взаимодействия с Docker-контейнерами: выполнение команд в неинтерактивном режиме, доступ к интерактивной оболочке, использование переменных окружения, а также выполнение docker exec от имени root и другого пользователя. Эти методы дают гибкость в управлении Docker-контейнерами. Подробнее смотрите в официальной документации docker exec.
Нужна надёжная среда для ваших контейнеров? Разверните свои экземпляры Docker на высокопроизводительных серверах BlueVPS.com.ua с безлимитным трафиком, масштабируемыми ресурсами и выделенной хостинг-средой.
Blog