VDS · Docker и контейнеры

Свой реестр образов

Когда нужен собственный 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 не в копии. Потеряете все образы, для которых нет исходников под рукой. См. что копировать.