Настройка приватного Docker Registry: Хранение и управление образами
Настройка приватного Docker Registry, безопасный registry с TLS, аутентификация, операции push/pull образов, корпоративный registry с Harbor и интеграция с CI/CD.
Содержание
Настройка приватного Docker Registry
Публичные registry, такие как Docker Hub, удобны, но хостинг собственного registry для приватных образов даёт преимущества в безопасности, скорости и стоимости. В этом руководстве рассматриваются варианты от простого Docker Registry до корпоративного Harbor.
Зачем нужен приватный registry?
| Преимущество | Описание |
|---|---|
| Безопасность | Приватные образы не доступны публично |
| Скорость | Быстрый pull/push в локальной сети |
| Стоимость | Нет ограничений Docker Hub |
| Контроль | Полный контроль жизненного цикла образов |
| Соответствие | Требования локализации данных |
1. Простой Docker Registry (registry:2)
Базовая настройка
# Запустить контейнер 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 образов
# Тегировать образ
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
# Создать директорию для сертификатов
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
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 с аутентификацией
# Создать файл 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
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
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
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
./install.sh
docker login registry.example.com
6. Очистка Registry (Garbage Collection)
# Очистить неиспользуемые слои
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
# .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-пайплайны.
Связанные статьи
Установка Kubernetes с K3s: Лёгкая оркестрация контейнеров
Настройка одно- и многоузлового кластера Kubernetes с K3s, использование kubectl, создание deployments и services, управление приложениями с Helm. Руководство по Kubernetes для VPS.
Управление Docker Volume и сетями: Постоянное хранилище и сетевая конфигурация
Типы Docker volume (named, bind mount, tmpfs), управление volumes, режимы Docker-сетей (bridge, host, overlay), создание пользовательских сетей и взаимодействие контейнеров. Полное руководство.
Логирование контейнеров: Управление логами Docker и Kubernetes
Драйверы логов Docker, команда docker logs, логи подов Kubernetes, централизованный сбор логов (Loki, ELK Stack), ротация логов и лучшие практики управления логами в production.