Skip to content
VDS · Docker і контейнери

Власний реєстр образів

Коли потрібен власний реєстр, як налаштувати його з паролем і сертифікатом, скільки диска він споживає та як не перетворити його на звалище старих образів.

Оновлено 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 'long-password' > 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

Під час збирання сміття реєстр потрібно зупинити — інакше паралельний push може втратити шари:

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 замість версій. Реєстр перестає бути джерелом відтворюваності: незрозуміло, що саме розгорнуто. Дивіться оновлення контейнерів.
  • Сховище на тому самому диску, що й база даних. Сплеск push'ів з'їдає пропускну здатність диска й сповільнює продакшн-сервіс — дивіться швидкість диска.
  • Каталог ./data не потрапив у резервні копії. Ви втратите всі образи, для яких джерел під рукою немає. Дивіться що резервувати.