Материал подготовлен командой Simple-Server для администраторов VPS и выделенных серверов. Команды и пути проверяйте на тестовой машине перед production.
Как пользоваться docker exec: параметры и примеры
Перед использованием необходимо удостовериться, что Docker установлен и контейнер работает. Если только начинаете, ознакомьтесь с руководством по установке Docker на Ubuntu 22.04.
Базовый синтаксис docker exec такой:
docker exec [опции] <контейнер> <команда>-
<контейнер>— имя или ID целевого контейнера; -
<команда>— инструкция, которую нужно выполнить внутри него.
<контейнер> — имя или ID целевого контейнера;
<команда> — инструкция, которую нужно выполнить внутри него.
-i— активирует режим ввода;-t— подключает псевдотерминал, это полезно для запуска bash;-d— выполняет задачу на фоне;-u— позволяет запускать команду от указанного пользователя;-e— задает переменные окружения;-w— устанавливает директорию, в которой будет выполняться команда.
Пример запуска bash внутри контейнера:
docker exec -it my_container /bin/bashТаким образом можно без остановки контейнера получить доступ к его среде и выполнять команды напрямую.
Примеры использования команды
- Получение списка файлов внутри контейнера:
Получение списка файлов внутри контейнера:
- Выполнение команд с root-доступом:
Выполнение команд с root-доступом:
docker exec -u root my_container whoami- Передача переменных окружения:
Передача переменных окружения:
docker exec -e DEBUG=true my_container env- Установка рабочей директории:
Установка рабочей директории:
docker exec -w /var/www my_container ls
docker exec -d my_container touch /tmp/testfile- Проверка конфигурации Nginx в контейнере перед его перезапуском:
Проверка конфигурации Nginx в контейнере перед его перезапуском:
docker exec -it nginx_container nginx -tРассмотрим типовые, но немного более сложные сценарии, которые могут пригодиться в повседневной работе: запуск от имени другого пользователя, передача нескольких переменных окружения, указание рабочей директории и т. д.
- Выполнение от имени веб-пользователя:
Выполнение от имени веб-пользователя:
docker exec -u www-data my_container ls -la /var/www- Установка сразу нескольких переменных окружения:
Установка сразу нескольких переменных окружения:
docker exec -e DEBUG=true -e STAGE=dev my_container env- Задание рабочей директории с правами администратора:
Задание рабочей директории с правами администратора:
docker exec -u root -w /opt/app my_container lsПример работы с Laravel в Simple-Server
Если вы разворачиваете Laravel-приложение в контейнере на сервере Simple-Server, docker exec очень вам пригодится. Допустим, у вас есть контейнер с Laravel и база данных в отдельном сервисе.
Чтобы подключиться к серверу:
После подключения можно выполнять команды Artisan — встроенного командного интерфейса Laravel — внутри контейнера.
docker exec -it laravel_app php artisan cache:clear
docker exec -it laravel_app php artisan migrate- Проверить статус очередей:
Проверить статус очередей:
docker exec -it laravel_app php artisan queue:listen
docker exec -u www-data -it laravel_app php artisan config:cache- Сделать бэкап базы данных, развернутой в отдельном контейнере:
Сделать бэкап базы данных, развернутой в отдельном контейнере:
docker exec -it mariadb_container mysqldump -u root -p laravel_db > backup.sqlПеред выполнением последней команды убедитесь, что том для /backup смонтирован, или используйте SCP для передачи файла на локальную машину.
Такой подход не требует изменения образа или прямого доступа в контейнер, что делает администрирование безопасным и гибким.
Такой подход позволяет безопасно и быстро взаимодействовать с Laravel-приложением в контейнере, не прибегая к пересборке образа или правке Dockerfile.
Расширенные возможности команды docker exec
В этом разделе рассмотрим менее распространенные, но более гибкие варианты применения команды docker exec: например, запуск psql в контейнере PostgreSQL, выполнение Node.js-скриптов, подключение к остановленным контейнерам. Эти кейсы показывают, насколько гибкой может быть команда, если требуется что-то нестандартное.
Команда не ограничивается только базовыми задачами: помимо запуска shell или bash, вы можете работать с окружениями, взаимодействовать с базами данных, выполнять Node.js-скрипты и подключаться к любому запущенному контейнеру.
Примеры расширенного использования
docker exec -it postgres_container psql -U postgres -d my_db- Запуск Node.js-скрипта. Если у вас есть файл
script.js:
Запуск Node.js-скрипта. Если у вас есть файл script.js:
docker exec -it node_app node script.js- Запуск остановленного контейнера:
Запуск остановленного контейнера:
docker start my_container
docker exec -it my_container bash- Управление пользователем. Укажите пользователя явно с помощью параметра
-u:
Управление пользователем. Укажите пользователя явно с помощью параметра -u:
docker exec -u www-data my_container ls -la /var/www- Быстрое удаление временных файлов:
Быстрое удаление временных файлов:
docker exec -it my_container rm -rf /tmp/cache/*Такой подход удобно применять в крон-джобах или при ручной чистке временных директорий.
Когда не стоит использовать команду
Несмотря на удобство, docker exec — это инструмент ручного взаимодействия с контейнерами. В production-окружениях его использование может быть рискованным.
Почему не стоит использовать docker exec в продакшене:
- Изменения не сохраняются в Dockerfile — это может нарушить воспроизводимость и целостность инфраструктуры;
- Нет журналирования команд — сложно отследить действия;
- Возможна рассинхронизация с CI/CD-пайплайном.
Вместо этого рекомендуются:
- Dockerfile и docker-compose.yml : для воспроизводимых сборок;
- CI/CD : автоматизируйте задачи через GitHub Actions или GitLab CI;
- Мониторинг : логируйте процессы с помощью Prometheus, Grafana и Loki.
Частые ошибки и их решение
Рассмотрим ошибки, которые могут возникать в работе, и способы их устранения.
Причина : контейнер не найден или остановлен
Команда покажет список запущенных контейнеров. Если ваш контейнер отсутствует в этом списке — значит, он не работает или вовсе не создан.
exec failed: container not running
Причина : попытка выполнить команду в остановленном контейнере.
Решение : docker start <container_name>
Команда docker start запускает остановленный контейнер, после чего можно снова использовать docker exec.
Причина : недостаточно прав у пользователя.
Решение : docker exec -u root <container> <command>
Флаг -u root запускает команду от имени пользователя root, что дает расширенные права доступа внутри контейнера. Это особенно полезно при работе с системными файлами или конфигурациями.
Отличие docker exec от docker attach
Помимо docker exec, существует и другой способ взаимодействия с контейнером — команда docker attach. Она подключает вас напрямую к основному процессу, запущенному внутри контейнера, как если бы вы запускали его в терминале.
Это удобно, если нужно следить за логами или вводить данные напрямую, но есть риски: любые случайные нажатия (например, Ctrl+C) могут остановить контейнер. Поэтому важно понимать различия между этими командами.
Кроме того, docker attach требует наличия TTY (эмуляции терминала) — среды, имитирующей поведение классического терминала, необходимой для корректной работы интерактивных приложений вроде bash или sh.
| Параметр | docker exec | docker attach |
|---|---|---|
| Требуется ли TTY | По необходимости | Да |
| Множественные подключения | Да | Нет |
| Вмешивается ли в основной процесс | Нет | Да |
| Можно ли использовать для отладки | Да | Частично (может повредить приложение) |
Частично (может повредить приложение)
Применяйте docker exec для вспомогательных задач — это дает гибкость и снижает риски.
Нужен сервер для практики? Закажите VPS на Simple-Server — root-доступ, NVMe, DDoS-защита и поддержка 24/7.