Есть несколько способов получить доступ к запущенному контейнеру:
docker exec: Самый распространенный и рекомендуемый способ. Он запускает команду в уже работающем контейнере.
docker attach: Присоединяется к STDIN, STDOUT и STDERR уже запущенного контейнера. Обычно используется для взаимодействия с основным процессом контейнера.
SSH-сервер внутри контейнера: Менее распространенный подход, требующий добавления SSH-сервера в образ через Dockerfile. Не всегда рекомендуется из соображений безопасности и сложности управления.
Инструменты отладки хоста: В некоторых случаях можно использовать инструменты мониторинга и отладки хостовой системы (например, nsenter) для инспекции процессов внутри пространства имен контейнера.
Наиболее гибким и безопасным является использование docker exec.
Пример использования docker exec для получения интерактивной оболочки (например, bash или sh):
bash
Чтобы узнать ID или имя запущенного контейнера:
bash
Пример использования docker attach:
bash
Сравнение docker exec и docker attach:
| Возможность | docker exec | docker attach |
|---|---|---|
| Запуск новой команды | Да | Нет |
| Взаимодействие с STDIN/STDOUT/STDERR основного процесса | Нет (по умолчанию) | Да |
| Выход без остановки контейнера | Да | Нет (по умолчанию) |
| Несколько подключений | Да (каждое подключение - новый процесс) | Да (все подключения к одному процессу) |
В DevOps задача получения доступа к контейнеру чаще всего требуется для отладки или выполнения разовых команд, что делает docker exec предпочтительным инструментом. Добавление SSH внутрь контейнера нарушает принцип "один процесс на контейнер" и увеличивает сложность образа.