Проксирование Docker
NORA может работать как сквозной кэш (pull-through cache) для вышестоящих Docker-реестров. Если образ не найден локально, NORA загружает его из настроенного upstream-реестра, сохраняет в кэш и отдаёт клиенту. Последующие запросы обслуживаются из кэша.
Принцип работы
Заголовок раздела «Принцип работы»docker pull nora:4000/library/nginx:latest │ ▼ ┌──────┐ попадание в кэш ┌───────────┐ │ NORA │ ──────────────────► │ хранилище │ └──┬───┘ └───────────┘ │ промах кэша ▼ ┌────────────┐ загрузка + фоновое кэширование │ upstream │ ────────────────────────────────► хранилище │ (Docker Hub)│ └────────────┘- Клиент запрашивает образ у NORA
- NORA проверяет локальное хранилище — если найден, отдаёт сразу (попадание в кэш)
- Если не найден, перебирает настроенные upstreams последовательно
- Первый успешный ответ возвращается клиенту
- Образ сохраняется в хранилище асинхронно в фоне
- Следующий запрос того же образа обслуживается из кэша
Настройка
Заголовок раздела «Настройка»Две переменные окружения управляют поведением прокси:
| Переменная | По умолчанию | Описание |
|---|---|---|
NORA_DOCKER_UPSTREAMS | https://registry-1.docker.io | Список upstream-реестров через запятую |
NORA_DOCKER_PROXY_TIMEOUT | 60 | Таймаут HTTP-запросов к upstream (секунды) |
Один upstream (Docker Hub)
Заголовок раздела «Один upstream (Docker Hub)»По умолчанию NORA проксирует к Docker Hub без дополнительной настройки:
docker pull nora.internal:4000/library/nginx:latestНесколько upstreams с резервированием
Заголовок раздела «Несколько upstreams с резервированием»NORA перебирает upstreams по порядку. Если Docker Hub недоступен или не содержит нужный образ, используется следующий:
NORA_DOCKER_UPSTREAMS="https://registry-1.docker.io,https://ghcr.io,https://quay.io"config.toml
Заголовок раздела «config.toml»[docker]proxy_timeout = 60
[[docker.upstreams]]url = "https://registry-1.docker.io"
[[docker.upstreams]]url = "https://ghcr.io"Пример Docker Compose
Заголовок раздела «Пример Docker Compose»services: nora: image: ghcr.io/getnora-io/nora:latest ports: - 4000:4000 volumes: - nora-data:/data environment: - NORA_HOST=0.0.0.0 - NORA_DOCKER_UPSTREAMS=https://registry-1.docker.io,https://ghcr.io - NORA_DOCKER_PROXY_TIMEOUT=30 restart: unless-stopped
volumes: nora-data:Примеры использования
Заголовок раздела «Примеры использования»Загрузка образов Docker Hub через NORA
Заголовок раздела «Загрузка образов Docker Hub через NORA»# Вместо: docker pull nginx:latestdocker pull nora.internal:4000/library/nginx:latest
# Вместо: docker pull redis:7-alpinedocker pull nora.internal:4000/library/redis:7-alpine
# Образы пользовательских репозиториев:docker pull nora.internal:4000/grafana/grafana:latestЗагрузка образов GHCR через NORA
Заголовок раздела «Загрузка образов GHCR через NORA»Если GHCR указан в списке upstreams и образ отсутствует в Docker Hub:
docker pull nora.internal:4000/getnora-io/nora:latestИспользование как зеркало Docker
Заголовок раздела «Использование как зеркало Docker»Настройте демон Docker для использования NORA как зеркала реестра. Отредактируйте /etc/docker/daemon.json:
{ "registry-mirrors": ["http://nora.internal:4000"]}Перезапустите Docker:
sudo systemctl restart dockerТеперь все команды docker pull автоматически проходят через NORA:
# Этот запрос пойдёт через кэш NORA:docker pull nginx:latestАутентификация
Заголовок раздела «Аутентификация»NORA обрабатывает аутентификацию к upstream-реестрам автоматически:
- Отправляет неаутентифицированный запрос к upstream
- При ответе
401 Unauthorizedизвлекает заголовокWww-Authenticate - Получает bearer-токен от сервиса аутентификации upstream
- Повторяет запрос с токеном
- Токены кэшируются на 5 минут для каждой пары реестр/репозиторий
Учётные данные не требуются для публичных образов. Docker Hub, GHCR и Quay поддерживают анонимную загрузку публичных репозиториев.
Поддерживаемые upstreams
Заголовок раздела «Поддерживаемые upstreams»Любой реестр, совместимый с Docker Registry v2 API:
| Реестр | URL |
|---|---|
| Docker Hub | https://registry-1.docker.io |
| GitHub Container Registry | https://ghcr.io |
| Quay.io | https://quay.io |
| GitLab Container Registry | https://registry.gitlab.com |
| Google Artifact Registry | https://REGION-docker.pkg.dev |
| AWS ECR | https://ACCOUNT.dkr.ecr.REGION.amazonaws.com |
Мониторинг
Заголовок раздела «Мониторинг»NORA отслеживает эффективность кэша через метрики Prometheus на /metrics:
nora_cache_hits_total— образы, отданные из локального кэшаnora_cache_misses_total— образы, загруженные из upstreamnora_docker_downloads_total— общее количество операций загрузки Docker
Процент попаданий в кэш также отображается на панели мониторинга в веб-интерфейсе.
Ограничения
Заголовок раздела «Ограничения»- Только загрузка — прокси работает только на чтение. Отправка образов (push) идёт в локальное хранилище NORA и не пересылается в upstream.
- Последовательный перебор — upstreams опрашиваются один за другим, не параллельно. При таймауте первого upstream задержка суммируется.
- Без аутентификации к приватным upstreams — поддерживается только анонимный доступ и bearer-токен (OAuth2). Передача логина/пароля к приватным upstream-реестрам пока не реализована.
- Асинхронное кэширование — запись в кэш происходит в фоне. При перезапуске NORA во время кэширования образ не сохранится и будет загружен повторно при следующем запросе.
См. также
Заголовок раздела «См. также»- Параметры конфигурации — полный справочник
- TLS / HTTPS — настройка обратного прокси
- Развёртывание — полное руководство