$ sudo teach IT

Мы уже запускали контейнеры, но до этого момента обходились готовыми образами. Чтобы глубже понять, как устроен 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 выполняет несколько шагов:

  1. Определяет реестр Если вы не указали реестр, используется Docker Hub по умолчанию. Полное имя в духе: docker.io/library/nginx:latest (где library — дефолтная «организация» для официальных образов).
  2. Выбирает платформу По умолчанию берётся платформа вашей системы. Но это можно переопределить (см. ниже).
  3. Скачивает только недостающие слои Если часть слоёв уже есть в локальном кэше (вы раньше тянули похожие образы), Docker докачает только недостающее. Экономия трафика и времени — огромная.

📌 Аналогия: это как заранее скачать сериал перед поездкой. Плеер подтянет нужные серии и качества под ваше устройство, а уже скачанные эпизоды трогать не будет.

Формат имени образа: кратко и наглядно

Полная запись может выглядеть так:

[реестр/]namespace/репозиторий[:тег][@digest]

Примеры:

  • nginx:1.25
  • docker.io/library/alpine:3.20
  • ghcr.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.

Наиболее частые ошибки

  1. Доверие тегу latest.
    Многие думают, что это всегда самая свежая версия — но это не так.
  2. Удаление нужных образов.
    Если контейнер работает, а вы удалите его образ, при следующем запуске придётся снова качать.
  3. Игнорирование кэша слоёв.
    Некоторые новички пересобирают всё с нуля, хотя Docker автоматически оптимизирует процесс.

Наиболее частые вопросы

  • Можно ли хранить образы только локально, без Docker Hub?
    Да, можно поднять собственный приватный реестр.
  • Что будет, если удалить образ, который используется контейнером?
    Ничего, пока контейнер работает. Но новый контейнер из этого образа создать не получится.
  • Почему размер образа часто большой?
    Потому что в него попадает базовая ОС, библиотеки и зависимости. Можно использовать минимальные образы (alpine), чтобы уменьшить размер.

Итоги

Сегодня вы узнали:

  • Как скачивать (pull), просматривать (images) и удалять (rmi) образы.
  • Что такое теги и почему нельзя слепо доверять :latest.
  • Как работает кэш слоёв и почему он ускоряет работу.

Теперь вы умеете управлять образами — основой любой работы с Docker.