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

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

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

Время чтения: 14 dk Контейнеры и оркестрация
dockerregistryобразharborконтейнерci/cdхранилищеприватный registry

Содержание

Настройка приватного 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-пайплайны.