docker exec — как войти в контейнер Docker

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

Вся рубрика 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 bashdocker 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 скопирует файл без запуска.

Оцените статью
0 0 голоса
Рейтинг статьи
Подписаться
Уведомить о
guest

0 комментариев
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии
0
Оставьте комментарий! Напишите, что думаете по поводу статьи.x