Власний реєстр образів
Коли потрібен власний реєстр, як налаштувати його з паролем і сертифікатом, скільки диска він споживає та як не перетворити його на звалище старих образів.
Оновлено 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не потрапив у резервні копії. Ви втратите всі образи, для яких джерел під рукою немає. Дивіться що резервувати.