Мы уже запускали контейнеры, но до этого момента обходились готовыми образами. Чтобы глубже понять, как устроен Docker, нужно разобраться, что такое образы, как их скачивать, просматривать, удалять и правильно использовать.
Представьте библиотеку: книги — это образы, а читатели берут из них экземпляры — контейнеры. Чтобы пользоваться контейнерами эффективно, нужно уметь управлять самими «книгами».
Что вы узнаете в рамках статьи
- Как загружать образы (
pull) и откуда они берутся. - Как просматривать список образов (
images). - Как удалять ненужные образы (
rmi). - Как работают теги (
:latest, семантические версии). - Как устроен кэш слоёв и зачем он нужен.
Ключевые термины
- Образ (image) — шаблон для запуска контейнера.
- Docker Hub — публичный реестр образов по умолчанию.
- Тег (tag) — версия образа, например
nginx:1.25илиpython:3.11. - Слой (layer) — часть образа, фиксирующая одно изменение.
- Кэш слоёв — механизм повторного использования уже собранных слоёв для ускорения сборки.
Скачивание образов: docker pull
Иногда удобно заранее скачать образ, чтобы потом запускать контейнеры офлайн или без задержек. Команда docker pull делает именно это: обращается к реестру образов, находит нужный вариант (под вашу архитектуру) и подтягивает недостающие слои.
docker pull nginx:latest
Здесь:
nginx— имя репозитория образа,:latest— тег (условная «метка» версии).
Что реально происходит «под капотом»
Когда вы делаете docker pull, Docker выполняет несколько шагов:
- Определяет реестр Если вы не указали реестр, используется Docker Hub по умолчанию. Полное имя в духе:
docker.io/library/nginx:latest(гдеlibrary— дефолтная «организация» для официальных образов). - Выбирает платформу По умолчанию берётся платформа вашей системы. Но это можно переопределить (см. ниже).
- Скачивает только недостающие слои Если часть слоёв уже есть в локальном кэше (вы раньше тянули похожие образы), Docker докачает только недостающее. Экономия трафика и времени — огромная.
📌 Аналогия: это как заранее скачать сериал перед поездкой. Плеер подтянет нужные серии и качества под ваше устройство, а уже скачанные эпизоды трогать не будет.
Формат имени образа: кратко и наглядно
Полная запись может выглядеть так:
[реестр/]namespace/репозиторий[:тег][@digest]
Примеры:
nginx:1.25docker.io/library/alpine:3.20ghcr.io/acme/api:1.2.0(GitHub Container Registry)registry.example.com/team/app:prod
Если тег не указать, Docker возьмёт :latest. Это не гарантированно самая новая версия — это просто тег, который так назвали. В CI/проде лучше указывать конкретные теги или даже digest.
Теги vs digest: стабильность и воспроизводимость
- Тег (
:1.25.3) — удобный ярлык, но автор образа теоретически может «переназначить» его на другие слои. - Digest (
@sha256:...) — криптографический отпечаток конкретного набора слоёв. Это на 100% воспроизводимо.
# Стянуть строго определённый вариант образа
docker pull nginx@sha256:3f8b...c2e
📌 Рекомендация для CI/CD: фиксируйте digest для критичных окружений, чтобы исключить «тихие» изменения под тем же тегом.
Частые сценарии pull
Скачать конкретную версию
docker pull nginx:1.25.3
Работа с приватным реестром
docker login ghcr.io
docker pull ghcr.io/acme/api:1.2.0
Стянуть по digest (жёстко зафиксированный образ)
docker pull ubuntu@sha256:abcd...1234
Маленький чек-лист перед pull
- Нужен ли конкретный тег (а не
latest)? - Не надо ли указать платформу для воспроизводимости?
- Это публичный образ или нужно сначала сделать
docker login? - Не тянете ли вы лишнее — может, есть slim/alpineварианты?
Список образов: docker images
Когда вы скачиваете или собираете образы, они остаются на компьютере. Но как узнать, что именно у вас уже есть? Для этого используется команда:
docker images
Что показывает команда
Вывод обычно состоит из нескольких столбцов:
- REPOSITORY — имя репозитория (например,
nginx,python,ubuntu). - TAG — тег образа (версия:
3.11,1.25,latest). - IMAGE ID — уникальный идентификатор (короткий хэш).
- CREATED — дата, когда образ был собран или загружен.
- SIZE — размер образа.
Пример вывода может выглядеть так:
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest a0bc1234def5 2 weeks ago 187MB
python 3.11 5e67f8ab9c10 1 month ago 928MB
alpine 3.18 c5f1cf30c96b 3 months ago 5.5MB
Полезные варианты
-
Показать все образы:
docker images -a -
Показать только ID образов (удобно для скриптов):
docker images -q -
Фильтровать по репозиторию или тегу:
docker images nginx docker images python:3.11
Зачем это нужно
- Чтобы понять, какие версии образа у вас есть.
- Чтобы найти ненужные или устаревшие образы и удалить их.
- Чтобы ориентироваться, сколько места занимает Docker.
Удаление образов: docker rmi
Работая с Docker, вы быстро заметите, что пространство на диске начинает заканчиваться. Каждый образ может весить сотни мегабайт, а иногда и гигабайты. Если их много, диск быстро забьётся. Чтобы держать систему в чистоте, старые или ненужные образы нужно удалять.
Как удалить образ
Базовая команда:
docker rmi nginx:latest
Здесь:
nginx— имя образа,:latest— тег (версия).
Удалить можно и по ID образа:
docker rmi a0bc1234def5
Важный нюанс: контейнеры
Docker не даст удалить образ, если из него создан (и ещё не удалён) контейнер.
-
Если контейнер работает, его нужно сначала остановить:
docker stop my-app -
А затем удалить:
docker rm my-app -
Только после этого можно удалить сам образ:
docker rmi nginx:latest
👉 Получается цепочка: stop → rm → rmi.
📌 Аналогия: это как попытаться выкинуть форму для выпечки, пока в ней ещё стоит готовый торт. Сначала нужно вынуть торт (контейнер), а уже потом убирать форму (образ).
Полезные приёмы
-
Удалить несколько образов разом:
docker rmi nginx:latest python:3.11 alpine:3.18 -
Удалить все образы (очень радикально!):
docker rmi $(docker images -q) -
Удалить неиспользуемые образы (dangling images) — это «висячие» образы без имени и тега, остающиеся после пересборки:
docker image prune -
Удалить всё неиспользуемое (образы, остановленные контейнеры, сети):
docker system prune
⚠️ Осторожно: system prune может убрать больше, чем вы ожидали. Всегда проверяйте, не потеряете ли нужное.
Когда стоит удалять образы
- Вы протестировали приложение и образ больше не нужен.
- Вы накопили десятки версий одного и того же сервиса.
- Нужно освободить место на диске.
Теги образов: :latest vs семантические версии
В Docker у каждого образа есть тег — это метка (ярлык), которая указывает на конкретную версию. Тег позволяет отличать одну сборку от другой. Без него непонятно, какую именно версию образа вы скачали или запускаете.
:latest — не то, что все думают
Многие новички уверены, что тег :latest означает «самая свежая версия». Но на самом деле это просто ярлык по умолчанию, который автор образа назначает сам.
- Иногда
latestдействительно совпадает с последней стабильной версией. - Но нередко это любая версия, которую автор решил так пометить.
- Если тег не указан, Docker автоматически подставляет
:latest.
📌 Пример:
docker pull ubuntu # эквивалентно docker pull ubuntu:latest
Семантические версии
Чтобы не зависеть от «кто как назвал», используют семантическое версионирование (SemVer).
Формат обычно такой:
python:3.11(подразумевается любая сборка 3.11.x)python:3(любая 3.x.x)python:3.11.5(жёстко фиксированная версия).
Почему важно не доверять latest
Представьте ситуацию: вы разрабатываете проект на python:latest. Сегодня это Python 3.11, а завтра автор образа переключил latest на 3.12. Ваш проект внезапно перестаёт работать, потому что изменилась версия языка.
📌 Аналогия:
:latest— это как наклейка «новинка» в магазине. Сегодня это может быть свежая партия яблок, а завтра — бананы.- Семантическая версия — это дата производства и штрихкод на упаковке. Вы точно знаете, что это именно яблоки урожая 2023 года.
Практические рекомендации
- В продакшене всегда используйте семантические версии. Это снижает риск «сломаться» из-за того, что кто-то изменил
latest. - Для разработки можно использовать
latest. Это удобно, если вы просто экспериментируете. - Лучший вариант для CI/CD — фиксировать не только тег, но и digest (
@sha256). Digest всегда указывает на конкретный набор слоёв, и его нельзя «переименовать».
Кэш слоёв
Образ в Docker — это не один большой файл, а цепочка слоёв. Каждый слой фиксирует одно изменение: установка пакета, копирование файлов, настройка окружения. Все вместе они складываются в единый образ.
📌 Пример:
- Базовый слой:
ubuntu:20.04— минимальная ОС. - Следующий слой: установка Python.
- Следующий слой: установка зависимостей.
- Последний слой: добавление вашего приложения.
Как работает кэш
Когда вы скачиваете или собираете образы, Docker не повторяет работу заново для каждого шага. Он сохраняет слои в кэше и при необходимости переиспользует их.
👉 Если другой образ использует тот же слой (например, ту же самую ubuntu:20.04), Docker просто «подцепит» его из кэша, а не будет скачивать или собирать снова.
Почему это важно
1. Экономия места Один слой хранится только один раз, даже если он используется в десятках образов. Например, у вас может быть 10 образов на базе python:3.11, но сам Python хранится всего один раз.
2. Ускорение загрузки Если вы уже скачали базовый слой, новые образы скачиваются быстрее: Docker докачивает только недостающие части.
3. Быстрая пересборка образов При сборке Docker идёт по шагам из Dockerfile. Если какой-то слой не изменился, он возьмёт его из кэша.
- Изменили только код → пересоберётся только последний слой.
- Всё остальное останется из кэша.
Подводные камни
- Кэш чувствителен к порядку инструкций. Если вы в Dockerfile сначала копируете код, а потом устанавливаете зависимости, любое изменение кода приведёт к пересборке зависимостей. Поэтому порядок шагов важен.
- Кэш можно отключить. Иногда нужно пересобрать всё заново (например, для обновления зависимостей). Для этого используют флаг
--no-cache.
Наиболее частые ошибки
- Доверие тегу
latest.
Многие думают, что это всегда самая свежая версия — но это не так. - Удаление нужных образов.
Если контейнер работает, а вы удалите его образ, при следующем запуске придётся снова качать. - Игнорирование кэша слоёв.
Некоторые новички пересобирают всё с нуля, хотя Docker автоматически оптимизирует процесс.
Наиболее частые вопросы
- Можно ли хранить образы только локально, без Docker Hub?
Да, можно поднять собственный приватный реестр. - Что будет, если удалить образ, который используется контейнером?
Ничего, пока контейнер работает. Но новый контейнер из этого образа создать не получится. - Почему размер образа часто большой?
Потому что в него попадает базовая ОС, библиотеки и зависимости. Можно использовать минимальные образы (alpine), чтобы уменьшить размер.
Итоги
Сегодня вы узнали:
- Как скачивать (
pull), просматривать (images) и удалять (rmi) образы. - Что такое теги и почему нельзя слепо доверять
:latest. - Как работает кэш слоёв и почему он ускоряет работу.
Теперь вы умеете управлять образами — основой любой работы с Docker.