Как запустить команду в работающем контейнере Docker
Обычно вы хотите, чтобы приложения Docker были полностью изолированы, но иногда для целей разработки или автоматизации полезно иметь возможность работать с контейнерами Docker, как если бы это были виртуальные машины Linux. Docker предоставляет инструменты для запуска команд и даже целых оболочек внутри контейнеров.
Запуск команд в контейнерах
Чтобы запустить команду в контейнере, вам понадобится его идентификатор контейнера, если вы не настроили конкретное имя для этого контейнера. Это длинная шестнадцатеричная строка, которую вы можете найти в списке процессов Docker:
docker ps
Затем вы можете использовать команду exec -it
для запуска внутри контейнера. Например, просмотр вывода файла журнала:
docker exec -it containerID tail /var/log/nginx/access.log
Вы также можете запускать скрипты внутри контейнеров:
docker exec -it containerID script.sh
Флаги -it
предназначены для «интерактивного режима» и телетайпа соответственно и используются почти постоянно. Есть несколько других флагов, которые вы можете использовать:
--workdir
или-w
изменяет текущий каталог перед командой.--detach
или-d
запускает команду в фоновом режиме.--env
или-e
устанавливает переменные среды перед запуском.--env-file
делает то же самое, но более безопасен для обработки секретов.--privived
запускает команду с расширенными разрешениями.--user
запускается от имени другого пользователя
Конечно, это работает только на работающем контейнере. Если вы хотите приостановить работу контейнера для обслуживания, вам потребуется либо развернуть обновления с помощью новой версии образа, либо внести изменения в данные, подключенные к тому, из операционной системы хоста.
SSH-вход в контейнер
Вы не ограничены простыми командами, вы можете открыть оболочку, запустив /bin/bash
в качестве команды. Вы можете быть ограничены в доступных инструментах — большинство контейнеров имеют довольно простую установку Linux — но это значительно упрощает выполнение многих команд.
docker exec -it containerID /bin/bash
Это просто оболочка, доступная с хоста, которая в большинстве случаев работает хорошо. Но, если вы хотите, вы можете настроить свои контейнеры так, чтобы они были полностью доступны через SSH, например VPS. Вы можете узнать больше об этом в нашем руководстве по запуску службы SSH в контейнере Docker.
Копирование файлов в контейнеры и из них
Запуск команд с помощью exec -it
работает, но между хостом и контейнером все еще существует прослойка, препятствующая простому написанию сценариев. Во-первых, в то время как легко отправлять команды в контейнер, сложнее получить вывод из файловой системы.
Хотя вы можете передать STDOUT exec -it
другим службам в ОС хоста, вы также можете копировать файлы в файловую систему контейнера и из нее. Например, извлечение файла журнала и вставка его на хост:
docker cp container:/var/log/nginx/example.log example.log
Или вытащить целые каталоги:
docker cp nginx:/etc/nginx/ nginxconfig/
Однако, если вы делаете это регулярно, вы можете рассмотреть возможность использования привязки или монтирования тома, чтобы сделать данные напрямую доступными с хоста.