Какие инструменты вы использовали для хранения Docker-образов (реестры)?

«Какие инструменты вы использовали для хранения Docker-образов (реестры)?» — вопрос из категории Docker, который задают на 23% собеседований Devops Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Работал с различными реестрами в зависимости от требований к безопасности, стоимости и интеграции:

Публичные и облачные реестры:

  • Docker Hub – для публичных образов базовых ОС и софта (например, nginx:alpine). Для приватных репозиториев использовал редко из-за лимитов.
  • AWS ECR / Google GCR / Azure ACR – основной выбор в облачных проектах. Интеграция с IAM и встроенная безопасность (сканирование на уязвимости в ECR, immutable tags в GCR).

Приватные/корпоративные реестры:

  • Harbor – разворачивал on-premise и в облаке. Ключевые фичи: vulnerability scanning (интеграция с Trivy/Clair), replication между инстансами, подписание образов (Notary).
  • GitLab Container Registry – использовал в связке с GitLab CI. Удобно, так как образ автоматически собирался и пушился в тот же проект.
  • Nexus Repository OSS – универсальное решение, когда нужно хранить не только Docker-образы, но и артефакты Maven, npm пакеты.

Рабочий процесс:

  1. Сборка и тегирование образа с версией (git commit SHA) и latest для основной ветки.
  2. Аутентификация: docker login или использование credHelpers (для ECR).
  3. Push образа. В CI/CD пайплайне это выглядело так:
    # Пример для AWS ECR
    aws ecr get-login-password --region eu-west-1 | docker login --username AWS --password-stdin 123456789.dkr.ecr.eu-west-1.amazonaws.com
    docker build -t my-app:${CI_COMMIT_SHA} .
    docker tag my-app:${CI_COMMIT_SHA} 123456789.dkr.ecr.eu-west-1.amazonaws.com/my-project/my-app:${CI_COMMIT_SHA}
    docker push 123456789.dkr.ecr.eu-west-1.amazonaws.com/my-project/my-app:${CI_COMMIT_SHA}
  4. В Kubernetes использовал imagePullSecrets для доступа к приватным реестрам.