Перейти к содержимому
TelegramGitHub

Образы и реестры

Образ — это шаблон, из которого запускают контейнер. Образ только читают. Контейнер — это запущенная копия образа.

Образы лежат в реестре (registry). Команда docker run сама скачивает образ из реестра, если его нет на вашем компьютере.

Полное имя состоит из трёх частей:

реестр / репозиторий : тег
docker.io/library/postgres:17
ЧастьПримерЧто значит
Реестрdocker.ioГде лежит образ. По умолчанию Docker Hub
Репозиторийlibrary/postgresИмя образа. library — официальные образы
Тег17Версия или вариант образа. По умолчанию latest

Когда вы пишете postgres:17, Docker читает это как docker.io/library/postgres:17.

РеестрАдресЧто там
Docker Hubdocker.ioОфициальные образы: postgres, python, nginx, alpine
GitHub Container Registryghcr.ioОбразы проектов на GitHub. Например ghcr.io/dbt-labs/...
Quayquay.ioОбразы Red Hat и Jupyter: quay.io/jupyter/scipy-notebook
Облачные реестрыAWS ECR, Google Artifact Registry, Azure ACRЧастные образы вашей команды. Об этом — в уроке Контейнеры в продакшене

Для образа не из Docker Hub пишите адрес реестра целиком: ghcr.io/owner/name:tag.

Окно терминала
docker pull alpine:3.22

Посмотреть, какие образы уже есть:

Окно терминала
docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
alpine 3.22 49340b346798 ... 8.54MB
python 3.12-slim 5e2bdb1b0d54 ... 145MB
postgres 17 ... ... 477MB

Список на вашем компьютере будет другим. Столбцы такие же. IMAGE ID — короткий отпечаток образа.

Тег latest — ловушка. Он значит «последняя версия на сегодня». Завтра это будет другая версия.

Пример:

  • В 2024 году postgres:latest был Postgres 16.
  • Сегодня та же команда скачает Postgres 18. Это другая мажорная версия.
  • Данные в томе от старой версии могут не подойти к новой. Контейнер может не стартовать.

Правило: всегда пишите версию. Это postgres:17, python:3.12-slim, nginx:1.29.

ТегНасколько точный
postgres:latestПлохо. Меняется без предупреждения
postgres:17Хорошо. Мажорная версия фиксирована, обновляются только патчи
postgres:17.11Строго. Меняется только по вашему решению

Один и тот же Python есть в нескольких вариантах:

ОбразРазмерЧто внутри
python:3.12около 1 ГБПолный Debian и компиляторы
python:3.12-slimоколо 145 МБDebian без лишнего. Наш выбор
python:3.12-alpineменьше всегоAlpine Linux. Часть пакетов Python ставится долго или не ставится

Начинайте с -slim. Он маленький и работает с обычными пакетами Python (pip install без сюрпризов). Alpine берут, когда размер важнее всего, и вы знаете, зачем.

Тег можно перенести на другой образ. Digest перенести нельзя. Это отпечаток содержимого образа.

Окно терминала
docker image inspect alpine:3.22 --format '{{index .RepoDigests 0}}'
alpine@sha256:49340b346798875b5592e5d420241f2f9cfba5f47e62ebb1446a1b34734e898f

Запуск по digest: docker run alpine@sha256:49340b.... В продакшене это даёт полную гарантию, что образ тот же. Для учёбы хватает тега с версией.

У образа может быть несколько сборок для разных процессоров. Intel и AMD — это linux/amd64. Apple Silicon (M1–M4) и многие серверы AWS Graviton — это linux/arm64.

Если сборки для вашего процессора нет, получите ошибку. Вот настоящий пример на Mac с чипом M:

Окно терминала
docker run --rm ghcr.io/dbt-labs/dbt-postgres:1.9.latest --version
docker: no matching manifest for linux/arm64/v8 in the manifest list entries

Образ dbt-postgres не собран для arm64. Что делать:

СпособКоманда или шагМинус
Запустить как amd64docker run --platform linux/amd64 ...Эмуляция. Медленно, иногда с ошибками
Собрать свой образFROM python:3.12-slim и pip install dbt-postgresНужно написать Dockerfile

Второй способ лучше. Мы сделаем его в уроке Open source за минуты.

Узнать платформу образа:

Окно терминала
docker image inspect alpine:3.22 --format '{{.Os}}/{{.Architecture}}'

Образы, тома и кэш сборки занимают много места. Посмотреть, сколько:

Окно терминала
docker system df
TYPE TOTAL ACTIVE SIZE RECLAIMABLE
Images 12 3 4.2GB 3.1GB (73%)
Containers 4 3 120MB 35MB (29%)
Local Volumes 6 2 1.1GB 900MB (81%)
Build Cache 40 0 200MB 200MB

Цифры у вас будут другими. На компьютере, где Docker работает давно, это бывают десятки гигабайт. Столбец RECLAIMABLE показывает, сколько места можно освободить.

Удалить один образ:

Окно терминала
docker rmi alpine:3.22

Образ нельзя удалить, пока есть контейнер из него, даже остановленный. Сначала удалите контейнер.

Чистка без риска

Команды docker system prune и docker volume prune удаляют сразу много. volume prune может удалить том с базой данных, если ни один контейнер сейчас его не использует.

Безопасный порядок:

  1. Посмотрите, что есть: docker system df, docker images, docker volume ls.
  2. Удаляйте по имени: docker rmi <образ>, docker volume rm <том>.
  3. Если всё же нужен prune, начните с остановленных контейнеров: docker container prune. Он спросит подтверждение.
  4. Тома не чистите массово. Сначала проверьте каждый.

Работайте в любой папке. Файлы курса пока не нужны.

Скачайте образ alpine:3.22 командой pull. Потом выведите его размер из списка образов, только для alpine.

Проверка: в списке есть строка с alpine и тегом 3.22. Размер около 8–9 МБ.

Решение
Окно терминала
docker pull alpine:3.22
docker images alpine

Найдите digest образа alpine:3.22.

Проверка: ответ начинается с alpine@sha256: и содержит 64 символа после двоеточия.

Решение
Окно терминала
docker image inspect alpine:3.22 --format '{{index .RepoDigests 0}}'

Сравните размеры python:3.12-slim и python:3.12. Скачайте оба и выведите размеры. Какой больше и во сколько раз?

Проверка: полный образ в несколько раз больше slim. Точные цифры зависят от версии.

Решение
Окно терминала
docker pull python:3.12-slim
docker pull python:3.12
docker images python

Потом удалите полный образ, он вам не нужен: docker rmi python:3.12.

Какая у образа postgres:17 платформа (ОС и архитектура)?

Проверка: linux/arm64 на Mac с чипом M. linux/amd64 на Intel и AMD.

Решение
Окно терминала
docker pull postgres:17
docker image inspect postgres:17 --format '{{.Os}}/{{.Architecture}}'

Дальше: Порты и переменные окружения.