docker exec выполняет команду внутри уже запущенного контейнера. Чаще всего используют для входа в интерактивную оболочку — посмотреть файлы, запустить команду, отладить проблему.

- Базовый синтаксис
- Войти в оболочку bash
- Когда bash недоступен — используй sh
- Выполнить команду без входа в оболочку
- Запустить от другого пользователя
- Практические сценарии отладки
- docker exec vs docker attach — в чём разница
- Частые ошибки
- Часто задаваемые вопросы
- docker exec или docker attach — что использовать?
- Как выйти из контейнера не остановив его?
- Можно ли выполнить команду в остановленном контейнере?
- Что читать дальше по Docker
Базовый синтаксис
docker exec [ФЛАГИ] КОНТЕЙНЕР КОМАНДА [АРГУМЕНТЫ]
# КОНТЕЙНЕР — имя или ID запущенного контейнера
Войти в оболочку bash
# Сначала запустить контейнер в фоне
docker run -d --name my-nginx nginx
# Войти в bash
docker exec -it my-nginx bash
# root@abc123:/# ← ты внутри контейнера
# Внутри — работаешь как в обычном Linux терминале
ls /etc/nginx/
cat /etc/nginx/nginx.conf
ps aux
env
# Выйти (контейнер продолжает работать!)
exit
Когда bash недоступен — используй sh
# Alpine-based образы не содержат bash
docker run -d --name my-redis redis:7-alpine
docker exec -it my-redis bash
# OCI runtime exec failed: exec: "bash": executable file not found
# Используй sh
docker exec -it my-redis sh
# /data # ← работает!
# Правило: не работает bash → пробуй sh
Выполнить команду без входа в оболочку
# Просмотреть конфиг
docker exec my-nginx cat /etc/nginx/nginx.conf
# Список файлов
docker exec my-nginx ls -la /var/www/html
# Переменные окружения контейнера
docker exec my-nginx env
# Процессы
docker exec my-nginx ps aux
# Проверить подключение к БД из контейнера приложения
docker exec my-app curl -s http://db:5432
# Установить пакет (временно, исчезнет при пересоздании контейнера)
docker exec my-nginx apt update
docker exec my-nginx apt install -y curl
Запустить от другого пользователя
# Выполнить от пользователя www-data
docker exec -it --user www-data my-nginx bash
# Стать root (даже если контейнер запущен от другого пользователя)
docker exec -it --user root my-app bash
# Указать по UID:GID
docker exec -it --user 1000:1000 my-app bash
Практические сценарии отладки
# Посмотреть файловую систему
docker exec -it my-app sh
find /app -name "*.log"
ls -la /tmp/
cat /proc/1/environ # переменные окружения PID 1
# Проверить конфигурацию nginx
docker exec my-nginx nginx -t
# nginx: configuration file /etc/nginx/nginx.conf test is successful
# Перезагрузить nginx без остановки контейнера
docker exec my-nginx nginx -s reload
# Проверить Python зависимости
docker exec my-python-app pip list
# Выполнить SQL запрос в PostgreSQL контейнере
docker exec my-postgres psql -U postgres -c "SELECT version();"
# Проверить доступность сервиса
docker exec my-app ping db -c 3
docker exec my-app curl -s http://redis:6379
docker exec vs docker attach — в чём разница
# docker attach — подключиться к основному процессу (PID 1) контейнера
docker attach my-nginx
# ⚠️ Ctrl+C убьёт контейнер!
# Безопасный выход: Ctrl+P затем Ctrl+Q
# docker exec — запустить НОВЫЙ процесс в контейнере
docker exec -it my-nginx bash
# Ctrl+D или exit — контейнер продолжает работать ✅
| docker exec -it bash | docker attach | |
|---|---|---|
| Что делает | Запускает новый процесс bash | Подключается к PID 1 |
| Выход | exit / Ctrl+D — безопасно | Ctrl+C убивает контейнер |
| Использовать | ✅ Почти всегда | ⚠️ Редко, только для отладки |
| Видит stdout PID 1 | Нет | Да |
Вывод: почти всегда используй docker exec, не docker attach.
Частые ошибки
«Error response from daemon: Container is not running»:
Контейнер остановлен. Запустить: docker start container_name, потом docker exec.
«executable file not found in $PATH: bash»:
bash не установлен в образе (часто в Alpine). Используй sh: docker exec -it container sh.
Изменения в файлах не сохраняются:
Контейнер — эфемерен. Изменения в файловой системе теряются при docker rm. Для постоянных данных используй volumes. Для изменений конфигов — пересобирай образ через Dockerfile.
Часто задаваемые вопросы
docker exec или docker attach — что использовать?
Почти всегда docker exec -it container bash. Это создаёт новую сессию — выход через exit не затрагивает контейнер. docker attach подключается к stdout/stdin основного процесса — это полезно только когда нужно видеть интерактивный вывод PID 1. Проблема attach: нажатие Ctrl+C пошлёт SIGINT основному процессу и может остановить контейнер.
Как выйти из контейнера не остановив его?
При использовании docker exec -it bash — просто набери exit или нажми Ctrl+D. Сессия bash завершится, но контейнер продолжит работать. При использовании docker attach — безопасный выход: Ctrl+P затем Ctrl+Q (последовательность escape). Ctrl+C при attach = SIGINT для PID 1.
Можно ли выполнить команду в остановленном контейнере?
Нет — docker exec работает только с запущенными контейнерами. Для остановленного сначала выполни docker start container_name, потом docker exec. Если нужно просто посмотреть файлы остановленного контейнера — docker cp container:/path ./local скопирует файл без запуска.
Что читать дальше по Docker
Чтобы связать тему с соседними практическими материалами, дальше удобно открыть:
- docker run — вернуться к запуску контейнера.
- docker logs — проверить логи перед отладкой.
- Docker network — разобрать сетевое взаимодействие контейнеров.



