Основы работы с образами Docker

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

Введение

В этом исчерпывающем руководстве рассматриваются основные концепции образов Docker, предоставляя разработчикам и специалистам DevOps глубокое понимание создания, структурирования и управления контейнерными образами. Понимание основных принципов архитектуры образов Docker позволит читателям получить практические знания для построения эффективных и воспроизводимых решений по развертыванию программного обеспечения.

Основы образов Docker

Что такое образы Docker?

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

Ключевые компоненты образов Docker

graph TD
    A[Образ Docker] --> B[Базовый слой]
    A --> C[Слой приложения]
    A --> D[Слой конфигурации]
    B --> E[Операционная система]
    B --> F[Системные библиотеки]
    C --> G[Код приложения]
    C --> H[Зависимости]
    D --> I[Переменные окружения]
    D --> J[Команды запуска]

Структура и слои образа

Тип слоя Описание Пример
Базовый слой Основополагающая операционная система Ubuntu 22.04
Промежуточные слои Системные зависимости Python runtime
Слой приложения Исходный код и файлы приложения Веб-приложение
Слой конфигурации Настройки среды выполнения Сопоставления портов

Создание образа Docker: Практический пример

## Создайте директорию проекта
mkdir my-docker-app
cd my-docker-app

## Создайте простое приложение Python
echo "print('Привет, Docker!')" > app.py

## Создайте Dockerfile
cat > Dockerfile << EOL
FROM ubuntu:22.04
RUN apt-get update && apt-get install -y python3
COPY app.py /app/app.py
WORKDIR /app
CMD ["python3", "app.py"]
EOL

## Соберите образ Docker
docker build -t my-python-app .

## Запустите контейнер
docker run my-python-app

Этот пример демонстрирует создание образа Docker с минимальной базой Ubuntu, установкой Python и запуском простого скрипта Python. Dockerfile определяет каждый слой образа, обеспечивая воспроизводимость и согласованность в различных средах.

Характеристики образа

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

Управление образами Docker

Основные команды управления образами

Docker предоставляет набор команд для эффективного управления образами на системах Ubuntu 22.04. Понимание этих команд имеет решающее значение для поддержания чистой и оптимизированной среды контейнеров.

graph LR
    A[Управление образами Docker] --> B[Список образов]
    A --> C[Удаление образов]
    A --> D[Загрузка образов]
    A --> E[Тегирование образов]

Просмотр и инспекция образов

## Список всех локальных образов
docker images

## Подробная инспекция образа
docker inspect ubuntu:latest

## Фильтрация образов по определенным критериям
docker images --filter "dangling=true"

Операции с образами

Операция Команда Описание
Загрузка образа docker pull Загрузка образа из репозитория
Удаление образа docker rmi Удаление локального образа
Удаление неиспользуемых образов docker image prune Очистка неиспользуемых образов
Тегирование образа docker tag Создание псевдонима образа

Расширенные методы очистки образов

## Удаление всех неиспользуемых образов
docker image prune -a

## Удаление определенного образа
docker rmi image_name:tag

## Удаление образов без запущенных контейнеров
docker image prune -f

Стратегии оптимизации размера образов

## Проверка размера образа
docker images --format "{{.Repository}}:{{.Tag}}: {{.Size}}"

## Создание минимальных образов с помощью многоэтапной сборки
FROM ubuntu:22.04 AS builder
## Сборка зависимостей

FROM ubuntu:22.04
## Копирование только необходимых артефактов

Управление версиями образов

## Тегирование определенной версии образа
docker tag original_image:latest new_image:v1.0

## Публикация тегированного образа в репозиторий
docker push new_image:v1.0

Лучшие практики для репозиториев образов

Архитектура репозитория Docker

graph TD
    A[Репозиторий Docker] --> B[Публичные репозитории]
    A --> C[Приватные репозитории]
    B --> D[Docker Hub]
    C --> E[Самостоятельно размещённый реестр]
    C --> F[Реестры облачных провайдеров]

Типы репозиториев и их характеристики

Тип репозитория Уровень доступа Сценарий использования
Docker Hub Публичный/Приватный Образы сообщества, официальные репозитории
Приватный реестр Ограниченный Корпоративные среды, проекты с конфиденциальной информацией
Реестры облачных провайдеров Управляемый Масштабируемые, интегрированные облачные развертывания

Практики аутентификации и безопасности

## Вход в Docker Hub
docker login

## Создание аутентификации для приватного реестра
docker login private-registry.example.com

## Генерация учетных данных реестра
htpasswd -Bc registry.password username

Оптимизация хранения образов

## Ограничение локального хранилища образов
docker system prune -a --volumes

## Удаление висящих образов
docker image prune

## Установка лимита хранилища
docker system df

Автоматизированное управление образами

#!/bin/bash
## Скрипт очистки образов Docker

## Удаление образов старше 30 дней
docker image prune -a --filter "until=720h"

## Удаление неиспользуемых томов
docker volume prune -f

## Удаление неиспользуемых сетей
docker network prune -f

Синхронизация репозиториев

## Загрузка последних образов
docker pull ubuntu:latest
docker pull nginx:stable

## Тегирование и публикация в приватном реестре
docker tag ubuntu:latest private-registry.com/ubuntu:latest
docker push private-registry.com/ubuntu:latest

Интеграция сканирования на предмет безопасности

## Сканирование образа на предмет уязвимостей
docker scan ubuntu:latest

## Интеграция с CI/CD конвейером
trivy image ubuntu:latest

Резюме

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