Docker Hub, private registry, push и pull образов
Реестры — хранилища Docker-образов. Изучите работу с Docker Hub, private registry и best practices публикации образов.
Docker Registry — сервис для хранения и распространения Docker-образов.
Типы реестров:
Docker Hub — публичный реестр по умолчанию.
# Поиск в CLI
docker search nginx
# С фильтром по звёздам
docker search --filter stars=100 python
# Только официальные образы
docker search --filter is-official=true# Вход в Docker Hub
docker login
# Выход
docker logout
# Вход с указанием пользователя
docker login -u username
# Вход в private registry
docker login registry.example.comГде хранятся креды:
~/.docker/config.json# Загрузить образ
docker pull nginx:latest
# Загрузить с указанием тега
docker pull nginx:1.25.3
# Загрузить все теги репозитория
docker pull --all-tags nginx
# Загрузить с конкретного реестра
docker pull gcr.io/google-containers/nginx:1.25# 1. Залогиниться
docker login
# 2. Собрать образ с правильным именем
docker build -t username/myapp:v1.0 .
# 3. Опубликовать
docker push username/myapp:v1.0
# 4. Опубликовать все теги
docker push username/myapp --all-tags# Локальный образ
docker build -t myapp:v1.0 .
# Тегирование для Hub
docker tag myapp:v1.0 username/myapp:v1.0
docker tag myapp:v1.0 username/myapp:latest
# Push
docker push username/myapp:v1.0Формат имени:
[registry/]username/repository:tag
# Docker Hub (по умолчанию)
username/myapp:v1.0
docker.io/library/nginx:latest
# Private registry
registry.example.com/team/myapp:v1.0
# Запуск официального образа registry
docker run -d \
-p 5000:5000 \
--name registry \
-v registry-data:/var/lib/registry \
registry:2Push и pull:
# Тегирование
docker tag myapp:v1.0 localhost:5000/myapp:v1.0
# Push
docker push localhost:5000/myapp:v1.0
# Pull
docker pull localhost:5000/myapp:v1.0# docker-compose.yml
version: '3.8'
services:
registry:
image: registry:2
ports:
- "5000:5000"
volumes:
- registry-data:/var/lib/registry
- ./certs:/certs
- ./auth:/auth
environment:
- REGISTRY_HTTP_TLS_CERTIFICATE=/certs/domain.crt
- REGISTRY_HTTP_TLS_KEY=/certs/domain.key
- REGISTRY_AUTH=htpasswd
- REGISTRY_AUTH_HTPASSWD_REALM=Registry
- REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd
restart: always
volumes:
registry-data:Создание пользователей:
# Установка htpasswd
apt install apache2-utils
# Создание файла с пользователями
htpasswd -Bbn admin password > auth/htpasswd
htpasswd -Bbn developer password >> auth/htpasswdНастройка Docker client:
# Для self-signed сертификатов
# Linux: /etc/docker/daemon.json
{
"insecure-registries": ["registry.example.com:5000"]
}
# Перезапуск Docker
sudo systemctl restart docker# Авторизация
aws ecr get-login-password --region us-east-1 | \
docker login --username AWS --password-stdin 123456789012.dkr.ecr.us-east-1.amazonaws.com
# Тегирование
docker tag myapp:v1.0 \
123456789012.dkr.ecr.us-east-1.amazonaws.com/myapp:v1.0
# Push
docker push \
123456789012.dkr.ecr.us-east-1.amazonaws.com/myapp:v1.0
# Pull
docker pull \
123456789012.dkr.ecr.us-east-1.amazonaws.com/myapp:v1.0# Авторизация
gcloud auth configure-docker
# Тегирование
docker tag myapp:v1.0 gcr.io/project-id/myapp:v1.0
# Push
docker push gcr.io/project-id/myapp:v1.0# Авторизация
az acr login --name myregistry
# Тегирование
docker tag myapp:v1.0 myregistry.azurecr.io/myapp:v1.0
# Push
docker push myregistry.azurecr.io/myapp:v1.0# Авторизация (создать Personal Access Token)
echo $GITHUB_TOKEN | docker login ghcr.io -u username --password-stdin
# Тегирование
docker tag myapp:v1.0 ghcr.io/username/myapp:v1.0
# Push
docker push ghcr.io/username/myapp:v1.0# Список репозиториев
curl -X GET http://localhost:5000/v2/_catalog
# Список тегов
curl -X GET http://localhost:5000/v2/myapp/tags/list# Удалить тег из registry API
curl -X DELETE \
http://localhost:5000/v2/myapp/manifests/sha256:abc123...
# Очистка unreferenced образов (в registry:2)
docker exec registry \
/bin/sh -c "rm -rf /var/lib/registry/docker/registry/v2/repositories/_layers"
# Перезапуск registry
docker restart registry# Остановка registry
docker stop registry
# Запуск GC
docker run --rm \
-v registry-data:/var/lib/registry \
registry:2 garbage-collect \
--delete-untagged \
/var/lib/registry/config.yml
# Запуск registry
docker start registry# ✅ Хорошо
docker pull nginx:1.25.3
docker push myapp:v1.0.0
# ❌ Плохо
docker pull nginx:latest
docker push myapp:latest# Семантическое версионирование
docker push myapp:1.0.0 # MAJOR.MINOR.PATCH
docker push myapp:1.0 # MAJOR.MINOR
docker push myapp:1 # MAJOR
# Git-based теги
docker push myapp:git-abc123
docker push myapp:pr-123
docker push myapp:branch-feature
# Временные теги
docker push myapp:2024.01.15# ✅ Хорошо
services:
app:
image: myapp:v1.0.0
# ❌ Плохо
services:
app:
image: myapp:latest# Включить Docker Content Trust
export DOCKER_CONTENT_TRUST=1
# Push с подписью
docker push myrepo/myapp:v1.0
# Pull проверяет подпись автоматически
docker pull myrepo/myapp:v1.0# Trivy перед публикацией
trivy image myapp:v1.0
# Только если нет критических уязвимостей
trivy image --exit-code 1 --severity CRITICAL myapp:v1.0 && \
docker push myapp:v1.0# Сборка для нескольких архитектур
docker buildx build \
--platform linux/amd64,linux/arm64 \
-t username/myapp:v1.0 \
--push \
.
# Проверка манифеста
docker manifest inspect username/myapp:v1.0# Private репозиторий в Docker Hub
# Через веб-интерфейс: Settings → Visibility → Private
# ECR policy
aws ecr set-repository-policy \
--repository-name myapp \
--policy-text file://policy.json# GitHub Actions
name: Build and Push
on:
push:
tags:
- 'v*'
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Login to Docker Hub
uses: docker/login-action@v2
with:
username: ${{ secrets.DOCKER_USERNAME }}
password: ${{ secrets.DOCKER_PASSWORD }}
- name: Build and push
uses: docker/build-push-action@v4
with:
push: true
tags: |
${{ secrets.DOCKER_USERNAME }}/myapp:${{ github.ref_name }}
${{ secrets.DOCKER_USERNAME }}/myapp:latestversion: '3.8'
services:
registry:
image: registry:2
ports:
- "5000:5000"
volumes:
- registry-data:/var/lib/registry
environment:
- REGISTRY_STORAGE_DELETE_ENABLED=true
app:
image: localhost:5000/myapp:v1.0
depends_on:
- registry# Проверить авторизацию
docker login
# Проверить права доступа к репозиторию
# Для ECR: aws ecr describe-repositories
# Для Docker Hub: проверить visibility репозитория# Для self-signed сертификатов
# Linux: /etc/docker/daemon.json
{
"insecure-registries": ["registry.example.com:5000"]
}
# Или скопировать сертификат
sudo cp ca.crt /usr/local/share/ca-certificates/
sudo update-ca-certificates
sudo systemctl restart docker# Проверить размер
du -sh /var/lib/docker/volumes/registry-data/_data
# Очистить старые образы
docker exec registry \
/bin/sh -c "find /var/lib/registry -type f -mtime +30 -delete"
# Запустить garbage collection# Проверить размер образа
docker images myapp
# Проверить сеть
ping registry.example.com
# Попробовать с меньшим числом слоёв
docker build --squash -t myapp:v1.0 .docker build -t myapp:1.0.0 .docker run --rm myapp:1.0.0 npm testtrivy image --exit-code 1 --severity CRITICAL myapp:1.0.0docker tag myapp:1.0.0 registry.example.com/team/myapp:1.0.0
docker tag myapp:1.0.0 registry.example.com/team/myapp:latestdocker push registry.example.com/team/myapp:1.0.0# На production сервере
docker pull registry.example.com/team/myapp:1.0.0
docker run -d --name myapp registry.example.com/team/myapp:1.0.0latestВ следующей теме вы изучите развёртывание Docker в production: логирование, мониторинг, CI/CD и best practices.
Вопросы ещё не добавлены
Вопросы для этой подтемы ещё не добавлены.