Введение
В этой лабораторной работе вы научитесь входить в запущенный контейнер 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: он позволяет напрямую устранять неполадки в приложениях и изучать окружение контейнеров.



