Нужен безопасный, быстрый и автономный способ хранения контейнерных образов? Развернуть собственный приватный Docker Registry проще, чем кажется.

Зачем запускать собственный Docker Registry?

Преимущества:

  • Обход ограничений Docker Hub
  • Безопасное хранение приватных образов
  • Ускорение CI/CD процессов
  • Контроль хранения и доступа к образам

Особенно полезно для изолированных (air-gapped) и корпоративных сред.

1. Требования

Понадобится:

  • Установленный Docker
  • Сервер или виртуальная машина
  • Необязательно: домен и TLS-сертификаты (для продакшена)

2. Быстрый запуск локального Registry

docker run -d -p 5000:5000 --name registry registry:2

Registry будет доступен на localhost:5000.

Пример загрузки образа:

docker tag alpine localhost:5000/alpine
docker push localhost:5000/alpine

Загрузка:

docker pull localhost:5000/alpine

3. Постоянное хранилище

Для продакшена подключите том:

docker run -d -p 5000:5000 \
  --name registry \
  -v /opt/registry/data:/var/lib/registry \
  registry:2

4. TLS через Nginx или Caddy (рекомендуется)

Обеспечьте HTTPS с помощью обратного прокси:

Пример для Caddy:

registry.example.com {
    reverse_proxy localhost:5000
    tls you@example.com
}

Запуск Caddy:

docker run -d \
  -v $PWD/Caddyfile:/etc/caddy/Caddyfile \
  -p 80:80 -p 443:443 \
  --name caddy \
  caddy

Теперь доступен по адресу: https://registry.example.com

Настройка клиента Docker:

{
  "insecure-registries" : ["registry.example.com"]
}

Совет: для продакшена используйте только реальные TLS-сертификаты.

5. Аутентификация (опционально)

Возможности:

Пример:

mkdir auth
docker run --entrypoint htpasswd httpd:2 -Bbn user pass > auth/htpasswd

Запуск:

docker run -d -p 5000:5000 \
  --name registry \
  -v $(pwd)/auth:/auth \
  -e "REGISTRY_AUTH=htpasswd" \
  -e "REGISTRY_AUTH_HTPASSWD_REALM=Registry Realm" \
  -e "REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd" \
  registry:2

6. Очистка старых образов

Registry не удаляет старые слои автоматически. Решения:

7. Бонус: Docker Compose

Создаем директорию и пользователя для аторизации:

mkdir -p ~/docker-registry/auth 
cd ~/docker-registry/auth
htpasswd -Bc registry.passwd  myuser

Описываем docker-compose:

vi ~/docker-registry/docker-compose.yml
version: '3'
services:
  registry:
    image: registry:2
    ports:
      - 5000:5000
    environment:
      REGISTRY_AUTH: htpasswd
      REGISTRY_AUTH_HTPASSWD_REALM: Registry-Realm
      REGISTRY_AUTH_HTPASSWD_PATH: /auth/registry.passwd
      REGISTRY_STORAGE_FILESYSTEM_ROOTDIRECTORY: /data
    volumes:
      - registry-data:/data
      - ./auth:/auth
volumes:
  registry-data:

Запуск:

cd ~/docker-registry
docker compose up -d

Сводка

ВозможностьЛокальный RegistryПродакшн
Постоянное хранилище❌ Нет✅ Да
Шифрование TLS❌ Нет✅ Да
Аутентификация❌ Нет✅ Да
Очистка⚠️ Вручную⚠️ Вручную

Заключение

Приватный Docker Registry — это быстрый способ получить полный контроль над контейнерными образами. Он делает DevOps-процессы безопаснее и эффективнее.


Полезные ссылки

Нужна помощь в автоматизации? Пиши в комментарии или свяжись с нами!