Доступ к контейнерам с помощью Exec

DockerBeginner
Практиковаться сейчас

Введение

В этой лабораторной работе вы научитесь входить в запущенный контейнер Docker. Это важный навык отладки: хотя контейнеры рассчитаны на одноразовое использование, часто необходимо изучить рабочее окружение, чтобы понять, что происходит внутри.

Чтобы просмотреть файлы, проверить запущенные процессы или устранить неполадки в контейнере, обычно требуется командная оболочка внутри его окружения. Команда docker exec позволяет запустить дополнительную команду в уже работающем контейнере, не пересоздавая и не перезапуская его.

Слово «дополнительную» здесь особенно важно. docker exec не заменяет основной процесс контейнера. Команда запускает другой процесс в тех же пространствах имён контейнера, пока исходная служба продолжает работать.

В этой лабораторной работе вы выполните следующие действия:

  • Запустите контейнер Nginx в фоновом режиме.
  • С помощью docker exec запустите внутри контейнера интерактивную оболочку Bash.
  • Выполните в контейнере команды, чтобы определить его операционную систему.
  • Выйдите из контейнера и вернитесь в терминал хост-системы.

Запуск контейнера в фоновом режиме

На этом шаге вы запустите новый контейнер Docker, используя образ Nginx. Контейнер будет работать в режиме «detached», то есть в фоновом режиме. Кроме того, вы зададите ему имя, чтобы позднее к нему было проще обращаться.

Выполните в терминале следующую команду:

docker run -d --name web1 nginx

Разбор команды:

  • docker run: команда для создания и запуска контейнера.
  • -d: запускает контейнер в режиме detached (в фоновом режиме).
  • --name web1: присваивает контейнеру имя web1.
  • nginx: образ, который будет использоваться.

Проверьте, что контейнер запущен:

docker ps

В списке активных контейнеров должен появиться web1.

Контейнер должен работать, потому что docker exec подключается к уже существующему активному контейнеру. Эта команда не может запустить оболочку в контейнере, который уже остановлен.

Вход в контейнер

Теперь, когда контейнер запущен, с помощью команды docker exec вы запустите внутри него сеанс оболочки. Это фактически «выполнит вход» в контейнер — примерно так же, как при подключении к удалённому серверу по SSH.

Выполните следующую команду:

docker exec -it web1 bash

Разбор команды:

  • docker exec: выполняет команду внутри существующего контейнера.
  • -it: эта комбинация необходима для интерактивных сеансов.
    • -i (interactive): оставляет поток ввода открытым.
    • -t (tty): выделяет псевдотерминал, благодаря чему оболочка работает как обычная командная строка.
  • web1: имя целевого контейнера.
  • bash: команда, которую нужно выполнить внутри контейнера. В данном случае запускается оболочка Bash.

Таким образом, docker exec означает: «выполнить эту команду внутри контейнера». Оболочка — лишь один из распространённых вариантов использования. Вместо неё можно было бы запустить ls, cat или утилиту для отладки.

Обратите внимание на изменение:

После выполнения команды приглашение оболочки изменится. Оно будет выглядеть примерно так: root@<container-id>:/#.

Это означает, что теперь вы выполняете команды внутри контейнера, изолированно от хост-системы.

Такая изоляция обычно включает отдельное представление файловой системы, отдельное пространство имён процессов и отдельный сетевой контекст. При этом используется то же ядро, но теперь вы работаете в ограниченном окружении контейнера, а не видите всё окружение хост-системы.

Изучение окружения контейнера

Теперь вы находитесь внутри контейнера. Файловая система, которую вы видите, принадлежит контейнеру, а не окружению LabEx. Это можно проверить, просмотрев сведения об операционной системе.

Выполните следующую команду в оболочке контейнера:

cat /etc/os-release

Вы увидите сведения о дистрибутиве Linux, который используется в образе Nginx (обычно это Debian).

Пример вывода:

PRETTY_NAME="Debian GNU/Linux 11 (bullseye)"
NAME="Debian GNU/Linux"
...

Это подтверждает, что у контейнера есть собственное изолированное окружение операционной системы, отдельное от хост-системы.

Точнее говоря, контейнер имеет собственную пользовательскую файловую систему и собственное окружение процессов. Это не отдельное ядро, но изнутри контейнер всё равно может выглядеть как небольшая самостоятельная система Linux.

Выход и возврат на хост-систему

Когда вы закончите отладку или изучение контейнера, выйдите из сеанса оболочки, чтобы вернуться на хост-систему.

Введите в контейнере следующую команду:

exit

После нажатия клавиши Enter приглашение оболочки должно вернуться к стандартному приглашению пользователя LabEx.

Что произошло?

Вы закрыли процесс Bash внутри контейнера. Однако сам контейнер (web1) продолжает работать в фоновом режиме, поскольку основной процесс — Nginx — всё ещё активен.

Это важный принцип жизненного цикла при использовании docker exec: завершение интерактивной оболочки не останавливает контейнер, если только эта оболочка не была основным процессом, определяющим срок его работы.

Проверить это можно следующей командой:

docker ps

web1 по-прежнему будет указан в списке.

Чтобы удалить контейнер, можно остановить его и удалить принудительно:

docker rm -f web1

Итоги

В этой лабораторной работе вы научились получать доступ к запущенному контейнеру с помощью docker exec -it. Вы попрактиковались в следующем:

  • Запускали контейнер в фоновом режиме.
  • Входили в контейнер с помощью интерактивной оболочки Bash.
  • Проверяли окружение внутри контейнера.
  • Безопасно выходили из контейнера, оставляя службу запущенной.

Это базовый навык работы с Docker: он позволяет напрямую устранять неполадки в приложениях и изучать окружение контейнеров.