Свой реестр образов
Когда нужен собственный registry, как поднять его с паролем и сертификатом, сколько он ест диска и как не превратить его в свалку старых образов.
Обновлено 23 августа 2026 г.
Реестр — хранилище образов. Свой нужен в трёх случаях: образы приватные и не должны уезжать наружу, сборка идёт часто и внешние ограничения на скачивание мешают, или вы разворачиваете одно и то же на несколько машин.
Простой вариант: registry:2
services:
registry:
image: registry:2
restart: unless-stopped
environment:
REGISTRY_AUTH: htpasswd
REGISTRY_AUTH_HTPASSWD_REALM: Registry
REGISTRY_AUTH_HTPASSWD_PATH: /auth/htpasswd
REGISTRY_STORAGE_DELETE_ENABLED: "true"
volumes:
- ./data:/var/lib/registry
- ./auth:/auth:ro
ports:
- "127.0.0.1:5000:5000"
Пароль создаётся так:
mkdir -p auth
docker run --rm --entrypoint htpasswd httpd:2 -Bbn deploy 'длинный-пароль' > auth/htpasswd
docker compose up -d
Порт наружу не публикуем: перед реестром ставится веб-сервер с сертификатом. Docker отказывается работать с чужим реестром по HTTP — и это правильно, потому что через него на ваши машины приезжает исполняемый код.
Работа с ним
docker login registry.example.com
docker tag myapp:1.5.0 registry.example.com/myapp:1.5.0
docker push registry.example.com/myapp:1.5.0
docker pull registry.example.com/myapp:1.5.0
curl -u deploy https://registry.example.com/v2/_catalog
curl -u deploy https://registry.example.com/v2/myapp/tags/list
Учётные данные после docker login лежат в ~/.docker/config.json в открытом виде (base64 — не шифрование). На машинах сборки заводите отдельную учётную запись только с правом чтения.
Реестр без ограничения по размеру и без чистки — самый быстрый способ забить диск. Каждая сборка добавляет слои, а удаление тега место не освобождает: нужен сбор мусора. На VDS-1 с 40 ГБ реестр активного проекта заполнит диск за пару недель.
Чистка
Удаление тега и последующий сбор мусора:
docker compose exec registry registry garbage-collect \
--delete-untagged /etc/docker/registry/config.yml
Останавливать реестр на время сбора мусора обязательно — иначе параллельная выгрузка может потерять слои:
docker compose stop registry
docker compose run --rm registry registry garbage-collect --delete-untagged /etc/docker/registry/config.yml
docker compose start registry
Заведите это заданием по расписанию раз в неделю и следите за местом на диске.
Альтернатива: реестр в составе Git-сервера
Если вы уже подняли Forgejo или Gitea, в них встроено хранилище пакетов, включая образы Docker. Отдельный сервис не нужен: доступ идёт по тем же учётным записям, а образы видны рядом с кодом. Для небольших проектов это удобнее отдельного registry:2.
Частые ошибки
- Реестр открыт без авторизации. Через него можно подложить образ, который развернётся у вас же на боевой машине.
- Тег
latestвместо версий. Реестр перестаёт быть источником воспроизводимости: непонятно, что именно развёрнуто. См. обновление контейнеров. - Хранилище на том же диске, что и база. Всплеск выгрузки съедает полосу диска и тормозит боевой сервис — см. скорость диска.
- Каталог
./dataне в копии. Потеряете все образы, для которых нет исходников под рукой. См. что копировать.