Образы Docker: теги, слои, реестры
Docker образ — это слоёная файловая система. Понимание слоёв объясняет, почему Docker такой быстрый.
Слои образа
Каждый образ — стек неизменяемых слоёв. Каждый слой хранит diff относительно предыдущего.
Попробуй в симуляции
┌─────────────────────────────┐ ← CMD ["node", "app.js"]
├─────────────────────────────┤ ← COPY . .
├─────────────────────────────┤ ← RUN npm install
├─────────────────────────────┤ ← RUN apt-get install nodejs
└─────────────────────────────┘ ← FROM ubuntu:22.04
Слои неизменяемы и переиспользуются. Если два образа начинаются с FROM ubuntu:22.04, они используют один и тот же базовый слой на диске.
Теги
Тег — версия образа. Формат: имя:тег.
docker pull nginx # = nginx:latest
docker pull nginx:1.25 # конкретная версия
docker pull nginx:1.25-alpine # slim вариант на Alpine Linux
docker pull postgres:16-alpinelatest — не обязательно последняя стабильная. В продакшне всегда пиши конкретную версию.
Docker Hub и реестры
По умолчанию образы берутся с Docker Hub (docker.io). Есть другие реестры:
# Docker Hub (по умолчанию)
docker pull nginx
# Другой реестр
docker pull ghcr.io/owner/repo:tag # GitHub Container Registry
docker pull registry.gitlab.com/... # GitLab Registry
docker pull gcr.io/project/image:tag # Google Container RegistryОфициальные образы (nginx, postgres) публикуются без prefix. Сторонние — с namespace: bitnami/postgresql.
Работа с образами
docker images # список скачанных образов
docker images -a # включая промежуточные слои
docker image ls # то же что docker images
docker pull nginx:1.25 # скачать
docker rmi nginx:1.25 # удалить образ
docker rmi $(docker images -q) # удалить все
docker inspect nginx # детали: слои, env, cmd
docker history nginx # история слоёвРазмер образов
docker images --format "table {{.Repository}}\t{{.Tag}}\t{{.Size}}"Alpine-варианты в 5-10 раз меньше. Для продакшна предпочтительны:
node:20-alpine— ~50MB vsnode:20— ~1GBnginx:alpine— ~20MB vsnginx— ~190MB
Кэш слоёв
Когда Docker строит образ (следующий урок — Dockerfile), он кэширует каждый слой. Если слой не изменился — он не пересобирается. Это делает повторные сборки быстрыми.
docker build . # первый раз — все слои
docker build . # второй раз — Using cache для неизменённыхВ следующем уроке — жизненный цикл контейнеров.
CMD ["node", "server.js"]COPY . .RUN npm ciCOPY package*.json ./WORKDIR /appFROM node:20-alpine