Лаб. работа "Docker: Образы"
Лабораторная работа по теме “Docker: Образы”
Цель работы
Изучить концепции Docker-образов, их структуру и принципы работы. Получить практические навыки создания собственных образов с использованием Dockerfile, работы с многослойной архитектурой, оптимизации размера образов и управления тегами.
Краткие теоретические сведения
Docker-образ — это неизменяемый шаблон, содержащий инструкции для создания контейнера. Образ состоит из набора слоев, каждый из которых представляет собой результат выполнения определенной инструкции в Dockerfile.
Ключевые концепции Docker-образов:
- Слои (Layers) — образ строится из нескольких слоев, каждый слой добавляет новые файлы или изменяет существующие. Слои являются неизменяемыми и кэшируются для ускорения сборки.
- Базовый образ (Base Image) — начальный слой, на основе которого строится весь образ. Это может быть минимальная операционная система (Alpine, Ubuntu) или готовый образ с предустановленным ПО.
- Теги (Tags) — метки для версионирования образов. Позволяют указывать конкретные версии ПО (например,
nginx:1.21,python:3.9). - Dockerfile — текстовый файл с инструкциями для сборки образа.
- Кэширование — Docker кэширует промежуточные слои, что ускоряет повторную сборку образа при неизмененных инструкциях.
- Многоэтапная сборка (Multi-stage builds) — техника для уменьшения размера финального образа за счет разделения процесса сборки и финального образа.
Преимущества легковесных образов: * Быстрая загрузка и распространение * Меньшее потребление дискового пространства * Быстрый запуск контейнеров * Повышенная безопасность (меньше поверхности атаки)
Краткий справочник по инструкциям Dockerfile
Основные инструкции
FROM <образ>[:<тег>]— указывает базовый образ для сборкиRUN <команда>— выполняет команду во время сборки образаCOPY <источник> <назначение>— копирует файлы с хоста в образADD <источник> <назначение>— копирует файлы с хоста или URL в образ (расширенная версия COPY)WORKDIR <путь>— устанавливает рабочую директорию для последующих инструкцийENV <ключ>=<значение>— устанавливает переменную окруженияEXPOSE <порт>— указывает порт, который будет использовать контейнер (документация)CMD ["команда", "аргументы"]— команда по умолчанию при запуске контейнераENTRYPOINT ["команда"]— основная команда контейнера (не переопределяется при запуске)VOLUME ["путь"]— создает точку монтирования для тома
Инструкции для многоэтапной сборки
AS <имя>— именует стадию сборки (используется с FROM)COPY --from=<источник>— копирует файлы из предыдущей стадии сборки
Требования к окружению
- Операционная система: Debian 13 “Trixie” или новее
- Docker Engine установлен и настроен
- Доступ в Интернет для загрузки образов
- Учетная запись пользователя без прав
root - Текстовый редактор (nano, vim или другой)
Порядок выполнения работы
Часть 1. Изучение существующих образов
Просмотр доступных образов Посмотрите список всех образов на вашей системе:
Обратите внимание на столбцы: REPOSITORY, TAG, IMAGE ID, CREATED, SIZE.
Получение детальной информации об образе Получите подробную информацию о любом образе:
Найдите информацию о слоях, переменных окружения, портах и других параметрах.
История образа Посмотрите историю создания образа:
Это покажет список слоев и команды, которые были использованы для их создания.
Часть 2. Создание простого Dockerfile
Создание рабочей директории Создайте директорию для работы с Dockerfile:
Создание простого веб-приложения Создайте файл
app.pyс простым веб-сервером:Создание requirements.txt Создайте файл с зависимостями:
flask==2.3.3Создание первого Dockerfile Создайте файл
Dockerfileсо следующим содержимым:# Базовый образ Python FROM python:3.11-slim # Установка рабочей директории WORKDIR /app # Копирование файлов зависимостей COPY requirements.txt . # Установка зависимостей RUN pip install --no-cache-dir -r requirements.txt # Копирование приложения COPY app.py . # Указание порта EXPOSE 5000 # Команда запуска CMD ["python", "app.py"]Сборка образа Соберите образ с тегом
my-app:v1:Обратите внимание на процесс сборки и кэширование слоев.
Проверка размера образа Посмотрите размер созданного образа:
Тестирование образа Запустите контейнер из образа:
Проверьте работу приложения:
Часть 3. Оптимизация образа
Создание оптимизированного Dockerfile Создайте новый файл
Dockerfile.optimized:# Многоэтапная сборка для уменьшения размера FROM python:3.11-slim as builder # Установка зависимостей для сборки WORKDIR /app COPY requirements.txt . RUN pip install --user --no-cache-dir -r requirements.txt # Финальный образ FROM python:3.11-slim # Создание непривилегированного пользователя RUN useradd -m -u 1000 appuser # Установка рабочей директории WORKDIR /app # Копирование установленных зависимостей из builder COPY --from=builder /root/.local /home/appuser/.local # Копирование приложения COPY app.py . # Изменение владельца RUN chown -R appuser:appuser /app # Переключение на непривилегированного пользователя USER appuser # Обновление PATH ENV PATH=/home/appuser/.local/bin:$PATH # Указание порта EXPOSE 5000 # Команда запуска CMD ["python", "app.py"]Сборка оптимизированного образа Соберите оптимизированный образ:
Сравнение размеров Сравните размеры обоих образов:
Запишите разницу в размерах.
Тестирование оптимизированного образа Запустите оптимизированный образ:
Проверьте его работу:
Часть 4. Работа с Alpine Linux
Создание Alpine-based образа Создайте файл
Dockerfile.alpine:# Использование Alpine Linux для минимального размера FROM python:3.11-alpine # Установка рабочей директории WORKDIR /app # Копирование файлов COPY requirements.txt app.py ./ # Установка зависимостей RUN pip install --no-cache-dir -r requirements.txt # Указание порта EXPOSE 5000 # Команда запуска CMD ["python", "app.py"]Сборка Alpine образа Соберите образ на базе Alpine:
Сравнение всех образов Сравните размеры всех созданных образов:
Обратите внимание на разницу между slim и alpine версиями.
Часть 5. Тегирование и управление версиями
Добавление дополнительных тегов Добавьте несколько тегов к существующему образу:
Просмотр всех тегов Посмотрите все теги образа:
Удаление образа по тегу Удалите один из тегов:
Проверьте, что образ остался под другими тегами.
Часть 6. Исследование слоев образа
Детальный анализ слоев Посмотрите детальную информацию о слоях образа:
Сравнение слоев Сравните количество слоев и их размеры в разных образах.
Использование dive для анализа Установите и используйте утилиту dive для графического анализа образов (если доступно):
Задания для самостоятельного выполнения
- Создание образа с Nginx и статическим сайтом Создайте Dockerfile, который:
- Использует официальный образ nginx:alpine как базовый
- Копирует простой HTML-файл с вашей страницей
- Оптимизирует размер, удаляя ненужные файлы
- Запускает nginx от непривилегированного пользователя
- Использует многоэтапную сборку для минимизации размера
- Создание образа с Node.js приложением Создайте простое Node.js приложение и Dockerfile для него. Используйте:
- node:alpine как базовый образ
- Оптимизированную установку зависимостей
- Healthcheck для проверки работоспособности
- Минимальное количество слоев
- Исследование кэширования Создайте Dockerfile и проведите несколько сборок, изменяя разные части файла. Наблюдайте:
- Какие слои кэшируются
- На каком этапе кэш сбрасывается
- Как оптимизировать порядок инструкций для лучшего кэширования
- Создание образа с несколькими тегами Создайте образ и назначьте ему несколько тегов (latest, stable, v1.0). Проверьте:
- Как теги связаны с одним образом
- Что происходит при удалении тега
- Как работает команда docker tag
- Анализ безопасности образа Используйте команду docker scan (если доступна) или другие инструменты для:
- Проверки уязвимостей в образе
- Сравнения безопасности разных базовых образов
- Поиска неиспользуемых компонентов
Контрольные вопросы
- Что такое Docker-образ и как он отличается от контейнера?
- Какие преимущества дает использование многоэтапной сборки?
- Почему важно минимизировать количество слоев в образе?
- Как работает кэширование слоев при сборке образа?
- В чем разница между инструкциями CMD и ENTRYPOINT?
- Какие существуют способы уменьшения размера Docker-образа?
- Что такое теги и как они используются для версионирования образов?
Требования к отчету
Отчет по лабораторной работе должен содержать:
- Титульный лист
- Цель работы
- Пошаговое описание выполнения работы с приведением всех вводимых команд и их выводов (можно в виде скриншотов или текстовых блоков)
- Сравнительную таблицу размеров созданных образов
- Вывод, в котором необходимо кратко описать полученные знания и навыки, а также привести примеры оптимизированных Dockerfile для ваших заданий