Пара 13: Docker: образ, контейнер и границы изоляции
90 минут · 3 курс, ML.
Содержание и результат
Запустить контейнер и объяснить различия между образом, процессом и виртуальной машиной.
План занятия
0–10: контекст и исходная задача. 10–40: устройство и механизмы. 40–55: демонстрация команд. 55–80: лабораторная работа. 80–90: разбор результата и фиксация исправлений.
Практика выполняется в своей учебной папке и на localhost. Подготовка окружения описана в lab/README.md.
Образ — рецепт готовой среды
Контейнер запускается из образа и получает собственное состояние.
Образ содержит файловую систему и настройки запуска. Контейнер — экземпляр с процессами и изменяемым слоем. Один образ можно использовать для нескольких контейнеров. Остановка не равна удалению, а удаление контейнера не удаляет автоматически исходный образ. Контейнер часто завершается, когда завершился его основной процесс. Нельзя считать контейнер маленьким сервером, где надо вручную устанавливать всё после старта: изменения будут трудно повторить. Для воспроизводимости обновляют Dockerfile и собирают новый образ.
Аналогия: чертёж формы, готовая форма и отдельные отливки.
Контейнер и VM
Контейнеры разделяют ядро среды, но имеют ограничения и пространства имён.
Namespaces дают отдельные представления процессов, сети и других ресурсов; cgroups позволяют учитывать и ограничивать ресурсы. Linux-контейнеры используют Linux-ядро хоста или виртуальной среды Docker Desktop. VM имеет своё ядро гостевой ОС; контейнер не обеспечивает такой же границы безопасности. Доступ к Docker daemon и группе docker на Linux может давать очень широкие привилегии. Не подключаем socket Docker внутрь учебного приложения и не используем --privileged. Запуск non-root и ограничение доступа важны, но не делают контейнер неуязвимым.
Аналогия: комнаты в одном здании и отдельные здания имеют разные границы.
Docker Desktop и WSL2
Выбираем один Docker Engine и проверяем контекст.
На Windows основной путь курса — Docker Desktop с включённым WSL2 backend и интеграцией Ubuntu. Команды docker выполняем из Ubuntu, исходники лежат в /home. Не ставим одновременно второй daemon в ту же среду без понимания контекстов: можно собрать образ в одном Engine и искать его в другом. docker context show и docker info помогают понять, куда идут команды. Если Desktop нельзя использовать, преподаватель заранее готовит Docker Engine внутри WSL2 по официальной инструкции Ubuntu. Условия лицензирования Desktop проверяются организацией; курс не требует внешнего платного хостинга.
Ошибка подключения к daemon не равна ошибке Dockerfile.
Команды и наблюдения
Окружение: Ubuntu / Bash с Docker.
docker version
docker context show
docker run --rm hello-world
docker run --rm --name demo-clock alpine:3.22 date -u
docker image ls
docker ps -a
Теги закрепляют версию по соглашению, но могут изменяться; строгая идентичность образа задаётся digest. При проблеме сначала проверяем Desktop и WSL integration.
Ожидаемый результат: CLI видит сервер Docker; hello-world успешно завершается; demo-clock удаляется после выполнения из-за --rm.
Вариант для macOS
На macOS Docker Desktop запускает Linux-контейнеры в Linux-VM, не на ядре XNU. Установите вариант Desktop для Apple Silicon или Intel. Docker Engine для Ubuntu напрямую на macOS не ставится. Apple Silicon обычно использует arm64; контейнерный uname отражает архитектуру выбранного образа.
docker version
docker context show
docker run --rm hello-world
docker run --rm alpine:3.22 uname -m
Практика: Жизненный цикл контейнера
- Запустите alpine:3.22 с командой sleep 120 в фоне через -d и имя student-sleep.
- Посмотрите docker ps, docker logs и docker inspect для своего контейнера.
- Остановите docker stop student-sleep и сравните ps с ps -a.
- Удалите только student-sleep; объясните, почему образ ещё виден.
Результат: Схема образ → запуск → остановка → удаление.
Проверка: Удаляется только собственный учебный контейнер; образ и контейнер различаются.
Неисправность для разбора: Завершение hello-world принимают за аварию.
Решение и диагностика
docker run -d --name student-sleep alpine:3.22 sleep 120; docker ps; docker logs student-sleep; docker stop student-sleep; docker ps -a; docker rm student-sleep. Пустой logs у sleep нормален: процесс ничего не печатает. Не использовать docker system prune на личном ноутбуке ради лабораторной.
Основные выводы
- Его процесс завершился; ps без -a показывает работающие контейнеры.
- Нет, используется ядро среды исполнения.
Самостоятельная работа
Установить и проверить Docker до следующей пары; объяснить текущий context.