Лаб. работа “Основы Docker. Управление контейнерами”
Лабораторная работа по теме “Основы Docker. Управление контейнерами”
Цель работы
Изучить основные концепции технологии контейнеризации Docker. Получить практические навыки поиска и загрузки образов, запуска, остановки и управления жизненным циклом контейнеров с использованием различных параметров командной строки.
Краткие теоретические сведения
Контейнеризация — это метод виртуализации на уровне операционной системы, который позволяет упаковывать приложение и его зависимости в изолированную среду, называемую контейнером. В отличие от виртуальных машин, контейнеры не включают в себя гостевую ОС, а используют ядро хост-системы. Это делает их легковесными, быстрыми и портативными.
Docker — это открытая платформа для разработки, доставки и запуска контейнеризированных приложений. Ключевые компоненты Docker:
- Docker Engine: фоновая служба (демон), которая управляет созданием и запуском контейнеров.
- Образ (Image): шаблон для чтения, содержащий инструкции для создания контейнера. Образ включает в себя код приложения, библиотеки, переменные окружения и файлы конфигурации.
- Контейнер (Container): запущенный экземпляр образа. Он является изолированным процессом в системе со своим собственным окружением.
- Реестр (Registry): хранилище для образов. Самый известный публичный реестр — Docker Hub.
Rootless Docker — это режим работы Docker, который позволяет пользователям без правroot запускать и управлять контейнерами. Это значительно повышает безопасность системы, так как потенциальный прорыв из контейнера не предоставит злоумышленнику привилегий суперпользователя на хост-машине. В этом режиме демон Docker и контейнеры запускаются в пространстве имен пользователя.
Краткий справочник по параметрам командной строки Docker
При работе с Docker вы будете постоянно использовать параметры (флаги) для уточнения команд. Ниже приведены наиболее распространенные из них.
Основная команда:docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
Эта команда создает и запускает новый контейнер из указанного образа.
-dили--detach: Запускает контейнер в фоновом (detached) режиме. Управление возвращается в терминал, а контейнер продолжает работать в фоне.-iили--interactive: Оставляет поток стандартного ввода (STDIN) открытым, позволяя взаимодействовать с контейнером.-tили--tty: Выделяет псевдо-терминал (TTY), что необходимо для работы с командной оболочкой внутри контейнера. Часто используется в связке-it.-p <порт_хоста>:<порт_контейнера>или--publish: Пробрасывает порт из контейнера на хост-машину. Например,-p 8080:80сделает порт 80 контейнера доступным на порту 8080 хоста.--name <имя>: Присваивает контейнеру человекочитаемое имя. Если не указать, Docker сгенерирует случайное имя (например,vigilant_murdock).--rm: Автоматически удаляет контейнер после его остановки. Удобно для короткоживущих задач, чтобы не засорять систему остановленными контейнерами.-e <КЛЮЧ>=<ЗНАЧЕНИЕ>или--env: Устанавливает переменную окружения внутри контейнера. Например,-e "APP_MODE=production".-v <путь_на_хосте>:<путь_в_контейнере>или--volume: Монтирует директорию или файл с хост-машины внутрь контейнера. Это позволяет сохранять данные или изменять конфигурацию “на лету”.
Другие полезные команды и их параметры
docker ps [OPTIONS](просмотр контейнеров)-aили--all: Показывает все контейнеры, включая остановленные. По умолчанию отображаются только запущенные.-qили--quiet: Выводит только числовые идентификаторы контейнеров.
docker images [OPTIONS](просмотр образов)-aили--all: Показывает все образы, включая промежуточные слои.
docker exec [OPTIONS] CONTAINER COMMAND(выполнение команды в запущенном контейнере)-it: Позволяет запустить интерактивную сессию (например, оболочкуbash) в уже работающем контейнере.
docker rm [OPTIONS] CONTAINER...(удаление контейнеров)-fили--force: Принудительно удаляет контейнер, даже если он запущен (не рекомендуется, лучше сначала остановить черезdocker stop).
docker rmi [OPTIONS] IMAGE...(удаление образов)-fили--force: Принудительно удаляет образ, даже если на его основе есть контейнеры.
Требования к окружению
- Операционная система: Debian 13 “Trixie” или новее.
- Доступ в Интернет.
- Учетная запись пользователя без прав
root(стандартный пользователь).
Порядок выполнения работы
Часть 1. проверка работа Docker
Проверка установки. Убедитесь, что Docker Engine запущен и работает корректно.
Вы должны увидеть информацию о клиенте и сервере (в секции
Serverне должно быть ошибок).Запуск первого контейнера. Команда
hello-world— стандартный способ проверить работоспособность Docker.Если вы видите приветственное сообщение от Docker, значит, установка прошла успешно.
Часть 2. Работа с образами
Поиск образов в Docker Hub. Найдем официальный образ веб-сервера
nginx.В выводе вы увидите список образов. Образы с пометкой
[OK]в столбцеOFFICIALявляются официальными сборками от разработчиков ПО.Загрузка образа. Скачаем последнюю версию (
latest) образаnginxи легковесный образalpineиз Docker Hub.Просмотр списка локальных образов. Выведем список всех образов, которые были загружены на вашу машину.
Обратите внимание на столбцы:
REPOSITORY(имя),TAG(версия),IMAGE ID(уникальный идентификатор),CREATEDиSIZE.Удаление образа. Удалим образ
hello-world, так как он больше не нужен.Примечание: Нельзя удалить образ, если на его основе запущен или существует остановленный контейнер. Сначала нужно удалить контейнер.
Часть 3. Запуск и управление контейнерами
Запуск контейнера в интерактивном режиме. Запустим контейнер на основе
alpineи выполним в нем командуls -l. Контейнер завершит работу сразу после выполнения команды.Теперь запустим контейнер с доступом к его командной оболочке (
sh).- Ключ
-i(--interactive) оставляетSTDINоткрытым. - Ключ
-t(--tty) выделяет псевдо-терминал.
Вы окажетесь внутри командной строки контейнера. Выполните несколько команд (
whoami,pwd,exitдля выхода).- Ключ
Запуск контейнера в фоновом (detached) режиме. Запустим веб-сервер
nginxв фоновом режиме.- Ключ
-d(--detach) запускает контейнер в фоне. - Ключ
--nameзадает удобное имя для контейнера. - Ключ
-p(--publish) пробрасывает порт. Формат:[хост_порт]:[контейнер_порт].
В rootless-режиме пользователь не может использовать порты ниже 1024. Поэтому мы пробросим порт 80 контейнера на порт 8080 хоста.
- Ключ
Просмотр списка запущенных контейнеров.
Эта команда покажет все активные контейнеры. Для просмотра всех контейнеров (включая остановленные) используйте ключ
-a.Проверка работы веб-сервера. Откройте браузер и перейдите по адресу
http://localhost:8080или используйтеcurl.Вы должны увидеть приветственную страницу Nginx.
Просмотр логов контейнера. Посмотрим логи запущенного контейнера
web-server.Выполнение команд внутри работающего контейнера. Используем
docker exec, чтобы запустить командуlsвнутри контейнераweb-serverбез подключения к нему.Теперь подключимся к командной оболочке запущенного контейнера.
Вы окажетесь внутри работающего контейнера Nginx. Введите
exitдля выхода.Остановка и запуск контейнера.
Удаление контейнера. Чтобы удалить контейнер, его необходимо сначала остановить.
Часть 4. Очистка системы
Docker может оставлять после себя много “мусора”: остановленные контейнеры, неиспользуемые образы и сети.
Удаление всех остановленных контейнеров.
Система запросит подтверждение.
Полная очистка системы. Команда
docker system pruneудаляет все остановленные контейнеры, неиспользуемые сети, образы без тегов (dangling images) и кэш сборки.Ключ
-aудаляет все неиспользуемые образы, а не только “висячие”. Используйте с осторожностью!
Задания для самостоятельного выполнения
Запуск контейнера с определенной версией ПО. Найдите в Docker Hub образ базы данных
postgres. Используя теги, загрузите и запустите контейнер с версией 14.12 (postgres:14.12). Присвойте контейнеру имяmy-postgres.Подсказка: Для запуска PostgreSQL требуется установить пароль суперпользователя через переменную окружения
POSTGRES_PASSWORD.Пример команды для справки:
Работа с томами (volumes) для сохранения данных. Создайте в своей домашней директории папку
my_web_contentи в ней файлindex.htmlсо следующим содержанием:<h1>Hello from my local machine!</h1>. Запустите контейнерnginx, но на этот раз “подключите” вашу локальную папкуmy_web_contentвнутрь контейнера по пути/usr/share/nginx/html. Используйте флаг-v. Проверьте, что при обращении кhttp://localhost:8080(или на каком порту вы запустили nginx) отображается ваше сообщение. Измените содержимое файлаindex.htmlна хосте и обновите страницу в браузере. Изменения должны примениться мгновенно.Использование флага
--rmЗапустите контейнерalpineс командойecho "This container will be removed"и флагом--rm. После выполнения команды убедитесь (с помощьюdocker ps -a), что контейнер не остался в списке остановленных.Получение детальной информации о контейнере. Запустите любой контейнер (например,
nginx) в фоновом режиме. Используя командуdocker inspect <имя_или_id_контейнера>, найдите и выпишите в отчет внутренний IP-адрес этого контейнера.Очистка ресурсов по фильтру. Создайте несколько контейнеров
alpine, выполнив командуdocker run alpine sleep 1несколько раз. Некоторые из них завершатся. Затем запустите один контейнер в фоновом режиме с долгой командой:docker run -d --name long-runner alpine sleep 300. С помощью одной команды удалите все контейнеры, которые имеют статусexited(завершен).Подсказка:
docker container pruneделает это, но попробуйте составить команду самостоятельно, используяdocker ps -aс фильтрами иdocker rm.
Контрольные вопросы
- В чем ключевое отличие контейнера от виртуальной машины?
- Что такое образ Docker и что такое контейнер Docker? Какая между ними связь?
- Каково основное преимущество использования Docker в
rootlessрежиме? - Объясните назначение ключей
–d,-p,-itв командеdocker run. - Как посмотреть логи контейнера, запущенного в фоновом режиме?
- В чем разница между командами
docker stopиdocker rm? - Как выполнить команду
cat /etc/os-releaseвнутри уже запущенного контейнера с именемmy-container?
Требования к отчету
Отчет по лабораторной работе должен содержать:
- Титульный лист.
- Цель работы.
- Пошаговое описание выполнения работы с приведением всех вводимых команд и их выводов (можно в виде скриншотов или текстовых блоков).
- Письменные ответы на контрольные вопросы.
- Вывод, в котором необходимо кратко описать полученные знания и навыки.