Вы когда-нибудь нуждались в том, чтобы увидеть, что происходит внутри контейнера Docker? Контейнеры предназначены быть идемпотентными: если возникла проблема, перезапустите новый контейнер. Но часто жизнь не так проста. Вам нужно выполнить команды в контейнере, чтобы выявить проблему. Именно здесь может помочь команда docker exec
.
В этой статье вы узнаете, как выполнять команды в работающем контейнере Docker с использованием команды docker exec
.
### Предварительные требования
Чтобы следовать примерам в этой статье, вам потребуется соблюсти следующие условия:
- – Любая последняя версия Docker Desktop подходит для Windows, Linux или macOS. В данном руководстве используется версия v3.1.0, работающая на Windows 10.
### Запуск контейнера NGINX
Docker exec
выполняет команды в контейнерах. Но для этого сначала у вас должен быть контейнер, в котором будут выполняться эти команды. Давайте начнем с загрузки образа Docker и создания демонстрационного контейнера.
-
1. Создайте новый каталог, в данном руководстве используется C:\gitrepos\test, чтобы хранить файлы, используемые для контейнера.
2. Создайте файл с именем dockerfile (без расширения), содержащий следующий код. Dockerfile определяет шаги, необходимые для создания контейнера.
3. Затем создайте файл в том же каталоге с именем index.html, который содержит следующий код. Это файл HTML, который при запуске контейнера будет отображать сообщение “Hello, World”.
4. Теперь создайте контейнер Docker с Nginx. Поскольку Dockerfile находится в текущем рабочем каталоге, укажите .
, чтобы Docker знал, где искать. Также убедитесь, что вы помечаете контейнер с использованием t
параметра, чтобы обеспечить более удобную ссылку в будущем.

5. Теперь, когда контейнер построен, запустите его с помощью команды docker run.

6. Наконец, откройте веб-браузер и перейдите по адресу http://localhost/
, чтобы увидеть следующее.

Выполнение команд с помощью Docker Exec
При выполнении команд в контейнере Docker может потребоваться выполнение команды интерактивно. Интерактивное выполнение команд означает ввод команды, получение обратной связи, ввод следующей команды и так далее. Интерактивные команды захватывают вашу сессию и мешают вам выполнять другие действия.
Но что если вы уже знаете команды, которые нужно отправить в контейнер заранее, и хотите выполнять команды в фоновом режиме? В таком случае вы можете выполнить неинтерактивные команды. Неинтерактивные команды позволяют отправить команду в Docker и мгновенно вернуть управление консолью.
Нахождение имени и ID контейнера
Теперь, когда у вас есть созданный контейнер, вы можете выполнять команды внутри контейнера. Прежде чем выполнить команду, определите имя или ID контейнера NGINX. Для Docker-команд подойдет как имя, так и ID. С учетом этого запоминание ID может быть сложнее, чем имени!
Чтобы отобразить информацию о любом запущенном контейнере, выполните команду Docker ps
, чтобы получить следующую информацию.

Скопируйте уникальный идентификатор e17e4b6be01a
или случайно сгенерированное имя mystifying_chandrasekhar
в буфер обмена для последующего использования.
Выполнение неинтерактивной команды с помощью Docker Exec
В качестве примера выполнения неинтерактивной команды скопируйте и выполните следующую команду для вывода списка файлов в каталоге /var/log с использованием команды ls -l
. Передайте все после имени контейнера, mystifying_chandrasekhar
, в команду Docker exec
.

Избегание вывода в консоль с помощью команд Docker
Мгновенный возврат управления оболочке пользователю позволяет избежать блокировки консоли при выполнении крупных операций. Откажитесь от вывода в консоль с помощью отсоединенной опции d
. Приведенная ниже команда создает файл /tmp/execWorks с использованием команды touch
внутри контейнера и не отображает никакого вывода в консоли.
Выполнение интерактивных команд с помощью Docker Exec
До этого момента вы узнали, как выполнять неинтерактивные команды в контейнере Docker с помощью docker exec
. Но может возникнуть ситуация, когда вам нужно взаимодействовать с контейнером, например, когда необходимо выполнять команды в контейнере интерактивно. В таком случае вам потребуется выполнение команд в интерактивном режиме.
Для выполнения команд в интерактивном режиме с docker exec
необходимы две опции, i
и t
. Опция i
поддерживает открытым STDIN, что позволяет отправлять команды в контейнер, а опция t
выделяет псевдо-TTY (PTY), канал связи, для ввода команд.
Скопируйте и вставьте следующую команду, чтобы открыть интерактивный приглашающий к вводу командный интерфейс в работающем контейнере Docker с оболочкой Bourne (sh), как указано изменение приглашения на / #
.

После входа в оболочку выполните следующие команды, чтобы продемонстрировать перечисление файлов внутри контейнера. Наконец, выполните команду exit
, чтобы выйти из интерактивной оболочки.

Чтобы открыть интерактивный приглашающий знак в определенном каталоге, передайте путь к опции
w
, указав Docker’у запустить оболочку в указанном каталоге.
Передача переменных среды в запущенный контейнер
Многие программы используют переменные среды для установки конфигураций при запуске. Например, большинству приложений на Java требуется переменная среды JAVA_HOME
, чтобы указать путь к Java.
Вы можете передать переменные среды в сеанс, используя опцию e
. Например, возможно, вам нужно передать переменные среды с именем MYVAR
в запущенный контейнер. Для этого используйте опцию e
и укажите пару ключ/значение MYVAR="<some value>"
, как показано ниже.

Передача переменных среды с помощью файла
Если у вас много переменных среды или общая конфигурация, удобнее будет хранить эти переменные в файле. Передайте файл относительным или абсолютным путем к Docker с помощью опции --env-file
. Эта техника часто используется для передачи безопасных учетных данных контейнеру. Обязательно не добавляйте учетные данные в систему контроля версий!
Создайте текстовый файл с именем env-vars.txt
, содержащий переменные среды для передачи и их значения. Этот файл может иметь любое имя, и ему не нужно расширение файла .txt
.

Передайте переменные среды в Docker с помощью опции env-file
. Убедитесь, что переменные доступны с помощью команды echo
, как показано на скриншоте ниже.

Взаимодействие с запущенным контейнером от имени другого пользователя
В производственной среде приложения часто запускаются от имени определенного пользователя, чтобы ограничить их доступ. Если вы запускаете приложения от имени определенного пользователя в производственной среде, вам также следует делать это при тестировании команд.
В этом примере контейнер Docker запускается от имени пользователя nginx
. Передайте пользователя в опцию w
, чтобы указать Docker’у запустить контейнер от имени учетной записи nginx
. Команда whoami
, запущенная изнутри контейнера, подтверждает, что пользователь nginx
действительно используется.

nginx
user.Следующие шаги
Вы узнали, как выполнять команды в запущенном контейнере с помощью команды docker exec
. Используя команду exec
для входа и допроса запущенных контейнеров, у вас есть мощный новый инструмент в своем арсенале для устранения неполадок в контейнерах Docker.
Теперь попробуйте пойти еще дальше и использовать систему контроля версий Git для загрузки статического веб-сайта в контейнер, а не копировать один файл. Если Git для вас новый, то статья Руководство начинающего по Visual Studio Code и Git – отличное место для начала.