7.06. DockerHub и реестры образов
DockerHub и реестры образов
У новичка может возникнуть вопрос - а как узнать название нужного образа, чтобы из него развернуть контейнер?
По аналогии с GitHub, у Docker есть свой реестр с тысячами готовых образов - Docker Hub. Это самое популярное место для поиска и загрузки образов.
- Поиск через интерфейс.
Чтобы найти образы на Docker Hub, нужно перейти на сайт (https://hub.docker.com/), и в строке поиска ввести название приложения или технологии, например, nginx, mysql, python. Кроме официальных образов, есть и пользовательские. многие могут быть и полезны, но стоит проверять на надёжность. Официальные образы помечены как Official Image.
После того, как нашли нужный образ, вы можете запустить его с помощью команды docker run. Например:
docker run -d -p 80:80 nginx
Эта команда скачает и запустит официальный образ Nginx.
- Поиск образов через CLI.
Если вы предпочитаете работать в терминале, Docker предоставляет команду docker search, которая позволяет искать образы прямо из командной строки. Пример:
docker search python
Вывод команды будет в виде таблицы:
- NAME : Название образа.
- DESCRIPTION : Краткое описание.
- STARS : Популярность образа (чем больше звезд, тем лучше).
- OFFICIAL : Указывает, является ли образ официальным.
- AUTOMATED : Указывает, был ли образ автоматически собран.
- Другие реестры контейнеров.
Помимо Docker Hub, существуют другие реестры образов:
- Quay.io — альтернативный реестр контейнеров, который часто используется для корпоративных проектов.
- GitHub Container Registry — реестр, интегрированный с GitHub. Многие проекты публикуют свои образы здесь.
- Amazon ECR — сервис AWS для хранения и управления Docker-образами.
- Google GCR — реестр от Google Cloud.
Если хотим использовать образ из другого реестра, нужно указать полный путь к образу, включая домен реестра. Например:
docker run quay.io/bitnami/nginx
Для работы с Amazon ECR придётся сначала выполнить аутентификацию:
aws ecr get-login-password | docker login --username AWS --password-stdin <aws_account_id>.dkr.ecr.<region>.amazonaws.com
И только затем можно запустить образ:
docker run <aws_account_id>.dkr.ecr.<region>.amazonaws.com/repo-name:tag
Каждый образ может иметь несколько версий, которые обозначаются тегами. Теги позволяют выбирать конкретную версию образа:
docker run python:3.9
docker run python:3.10
docker run python:latest
latest: Последняя версия (по умолчанию).
Увидеть доступные теги можно на странице образа в реестре. К примеру, на Docker Hub будет вкладка Tags.

- Создание своих образов.
Если вы не нашли подходящий образ, вы можете создать свой, используя Dockerfile. После создания образа вы можете загрузить его в Docker Hub или другой реестр.
Нужно сначала создать аккаунт на Docker Hub, а затем авторизоваться в CLI:
docker login
Потом нужно пометить образ:
docker tag my-image username/my-image:tag
И загрузить:
docker push username/my-image:tag
- Локальные образы.
Когда выполняется команда docker run, Docker сначала проверяет, есть ли запрашиваемый образ локально. Если образ не найден, Docker автоматически пытается скачать его из реестра (Docker Hub).
Когда запускается команда docker run <image>:<tag>, Docker выполняет следующие шаги:
- Docker проверяет, есть ли указанный образ в локальном хранилище образов на ПК. Локальное хранилище — это кэш, где хранятся все образы, которые скачали или создали. Если тег не указан, будет подставляться тег latest.
- Если образ существует в локальном хранилище, Docker будет использовать его для запуска;
- Если образ не найден локально, Docker пытается скачать его из удалённого реестра:
- отправляет запрос в реестр, чтобы найти образ с указанным именем и тегом;
- если образ найден, он скачивается и сохраняется в локальном хранилище;
- после загрузки образа Docker запускает контейнер.
Таким образом, Docker работает по приоритету:
Локальное хранилище - Удалённый реестр - Ошибка (если нет нигде).
Локальные образы хранятся в системе в виде слоёв (layers). Каждый слой представляет собой изменение, сделанное в процессе сборки образа. Это позволяет эффективно использовать дисковое пространство и кэширование.
Локальные образы хранятся в каталоге Docker на компьютере. Расположение зависит от операционной системы:
- Linux : /var/lib/docker/
- Windows (Docker Desktop) : Внутри виртуальной машины WSL2 или Hyper-V.
- macOS (Docker Desktop) : Внутри виртуальной машины. Чтобы увидеть список всех локальных образов, используется команда:
docker images
В выводе будут следующие столбцы:
- REPOSITORY : Имя образа.
- TAG : Тег образа (версия).
- IMAGE ID : Уникальный идентификатор образа.
- CREATED : Дата создания образа.
- SIZE : Размер образа.
Чтобы удалить образ, используется команда:
docker rmi <image_id>
Если образ используется хотя бы одним контейнером (даже остановленным), Docker выдаст ошибку. Поэтому перед удалением образа нужно удалить сначала контейнер:
docker rm <container_id>
Когда Docker скачивает образ из удалённого реестра, он делает это поэтапно, слой за слоем. Образ состоит из нескольких слоёв, каждый из которых соответствует одной инструкции в Dockerfile. Например:
FROM ubuntu:20.04
RUN apt-get update
RUN apt-get install -y python3
Здесь будет три слоя:
- Базовый образ ubuntu:20.04.
- Результат выполнения apt-get update.
- Результат выполнения apt-get install -y python3.
Docker загружает только те слои, которых ещё нет в локальном хранилище. Если часть слоёв уже есть (например, базовый образ ubuntu:20.04), Docker использует их повторно.
Чтобы узнать, какие образы были скачаны из удалённого реестра, а какие созданы локально, используйте команду:
docker inspect <image_id>
Docker активно использует кэширование для оптимизации работы с образами. Если вы запускаете один и тот же образ несколько раз, Docker не будет заново скачивать его, если он уже есть локально. Если вы создаёте новый образ с помощью Dockerfile, Docker использует кэширование слоёв, чтобы ускорить процесс сборки.