Короткий ответ
Команда docker exec -it CONTAINER sh (или bash, если он есть в образе) запускает новый процесс в тех же namespaces, что и уже работающий контейнер, не перезапуская и не останавливая его.
Как это работает подробнее
docker exec не создаёт новый контейнер, а добавляет ещё один процесс в существующие Linux namespaces уже запущенного контейнера (тот же сетевой стек, та же файловая система на момент выполнения). Флаги -i и -t обеспечивают интерактивный терминал.
Пример кода
Пример конфигурации
$ docker exec -it web sh
/ # ps aux
PID USER COMMAND
1 root nginx: master process
7 root sh
/ # curl -s -o /dev/null -w "%{http_code}" http://localhost:80
200Что использовать на практике
- Практика. типичный способ диагностики "живого" контейнера — зайти внутрь и проверить процессы, переменные окружения, содержимое файлов, сетевую доступность (
ps aux,env,curl localhost:...,cat /etc/resolv.conf). Это работает только если в образе есть исполняемый shell; для минимальных/distroless образов такой shell может отсутствовать.
Подводные камни
- Риск. путают
docker execсdocker attach—attachподключается к основному процессу (PID 1) контейнера и может случайно его завершить приCtrl+C, тогда какexecсоздаёт отдельный независимый процесс и безопаснее для диагностики.