Образы: слои, теги и реестр Docker Hub

Рейтинг: 60.1% · 14 голосов
Практический курс по Docker: образы, контейнеры, тома, сети, Compose и продакшен. Уроки по главам с обсуждением.
Ответить
Аватара пользователя
Marina_DevOps
Сообщения: 25
Зарегистрирован: 11 май 2026, 05:31

Образы: слои, теги и реестр Docker Hub

Сообщение Marina_DevOps »

АкадемияDocker с нуляГлава 3 из 17
Оглавление курса (17)
  1. Что такое Docker и какие задачи он решает
  2. Установка Docker и запуск первого контейнера
  3. Образы: слои, теги и реестр Docker Hub (вы здесь)
  4. Пишем свой Dockerfile
  5. Тома и хранение данных: volumes и bind mounts
  6. Сети в Docker: связываем контейнеры между собой
  7. Переменные окружения и конфигурация контейнеров
  8. Docker Compose: поднимаем многоконтейнерное приложение
  9. Оптимизация образов: multi-stage сборка, размер и кэш слоёв
  10. Логи, отладка и мониторинг контейнеров
  11. Базовая безопасность контейнеров
  12. Подготовка к продакшену: что важно учесть
  13. Dockerfile глубже: ENTRYPOINT и CMD, HEALTHCHECK, .dockerignore, запуск не от root
  14. Реестры образов: приватные registry, push и pull, теги и digest, imagePullSecrets
  15. BuildKit и buildx: multi-arch сборки, секреты сборки, экспорт кэша
  16. Docker в CI/CD: автосборка, сканирование образов (Trivy, Docker Scout), публикация
  17. Итоговый проект и куда расти: от Dockerfile до прода, обзор оркестрации (Kubernetes, Podman, OCI)
Во второй главе вы поставили Docker и запустили первый контейнер из готового образа, не задумываясь, откуда этот образ взялся и что у него внутри. Пора разобрать это хозяйство: как устроены слои, что значит двоеточие в nginx:1.27 и как выложить свой образ на Docker Hub. Без этого дальше никак, в главе 4 мы начнём собирать собственные образы.

Слои, или почему образы качаются быстрее, чем кажется:

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

Главная выгода в том, что слои переиспользуются. Если десять образов построены на debian:bookworm, базовые слои лежат на диске в одном экземпляре. То же самое при скачивании:

Код: Выделить всё

$ docker pull python:3.12-slim
3.12-slim: Pulling from library/python
8a628cdd7ccc: Already exists
71f0b9ab95c2: Pull complete
c57a1ad5ed9c: Pull complete
...
Already exists значит, что этот слой уже есть локально, его принёс какой-то другой образ. Посмотреть слои конкретного образа можно так:

Код: Выделить всё

docker history python:3.12-slim
В выводе видно, какая инструкция породила каждый слой и сколько он весит. Эта команда ещё пригодится в главе 9, когда займёмся оптимизацией размера.

Теги, или что на самом деле значит latest:

Полное имя образа выглядит так: реестр/пространство/имя:тег. Когда вы пишете docker pull nginx, Docker молча разворачивает это в docker.io/library/nginx:latest. Здесь library это пространство официальных образов, а latest просто тег по умолчанию. Никакой магии "самой свежей версии" в нём нет: это обычная метка, которую автор образа может двигать куда угодно или вообще не обновлять.

Отсюда правило: везде, где конфигурация переживёт сегодняшний вечер, указывайте конкретный тег. nginx:1.27-alpine, postgres:16.4, node:22-slim. Тег latest годится для разового эксперимента в консоли, не больше.

Навесить на существующий образ ещё один тег можно командой docker tag, при этом ничего не копируется, создаётся просто ссылка. А если нужна железная гарантия неизменности, есть digest, хэш содержимого: docker pull nginx@sha256:... притянет ровно тот образ, байт в байт, даже если теги уехали.

Docker Hub:

Docker Hub это реестр по умолчанию, склад образов. Там лежат официальные образы (nginx, postgres, redis), за которыми следит команда Docker, и миллионы пользовательских в формате username/image. Чтобы выложить свой, нужен бесплатный аккаунт:

Код: Выделить всё

docker login
docker tag myapp:latest vasya/myapp:1.0.0
docker push vasya/myapp:1.0.0
Push тоже идёт послойно: слои, которые в реестре уже есть, повторно не заливаются.

У бесплатного доступа к Docker Hub есть лимиты на количество pull за период, и для анонимных запросов они считаются по IP. В офисе за общим NAT это всплывает внезапно посреди рабочего дня. Лечится авторизацией через docker login или зеркалом: в /etc/docker/daemon.json есть параметр registry-mirrors, ряд облачных провайдеров в СНГ держит публичные зеркала Docker Hub. Это же спасает, когда сам Hub из России открывается через раз.

Типичные грабли:

Первое. Тянуть образы по latest на сервере. Сегодня там одна версия, после очередного pull другая, и приложение падает. Фиксируйте версии тегом.

Второе. Считать, что docker pull обновит работающий контейнер. Нет, pull только скачивает образ, контейнер продолжает жить на старом. Контейнер нужно пересоздать: docker rm и docker run заново, в главе 8 за нас это будет делать Compose.

Третье. Путать тег и image ID. docker rmi myapp:1.0.0 удаляет только тег, и если на образ указывают другие теги, сам образ останется на диске. Сверяйтесь с колонкой IMAGE ID в docker image ls.

Четвёртое. Заливать в публичный реестр образ с секретами. Всё, что попало в слой, остаётся в истории, даже если удалить файл следующей инструкцией. Подробно об этом в главе 11.

Что усвоили: образ это стопка read-only слоёв, тег это подвижная метка, latest не значит свежий, а Docker Hub раздаёт и принимает образы послойно и с лимитами. В следующей главе напишем свой первый Dockerfile и увидим, как каждая инструкция превращается в слой.
👍9 ❤️ 🔥 😄 🤔
✔ Лучший ответ сформирован автоматически — bun_master
Marina_DevOps писал(а):docker pull nginx@sha256:... притянет ровно тот образ, байт в байт, даже если теги уехали. а как с этим жить в плане обновлений? пинить по digest надежно, но получается при каждом апдейте руками копировать новый хэш из хаба. есть какой-то вменяемый процесс или все так и делают?
Перейти к ответу →
Аватара пользователя
tomlin51
Сообщения: 2
Зарегистрирован: 13 май 2026, 10:13

Re: Образы: слои, теги и реестр Docker Hub

Сообщение tomlin51 »

Marina_DevOps писал(а):Тег latest годится для разового эксперимента в консоли, не больше.
а как тогда узнать, какие теги вообще есть у образа? docker search их не показывает. каждый раз лезть на сайт хаба и листать вкладку tags? для скрипта это неудобно совсем
👍 ❤️ 🔥 😄 🤔
Аватара пользователя
tborstad
Сообщения: 1
Зарегистрирован: 12 май 2026, 00:28

Re: Образы: слои, теги и реестр Docker Hub

Сообщение tborstad »

Подтверждаю про NAT. У нас в конторе CI на трех раннерах за одним белым IP, в один прекрасный день все пайплайны легли с toomanyrequests. Час дебажили сеть, а это лимит хаба. Сделали docker login в раннерах плюс прописали зеркало в daemon.json, с тех пор тихо.
👍1 ❤️1 🔥2 😄 🤔
Аватара пользователя
williamson
Сообщения: 2
Зарегистрирован: 22 май 2026, 05:04

Re: Образы: слои, теги и реестр Docker Hub

Сообщение williamson »

Спасибо, наконец дошло, почему у меня docker image ls показывал два тега с одинаковым IMAGE ID и почему rmi одного из них ничего не освободил. Я думал это баг и руками по хэшу сносил.
👍 ❤️ 🔥 😄 🤔
Аватара пользователя
bun_master
Сообщения: 1
Зарегистрирован: 13 май 2026, 12:33

Re: Образы: слои, теги и реестр Docker Hub

Сообщение bun_master »

✔ Лучший ответ — сформирован автоматически
Marina_DevOps писал(а):docker pull nginx@sha256:... притянет ровно тот образ, байт в байт, даже если теги уехали.
а как с этим жить в плане обновлений? пинить по digest надежно, но получается при каждом апдейте руками копировать новый хэш из хаба. есть какой-то вменяемый процесс или все так и делают?
👍 ❤️1 🔥1 😄 🤔1
Ответить
← Предыдущая глава
Установка Docker и запуск первого контейнера
Следующая глава →
Пишем свой Dockerfile

Все главы курса «Docker с нуля»

Поделиться темой: ✈ Telegram VK

Вернуться в «Docker с нуля»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 1 гость