Работа с контейнерами Docker: команды, SSH и копирование файлов

TL;DR
Чтобы выполнять команды внутри контейнеров Docker, используйте docker exec с флагами -it; для интерактивного доступа запускайте оболочку (/bin/bash). Для перемещения файлов между хостом и контейнером применяется docker cp, а для постоянного доступа лучше настраивать bind-mount или volume. Внимательно относитесь к правам, переменным окружения и секретам.
Быстрые ссылки
- Запуск команд в контейнерах
- Подключение по SSH к контейнеру
- Копирование файлов в контейнер и из него
Запуск команд в контейнерах
Чтобы выполнить команду в контейнере, потребуется его идентификатор контейнера (container ID) или имя контейнера, если вы задали его вручную. Список запущенных контейнеров можно получить командой:
docker psПосле этого используйте docker exec для запуска команды внутри контейнера. Примеры:
docker exec -it containerID tail /var/log/nginx/access.logdocker exec -it containerID ./script.shФлаги -it означают “interactive” и TTY — их обычно используют вместе, чтобы получить интерактивную сессию. Полезные дополнительные флаги:
- –workdir или -w — сменить рабочую директорию перед выполнением команды.
- –detach или -d — запустить процесс в фоновом режиме.
- –env или -e — задать переменные окружения для команды.
- –env-file — загрузить переменные окружения из файла (удобно и безопаснее для секретов).
- –privileged — запустить с расширенными правами (использовать осторожно).
- –user — выполнить команду от имени другого пользователя.
Важно: docker exec работает только для запущенных контейнеров. Чтобы внести постоянные изменения в приложение, лучше пересобрать образ и задеплоить новую версию, либо изменять данные в томах (volumes) или bind-монтах.
Примеры типичных задач
- Просмотр логов: docker exec -it containerID tail -n 200 /var/log/app.log
- Запуск миграций базы данных внутри контейнера приложения
- Отладка: запуск интерпретатора языка или утилит в интерактивной оболочке
Подключение по SSH к контейнеру
Вместо одиночной команды можно открыть интерактивную оболочку:
docker exec -it containerID /bin/bashБольшинство образов содержат минимальный набор утилит. Если /bin/bash отсутствует, попробуйте /bin/sh. Это подключение доступно только с хоста и удобно для отладки. Если нужно, чтобы контейнер был доступен через SSH как VPS, можно установить и запустить SSH-сервис внутри контейнера, но это меняет модель безопасности и оркестрации: контейнеры обычно не предназначены для полноценного SSH-доступа.
Важно:
- Не включайте SSH в контейнер без острой необходимости; лучше использовать инструменты оркестрации (docker exec, kubectl exec) для отладки.
- Если всё же ставите SSH, настройте ключи и ограничьте доступ по сети.
Копирование файлов в контейнер и из него
Команда docker exec удобна для команд, но для работы с файловой системой удобнее docker cp. Примеры:
docker cp container:/var/log/nginx/example.log example.logdocker cp nginx:/etc/nginx/ nginxconfig/docker cp копирует файлы и директории между хостом и контейнером. Если вам нужно постоянное или программируемое совместное хранение данных, рассмотрите bind-mount или docker volume — они делают файлы сразу доступными из хоста без копирования.
Когда этот подход не подходит
- Контейнер остановлен: docker exec и docker cp не работают с остановленными контейнерами (docker cp частично работает с архивами, но целесообразнее монтировать тома или запустить контейнер).
- Ограниченные возможности образа: в минимальных образах может не быть нужных утилит.
- Требуется масштабирование: ручной доступ к контейнерам не масштабируется для CI/CD и кластеров.
Альтернатива: используйте тома и bind-mounts для доступа к файлам, CI/CD для деплоя и логирование в централизованные системы (ELK, Prometheus, внешние сервисы) вместо ручного вытягивания логов.
Безопасность и работа с секретами
- Не передавайте секреты через аргументы команд в открытом виде. Используйте –env-file и Docker secrets (в Docker Swarm) или секреты оркестратора.
- Не используйте –privileged без крайней необходимости.
- Ограничьте сеть и права пользователя внутри контейнера через –user и capability drops.
Быстрая шпаргалка (cheat sheet)
- Список контейнеров: docker ps
- Запустить команду интерактивно: docker exec -it
- Открыть оболочку: docker exec -it
/bin/bash - Копировать файл из контейнера: docker cp
:/path/to/file ./ - Копировать файл в контейнер: docker cp ./localfile
:/path/to/ - Запустить фоновой процесс: docker exec -d
Роли и чек-листы
Разделим действия по ролям, чтобы ускорить повседневные операции.
Developer:
- Проверить docker ps и выбрать контейнер.
- Открыть оболочку через docker exec -it.
- Извлечь логи через docker cp или перенаправление STDOUT.
- Не править конфигурации вручную в контейнере — фиксировать изменения в коде и образе.
Sysadmin/DevOps:
- Использовать тома/volume для постоянных данных.
- Настроить мониторинг и централизованное логирование.
- Контролировать доступ SSH/сетевые правила.
- Автоматизировать обновления образов и деплой через CI/CD.
Методика быстрого восстановления (микро-плейбук)
- Проверка статуса: docker ps / docker logs
- Если контейнер упал — просмотреть логи: docker logs
- Если нужно срочно получить файлы — docker cp
:/path ./ - Для изменений — пересобрать образ и развернуть новую версию, не менять критичные файлы вручную.
Дерево принятия решения (Mermaid)
graph TD
A[Нужно выполнить команду?] -->|Да| B{Контейнер запущен?}
B -->|Да| C[docker exec -it]
B -->|Нет| D[Запустить контейнер или монтировать том]
A -->|Нет, нужно файлы| E{Доступ к файлам нужен часто?}
E -->|Да| F[Настроить bind-mount/volume]
E -->|Нет| G[docker cp]Критерии приёмки
- Удалённая команда выполняется и возвращает ожидаемый результат внутри контейнера.
- Логи доступны локально либо в централизованном хранилище.
- Изменения в конфигурации задокументированы и применяются через пересборку образа.
- Секреты не передаются в явном виде через командную строку.
Глоссарий (одной строкой)
- container ID — уникальный идентификатор запущенного контейнера.
- docker exec — команда для выполнения процессов внутри контейнера.
- docker cp — команда для копирования файлов между хостом и контейнером.
- bind-mount / volume — способы постоянного хранения данных для контейнеров.
Заключение
docker exec и docker cp дают гибкость для отладки и простых операций с контейнерами, но при регулярной работе лучше полагаться на тома и автоматизацию. Соблюдайте принципы безопасности: не раскрывайте секреты и не давайте повышенных привилегий без необходимости.
Важно: для стабильных и воспроизводимых изменений пересобирайте образы и используйте CI/CD.
Краткое содержание:
- Используйте docker exec -it для интерактивных команд и оболочек.
- Применяйте docker cp для копирования файлов между хостом и контейнером.
- Для постоянного доступа используйте bind-mounts/volumes.
- Следите за безопасностью и автоматизируйте деплой.
Похожие материалы
Несколько аккаунтов Skype: Multi Skype Launcher
Журнал для работы: повысить продуктивность
Персональные звуки уведомлений на Android
Скачивание шоу Hulu для офлайн‑просмотра
Microsoft Start: персонализированная новостная лента