Перейти к основному содержимому
Вернуться в категорию

Настройка приватного Docker Registry: Хранение и управление образами

Настройка приватного Docker Registry, безопасный registry с TLS, аутентификация, операции push/pull образов, корпоративный registry с Harbor и интеграция с CI/CD.

Время чтения: 14 dk Контейнеры и оркестрация
dockerregistryобразharborконтейнерci/cdхранилищеприватный registry
Автор
REXE Teknoloji Network & Security Team
Редактор
REXE Teknoloji Technical Editorial
Первая публикация
Последнее обновление

Настройка приватного Docker Registry

Публичные registry, такие как Docker Hub, удобны, но хостинг собственного registry для приватных образов даёт преимущества в безопасности, скорости и стоимости. В этом руководстве рассматриваются варианты от простого Docker Registry до корпоративного Harbor.

Зачем нужен приватный registry?

ПреимуществоОписание
БезопасностьПриватные образы не доступны публично
СкоростьБыстрый pull/push в локальной сети
СтоимостьНет ограничений Docker Hub
КонтрольПолный контроль жизненного цикла образов
СоответствиеТребования локализации данных

1. Простой Docker Registry (registry:2)

Базовая настройка

hljs bash
# Запустить контейнер registry
docker run -d \
  --name registry \
  --restart always \
  -p 5000:5000 \
  -v registry-data:/var/lib/registry \
  registry:2

# Проверить работу registry
curl http://localhost:5000/v2/
# Вывод: {}

Push и Pull образов

hljs bash
# Тегировать образ
docker tag myapp:latest localhost:5000/myapp:latest

# Отправить в registry
docker push localhost:5000/myapp:latest

# Получить из registry
docker pull localhost:5000/myapp:latest

# Список образов в registry
curl http://localhost:5000/v2/_catalog

2. Безопасный Registry с TLS

hljs bash
# Создать директорию для сертификатов
mkdir -p /etc/docker/certs/registry

# Создать самоподписанный сертификат
openssl req -newkey rsa:4096 -nodes -sha256 \
  -keyout /etc/docker/certs/registry/domain.key \
  -x509 -days 365 \
  -out /etc/docker/certs/registry/domain.crt \
  -subj "/CN=registry.example.com" \
  -addext "subjectAltName=DNS:registry.example.com,IP:192.168.1.100"

# Добавить сертификат в доверенные сертификаты Docker
mkdir -p /etc/docker/certs.d/registry.example.com:5000
cp /etc/docker/certs/registry/domain.crt \
   /etc/docker/certs.d/registry.example.com:5000/ca.crt

systemctl restart docker

Запуск Registry с TLS

hljs bash
docker run -d \
  --name registry \
  --restart always \
  -p 5000:5000 \
  -v registry-data:/var/lib/registry \
  -v /etc/docker/certs/registry:/certs \
  -e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/domain.crt \
  -e REGISTRY_HTTP_TLS_KEY=/certs/domain.key \
  registry:2

3. Registry с аутентификацией

hljs bash
# Создать файл htpasswd
mkdir -p /etc/docker/registry/auth
docker run --rm \
  --entrypoint htpasswd \
  httpd:2 -Bbn admin StrongPass123! > /etc/docker/registry/auth/htpasswd

# Запустить registry с аутентификацией
docker run -d \
  --name registry \
  --restart always \
  -p 5000:5000 \
  -v registry-data:/var/lib/registry \
  -v /etc/docker/certs/registry:/certs \
  -v /etc/docker/registry/auth:/auth \
  -e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/domain.crt \
  -e REGISTRY_HTTP_TLS_KEY=/certs/domain.key \
  -e REGISTRY_AUTH=htpasswd \
  -e REGISTRY_AUTH_HTPASSWD_REALM="Registry Realm" \
  -e REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd \
  registry:2

# Войти в систему
docker login registry.example.com:5000

4. Registry с Docker Compose

hljs yaml
version: '3.8'

services:
  registry:
    image: registry:2
    restart: always
    ports:
      - "5000:5000"
    environment:
      REGISTRY_HTTP_TLS_CERTIFICATE: /certs/domain.crt
      REGISTRY_HTTP_TLS_KEY: /certs/domain.key
      REGISTRY_AUTH: htpasswd
      REGISTRY_AUTH_HTPASSWD_REALM: Registry Realm
      REGISTRY_AUTH_HTPASSWD_PATH: /auth/htpasswd
      REGISTRY_STORAGE_DELETE_ENABLED: "true"
    volumes:
      - registry-data:/var/lib/registry
      - ./certs:/certs:ro
      - ./auth:/auth:ro

  registry-ui:
    image: joxit/docker-registry-ui:latest
    ports:
      - "8080:80"
    environment:
      - REGISTRY_TITLE=REXE Private Registry
      - REGISTRY_URL=https://registry.example.com:5000
      - SINGLE_REGISTRY=true

volumes:
  registry-data:

5. Harbor — Корпоративный Registry

hljs bash
wget https://github.com/goharbor/harbor/releases/download/v2.9.0/harbor-online-installer-v2.9.0.tgz
tar xzf harbor-online-installer-v2.9.0.tgz
cd harbor
cp harbor.yml.tmpl harbor.yml
nano harbor.yml
hljs yaml
hostname: registry.example.com

https:
  port: 443
  certificate: /etc/harbor/certs/domain.crt
  private_key: /etc/harbor/certs/domain.key

harbor_admin_password: StrongPass123!
data_volume: /data/harbor
hljs bash
./install.sh
docker login registry.example.com

6. Очистка Registry (Garbage Collection)

hljs bash
# Очистить неиспользуемые слои
docker exec registry registry garbage-collect \
  /etc/docker/registry/config.yml

# Пробный запуск
docker exec registry registry garbage-collect \
  --dry-run \
  /etc/docker/registry/config.yml

7. Интеграция с CI/CD

hljs yaml
# .github/workflows/build-push.yml
name: Build and Push

on:
  push:
    branches: [main]

jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4

      - name: Login to Private Registry
        uses: docker/login-action@v3
        with:
          registry: registry.example.com:5000
          username: ${{ secrets.REGISTRY_USER }}
          password: ${{ secrets.REGISTRY_PASSWORD }}

      - name: Build and Push
        uses: docker/build-push-action@v5
        with:
          context: .
          push: true
          tags: registry.example.com:5000/myapp:${{ github.sha }}

Заключение

Приватный Docker Registry необходим для безопасности образов и управления ими в корпоративных средах. Выбирайте registry:2 для простых случаев, Harbor — для корпоративных функций (RBAC, сканирование безопасности, репликация). С приватным registry на серверах REXE вы можете безопасно хранить образы и интегрировать их в CI/CD-пайплайны.

Часто задаваемые вопросы

Почему стоит использовать приватный registry вместо Docker Hub?

Несколько важных причин: 1) Безопасность — ваши приватные образы не доступны публично, 2) Скорость — pull/push намного быстрее в локальной сети, 3) Нет ограничений — бесплатные аккаунты Docker Hub имеют почасовые лимиты pull, 4) Контроль данных — ваши образы хранятся на вашем сервере, 5) Соответствие — некоторые отрасли требуют локализации данных.

Получаю ошибку insecure registry, как исправить?

Если вы используете HTTP-registry (без TLS), нужно сообщить Docker доверять ей как небезопасному registry. Добавьте {"insecure-registries": ["registry.example.com:5000"]} в /etc/docker/daemon.json и перезапустите Docker. Использование TLS в production настоятельно рекомендуется.

Диск registry заполнен, как очистить?

Два шага: 1) Сначала удалите образы через API (DELETE /v2/IMAGE/manifests/DIGEST), 2) Затем запустите garbage collection (docker exec registry registry garbage-collect /etc/docker/registry/config.yml). Без garbage collection удаляется только манифест — слои остаются на диске.

В чём разница между Harbor и registry:2?

registry:2 — простое, лёгкое хранилище образов. Harbor предлагает корпоративные функции: RBAC (управление доступом на основе ролей), сканирование уязвимостей (интеграция Trivy), репликацию образов, вебхуки, журналы аудита и веб-интерфейс. registry:2 рекомендуется для небольших команд, Harbor — для крупных организаций.

Не могу получить образы из приватного registry в Kubernetes, почему?

Kubernetes нужны учётные данные registry. Создайте учётные данные как secret с kubectl create secret docker-registry и добавьте imagePullSecrets в deployment. Альтернативно добавьте imagePullSecrets к service account, чтобы сделать его действительным для всего namespace.

Связанные статьи

Сетевой трафикВходящий GbpsИсходящий Gbps