docker exec & Подключение

Тема дорожной карты · Docker & Containers

docker exec -it <container> sh запускает новый процесс внутри работающего контейнера, что позволяет легко отлаживать, мигрировать или просматривать логи без необходимости перезапуска сервиса. Команда docker attach, в свою очередь, подключает ваш терминал к PID 1 контейнера, но для отключения требуется выполнение escape-последовательности Ctrl-P Ctrl-Q. Важно отметить, что exec не функционирует для остановленных контейнеров; для таких случаев следует использовать docker run --rm с образом. Также важно учесть, что запущенный процесс наследует namespaces контейнера, но не наследует произвольные переменные окружения, пока не будут переданы с помощью -e ключа.

Как это работает

docker exec и docker attach оборачивают API daemon в удобные команды для управления контейнерами. docker pull и docker push перемещают образы между репозиториями; docker run создаёт и запускает контейнер из образа; docker exec запускает команду внутри уже запущенного контейнера; docker ps выводит список запущенных контейнеров, включая остановленные с помощью флага -a; docker logs стримит вывод стандартных потоков данных и ошибок; docker inspect возвращает полную информацию о любом ресурсе в формате JSON. Эти команды часто комбинируются для создания сложных конфигураций. Например, команда docker run --rm -it --name myapp -p 8080:80 -v $PWD:/app nginx запускает новый контейнер, который будет автоматически уничтожен после завершения работы, запускает интерактивную сессию, называет контейнер myapp, привязывает порт 8080 к порту 80 контейнера и монтирует текущую директорию в /app внутри контейнера.

Когда применять

docker run используется для быстрых, одностраничных тестов, запуска разовых CLI-инструментов и отладки. Для более сложных сценариев, таких как запуск сервиса, разработка в окружении или шаги CI, рекомендуется использовать docker compose. Файлы конфигурации docker-compose.yml позволяют легко ревьюить и версионировать конфигурации, что делает их предпочтительными по сравнению с длинными строками CLI-флагов. Команда docker exec -it <container> sh особенно полезна для отладки сбойного контейнера до пересборки или перезапуска.

Типичные ошибки

Типичные ошибки при использовании docker exec и docker attach включают забытые остановленные контейнеры, которые могут накапливать дисковое пространство, особенно если они не были запущены с флагом --rm. Также часто возникают проблемы, когда процесс запущен в фоновом режиме (-d), и пользователь забывает, как подключиться обратно. В этом случае можно использовать команды docker logs -f или docker attach для подключения к контейнеру. Кроме того, пользователи могут ошибочно полагать, что существующий контейнер автоматически подхватит изменения при каждом запуске команды docker run image cmd. В действительности, каждый запуск docker run создаёт новый контейнер, а не обновляет существующий. Для отслеживания использования дискового пространства, рекомендуется периодически использовать команду docker system df.

Связанные понятия

Полезные ресурсы