Основы Docker: Образы (Images)
Docker Image — это шаблон, используемый для создания Docker-контейнеров. Образы являются неизменяемыми (read-only) файлами, которые состоят из серии слоев. Эти слои объединяются для создания файловой системы контейнера.
Основные характеристики Docker Images
- Слоистая файловая система (Layered Filesystem): Образы Docker состоят из нескольких слоев, каждый из которых представляет собой набор изменений в файловой системе. Эти слои создаются на основе инструкций в Dockerfile. Преимущество слоистой структуры заключается в том, что слои могут быть повторно использованы между различными образами, что экономит место на диске и ускоряет процесс сборки и передачи образов.
- Неизменяемость (Immutability): После создания образ не может быть изменен. Любые изменения приводят к созданию нового слоя поверх существующего образа.
- Портативность (Portability): Образы Docker можно легко передавать между различными Docker-хостами и хранить в Docker Registry.
- Рецепт для контейнеров: Образ содержит все необходимое для запуска одного или нескольких идентичных контейнеров.
Управление образами Docker
Вы можете управлять образами Docker с помощью команды docker image (или просто docker).
Просмотр списка образов
docker image ls
docker imagesЭти команды выводят список всех образов, находящихся на вашем локальном Docker-хосте, включая их репозиторий, тег, ID образа, дату создания и размер.
- REPOSITORY: Имя репозитория образа (например,
ubuntu,nginx,mysql). - TAG: Тег образа, который используется для версионирования (например,
latest,20.04,1.21). По умолчанию используется тегlatest, если не указан другой. - IMAGE ID: Уникальный идентификатор образа.
- CREATED: Дата и время создания образа.
- SIZE: Размер образа.
Поиск образов в Docker Hub
Docker Hub (https://hub.docker.com/) — это публичный реестр образов Docker. Вы можете искать образы, используя команду docker search:
docker search nginx
docker search ubuntu --filter is-official=true # Поиск только официальных образов UbuntuРезультат поиска включает имя образа, описание, количество звезд (популярность), является ли образ официальным и автоматизированным.
Загрузка образов из Docker Hub
Чтобы загрузить образ из Docker Hub на ваш локальный Docker-хост, используйте команду docker pull:
docker pull ubuntu:latest # Загрузка последней версии образа Ubuntu
docker pull nginx:1.20 # Загрузка образа Nginx с тегом 1.20Если тег не указан, Docker автоматически загрузит образ с тегом latest.
Создание образов (Dockerfile)
Образы Docker создаются на основе инструкций, содержащихся в файле Dockerfile. Мы подробно говорили о Dockerfile в предыдущей теме. Для сборки образа из Dockerfile используется команда docker build:
docker build -t my-custom-image:1.0 .-t my-custom-image:1.0: Указывает имя и тег для создаваемого образа (my-custom-image— имя,1.0— тег). Если тег не указан, по умолчанию используетсяlatest..: Указывает контекст сборки (обычно текущая директория), который содержит Dockerfile и другие необходимые файлы.
Просмотр истории образа
Чтобы увидеть слои, составляющие образ, и команды, которые использовались для их создания, используйте команду docker history:
docker history ubuntu:latestЭта команда показывает слои в обратном хронологическом порядке (начиная с самого верхнего слоя).
Отметка образов тегами
Вы можете присваивать образам дополнительные теги для удобства управления версиями или для указания другого репозитория:
docker tag my-custom-image:1.0 [my-registry.com/my-namespace/my-custom-image:latest](https://my-registry.com/my-namespace/my-custom-image:latest)Эта команда создает новый тег latest для образа my-custom-image:1.0 в репозитории my-registry.com/my-namespace/.
Выгрузка образов в Docker Registry
Чтобы поделиться своими образами или использовать их на другом Docker-хосте, вы можете выгрузить их в Docker Registry (например, Docker Hub или частный реестр) с помощью команды docker push:
docker login # Если требуется аутентификация в реестре
docker push [my-registry.com/my-namespace/my-custom-image:latest](https://my-registry.com/my-namespace/my-custom-image:latest)Сохранение и загрузка образов (локально)
Вы также можете сохранить образ в tar-архив и затем загрузить его на другом Docker-хосте без использования реестра:
docker save -o my-image.tar my-custom-image:1.0
docker load -i my-image.tarУдаление образов
Чтобы удалить один или несколько образов, используйте команду docker rmi (remove image):
docker rmi my-custom-image:1.0 # Удаление образа по имени и тегу
docker rmi <image_id> # Удаление образа по IDБудьте осторожны при удалении образов, так как это необратимая операция. Убедитесь, что вы удаляете нужные образы.
Чтобы удалить все неиспользуемые образы (образы, на которые не ссылаются ни один контейнер):
docker image pruneЧтобы удалить все неиспользуемые образы и связанные с ними данные (включая неиспользуемые контейнеры и сети):
docker system pruneТакже будьте осторожны при использовании docker system prune, так как это может удалить важные данные.
Лучшие практики при работе с Docker Images
- Используйте минимальные базовые образы: Начинайте с небольших базовых образов (например, alpine-based), чтобы уменьшить размер и повысить безопасность ваших итоговых образов.
- Мультистейдж сборки (Multi-stage builds): Используйте несколько стадий в Dockerfile для сборки приложения и копирования только необходимых артефактов в финальный образ, что также уменьшает его размер.
- Кэширование слоев: Располагайте инструкции в Dockerfile таким образом, чтобы максимально эффективно использовать кэширование слоев Docker, что ускоряет процесс сборки.
- Регулярно обновляйте базовые образы: Следите за обновлениями безопасности базовых образов и пересобирайте свои образы при необходимости.
- Используйте теги для версионирования: Правильное использование тегов помогает отслеживать различные версии ваших образов.
- Оптимизируйте размер образов: Удаляйте ненужные файлы и зависимости из финальных образов.
- Безопасность образов: Сканируйте свои образы на наличие уязвимостей.
Docker Images являются фундаментальной концепцией в Docker. Понимание того, как создавать, управлять и оптимизировать образы, является ключевым для эффективной работы с Docker.