
Docker Registry
- 26 installs
- 2 repo stars
- Updated January 5, 2026
- pluginagentmarketplace/custom-plugin-docker
Stand up a private Docker Registry v2 with a web UI for tagging, browsing, and deleting images on a developer’s LAN or VPS.
About
Docker Registry is a template skill that packages a ready-to-run private image registry for indie teams tired of pushing every build to a public hub. It wires the official Registry 2 daemon with Joxit’s UI so you can catalog tags, show digests, and delete images from a browser while keeping data on a local volume. Solo builders use it when self-hosting APIs, agents, or multi-service SaaS and need a cheap internal mirror for CI or staging deploys. The compose file documents ports, CORS headers, delete enablement, and UI catalog limits so an agent can adapt auth and TLS without rediscovering registry quirks. You still must harden REGISTRY_SECURED, authentication, and backups for production; this skill accelerates the first correct compose layout on your machine or edge server.
- Docker Compose 3.8 stack: registry:2 on port 5000 plus joxit/docker-registry-ui on port 8080
- Filesystem-backed storage with named volume registry-data and optional ./auth mount
- UI env flags for catalog tags, delete images, content digest display, and proxy to internal registry URL
- Bridge network registry-net isolating registry and UI services
- Inline usage steps: compose up -d, tag images, push to localhost:5000
Docker Registry by the numbers
- 26 all-time installs (skills.sh)
- Ranked #884 of 1,453 DevOps & CI/CD skills by installs in the Skillselion catalog
- Security screen: HIGH risk (skills.sh audit)
- Data as of Jul 26, 2026 (Skillselion catalog sync)
npx skills add https://github.com/pluginagentmarketplace/custom-plugin-docker --skill docker-registryAdd your badge
Show developers this skill is listed on Skillselion. Paste this into your README.
| Installs | 26 |
|---|---|
| repo stars | ★ 2 |
| Security audit | 1 / 3 scanners passed |
| Last updated | January 5, 2026 |
| Repository | pluginagentmarketplace/custom-plugin-docker ↗ |
What it does
Stand up a private Docker Registry v2 with a web UI for tagging, browsing, and deleting images on a developer’s LAN or VPS.
Files
Docker Registry Skill
Set up and manage private Docker registries for secure image distribution and management.
Purpose
Deploy private registries, configure authentication, and manage images across multiple registries.
Parameters
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
| registry_type | enum | No | docker | docker/ecr/gcr/acr |
| auth | boolean | No | true | Enable authentication |
| tls | boolean | No | true | Enable TLS |
Registry Types
| Registry | Provider | Auth Method |
|---|---|---|
| Docker Hub | Docker | Username/token |
| GHCR | GitHub | GitHub token |
| ECR | AWS | IAM/CLI |
| GCR | Service account | |
| ACR | Azure | Service principal |
Private Registry Setup
Docker Compose
services:
registry:
image: registry:2
ports:
- "5000:5000"
volumes:
- registry_data:/var/lib/registry
- ./auth:/auth
- ./certs:/certs
environment:
REGISTRY_AUTH: htpasswd
REGISTRY_AUTH_HTPASSWD_REALM: Registry Realm
REGISTRY_AUTH_HTPASSWD_PATH: /auth/htpasswd
REGISTRY_HTTP_TLS_CERTIFICATE: /certs/domain.crt
REGISTRY_HTTP_TLS_KEY: /certs/domain.key
restart: unless-stopped
volumes:
registry_data:Create Auth File
# Create htpasswd file
docker run --rm --entrypoint htpasswd \
httpd:alpine -Bbn admin password > auth/htpasswdRegistry Operations
Login
# Docker Hub
docker login
# GitHub Container Registry
echo $GITHUB_TOKEN | docker login ghcr.io -u USERNAME --password-stdin
# AWS ECR
aws ecr get-login-password | docker login --username AWS --password-stdin <account>.dkr.ecr.<region>.amazonaws.com
# Private registry
docker login registry.example.comPush/Pull
# Tag for registry
docker tag myapp:latest registry.example.com/myapp:latest
# Push
docker push registry.example.com/myapp:latest
# Pull
docker pull registry.example.com/myapp:latestImage Management
# List images in registry (API)
curl -X GET https://registry.example.com/v2/_catalog
# List tags
curl -X GET https://registry.example.com/v2/myapp/tags/list
# Delete image (via API)
curl -X DELETE https://registry.example.com/v2/myapp/manifests/<digest>Multi-Registry Sync
# Copy between registries
skopeo copy \
docker://source-registry/image:tag \
docker://dest-registry/image:tag
# Sync all tags
skopeo sync --src docker --dest docker \
source-registry/image dest-registry/Cloud Registry Setup
AWS ECR
# Create repository
aws ecr create-repository --repository-name myapp
# Login
aws ecr get-login-password --region us-east-1 | \
docker login --username AWS --password-stdin <account>.dkr.ecr.us-east-1.amazonaws.com
# Push
docker push <account>.dkr.ecr.us-east-1.amazonaws.com/myapp:latestGoogle GCR
# Auth with service account
gcloud auth configure-docker
# Push
docker push gcr.io/project-id/myapp:latestError Handling
Common Errors
| Error | Cause | Solution |
|---|---|---|
unauthorized | Bad credentials | Re-login |
manifest unknown | Image not found | Check name/tag |
denied: access | No permission | Check IAM/roles |
TLS handshake | Certificate issue | Add to trusted certs |
Fallback Strategy
1. Verify credentials: docker login 2. Check image exists in registry 3. Verify network connectivity
Troubleshooting
Debug Checklist
- [ ] Logged in?
docker login - [ ] Image tagged correctly?
- [ ] Registry accessible?
curl https://registry/v2/ - [ ] TLS configured? Check certificates
Usage
Skill("docker-registry")Assets
assets/docker-compose-registry.yaml- Registry setupscripts/registry-setup.sh- Setup script
Related Skills
- docker-optimization
- docker-ci-cd
# Docker Registry with UI
# Version: 1.0.0
# Usage: docker-compose -f docker-compose-registry.yaml up -d
version: '3.8'
services:
registry:
image: registry:2
container_name: docker-registry
restart: always
ports:
- "5000:5000"
environment:
REGISTRY_STORAGE_FILESYSTEM_ROOTDIRECTORY: /var/lib/registry
REGISTRY_HTTP_HEADERS_Access-Control-Allow-Origin: '["*"]'
REGISTRY_HTTP_HEADERS_Access-Control-Allow-Methods: '["HEAD", "GET", "OPTIONS", "DELETE"]'
REGISTRY_HTTP_HEADERS_Access-Control-Allow-Headers: '["Authorization", "Accept"]'
REGISTRY_STORAGE_DELETE_ENABLED: "true"
volumes:
- registry-data:/var/lib/registry
- ./auth:/auth
networks:
- registry-net
registry-ui:
image: joxit/docker-registry-ui:latest
container_name: registry-ui
restart: always
ports:
- "8080:80"
environment:
- SINGLE_REGISTRY=true
- REGISTRY_TITLE=Private Docker Registry
- DELETE_IMAGES=true
- SHOW_CONTENT_DIGEST=true
- NGINX_PROXY_PASS_URL=http://registry:5000
- SHOW_CATALOG_NB_TAGS=true
- CATALOG_MIN_BRANCHES=1
- CATALOG_MAX_BRANCHES=0
- TAGLIST_PAGE_SIZE=100
- REGISTRY_SECURED=false
- CATALOG_ELEMENTS_LIMIT=1000
depends_on:
- registry
networks:
- registry-net
volumes:
registry-data:
driver: local
networks:
registry-net:
driver: bridge
# Usage:
# 1. Start registry: docker-compose up -d
# 2. Tag image: docker tag myimage:latest localhost:5000/myimage:latest
# 3. Push image: docker push localhost:5000/myimage:latest
# 4. Access UI: http://localhost:8080
Docker Registry Guide
Quick Start
Run Local Registry
docker run -d -p 5000:5000 --name registry registry:2Push Image to Registry
# Tag the image
docker tag myapp:latest localhost:5000/myapp:latest
# Push to registry
docker push localhost:5000/myapp:latestPull Image from Registry
docker pull localhost:5000/myapp:latestAuthentication Setup
Create Password File
mkdir auth
docker run --rm --entrypoint htpasswd \
httpd:2 -Bbn admin password123 > auth/htpasswdRun with Authentication
docker run -d -p 5000:5000 \
-v $(pwd)/auth:/auth \
-e "REGISTRY_AUTH=htpasswd" \
-e "REGISTRY_AUTH_HTPASSWD_REALM=Registry" \
-e "REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd" \
--name registry registry:2Login to Registry
docker login localhost:5000TLS Configuration
Generate Self-Signed Certificate
mkdir certs
openssl req -newkey rsa:4096 -nodes -sha256 \
-keyout certs/domain.key -x509 -days 365 \
-out certs/domain.crtRun with TLS
docker run -d -p 443:443 \
-v $(pwd)/certs:/certs \
-e REGISTRY_HTTP_ADDR=0.0.0.0:443 \
-e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/domain.crt \
-e REGISTRY_HTTP_TLS_KEY=/certs/domain.key \
--name registry registry:2Registry API
List Repositories
curl http://localhost:5000/v2/_catalogList Tags
curl http://localhost:5000/v2/myapp/tags/listDelete Image
# Get digest
DIGEST=$(curl -I -H "Accept: application/vnd.docker.distribution.manifest.v2+json" \
http://localhost:5000/v2/myapp/manifests/latest 2>&1 | \
grep Docker-Content-Digest | awk '{print $2}' | tr -d '\r')
# Delete
curl -X DELETE http://localhost:5000/v2/myapp/manifests/$DIGESTGarbage Collection
# Run garbage collection
docker exec registry bin/registry garbage-collect \
/etc/docker/registry/config.yml
# Dry run first
docker exec registry bin/registry garbage-collect \
--dry-run /etc/docker/registry/config.yml#!/bin/bash
# Docker Private Registry Setup Script
# Version: 1.0.0
# Usage: ./registry-setup.sh [--with-auth] [--with-tls]
set -e
REGISTRY_PORT=${REGISTRY_PORT:-5000}
REGISTRY_DIR=${REGISTRY_DIR:-/var/lib/registry}
WITH_AUTH=false
WITH_TLS=false
# Parse arguments
while [[ $# -gt 0 ]]; do
case $1 in
--with-auth) WITH_AUTH=true; shift ;;
--with-tls) WITH_TLS=true; shift ;;
*) echo "Unknown option: $1"; exit 1 ;;
esac
done
echo "=========================================="
echo "Docker Private Registry Setup"
echo "=========================================="
echo "Port: $REGISTRY_PORT"
echo "Data Directory: $REGISTRY_DIR"
echo "Authentication: $WITH_AUTH"
echo "TLS: $WITH_TLS"
echo "=========================================="
# Create directories
mkdir -p "$REGISTRY_DIR"
mkdir -p ./auth
mkdir -p ./certs
# Setup authentication if requested
if [ "$WITH_AUTH" = true ]; then
echo ""
echo "Setting up authentication..."
if ! command -v htpasswd &> /dev/null; then
echo "Installing apache2-utils for htpasswd..."
apt-get update && apt-get install -y apache2-utils
fi
read -p "Enter username: " USERNAME
read -s -p "Enter password: " PASSWORD
echo ""
htpasswd -Bbn "$USERNAME" "$PASSWORD" > ./auth/htpasswd
echo "Authentication configured for user: $USERNAME"
fi
# Generate self-signed certificate if TLS requested
if [ "$WITH_TLS" = true ]; then
echo ""
echo "Generating self-signed certificate..."
openssl req -newkey rsa:4096 -nodes -sha256 \
-keyout ./certs/domain.key \
-x509 -days 365 \
-out ./certs/domain.crt \
-subj "/CN=localhost"
echo "TLS certificate generated"
fi
# Build docker run command
RUN_CMD="docker run -d --name registry --restart=always"
RUN_CMD="$RUN_CMD -p $REGISTRY_PORT:5000"
RUN_CMD="$RUN_CMD -v $REGISTRY_DIR:/var/lib/registry"
RUN_CMD="$RUN_CMD -e REGISTRY_STORAGE_DELETE_ENABLED=true"
if [ "$WITH_AUTH" = true ]; then
RUN_CMD="$RUN_CMD -v $(pwd)/auth:/auth"
RUN_CMD="$RUN_CMD -e REGISTRY_AUTH=htpasswd"
RUN_CMD="$RUN_CMD -e REGISTRY_AUTH_HTPASSWD_REALM=Registry"
RUN_CMD="$RUN_CMD -e REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd"
fi
if [ "$WITH_TLS" = true ]; then
RUN_CMD="$RUN_CMD -v $(pwd)/certs:/certs"
RUN_CMD="$RUN_CMD -e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/domain.crt"
RUN_CMD="$RUN_CMD -e REGISTRY_HTTP_TLS_KEY=/certs/domain.key"
fi
RUN_CMD="$RUN_CMD registry:2"
# Stop existing registry if running
docker stop registry 2>/dev/null || true
docker rm registry 2>/dev/null || true
# Start registry
echo ""
echo "Starting registry..."
eval "$RUN_CMD"
# Verify
sleep 2
if docker ps | grep -q registry; then
echo ""
echo "=========================================="
echo "Registry started successfully!"
echo "=========================================="
echo ""
echo "Usage:"
echo " Tag: docker tag myimage localhost:$REGISTRY_PORT/myimage"
echo " Push: docker push localhost:$REGISTRY_PORT/myimage"
echo " Pull: docker pull localhost:$REGISTRY_PORT/myimage"
echo ""
if [ "$WITH_AUTH" = true ]; then
echo "Login: docker login localhost:$REGISTRY_PORT"
fi
else
echo "ERROR: Registry failed to start"
docker logs registry
exit 1
fi
Related skills
FAQ
Is Docker Registry safe to install?
skills.sh reports 1 of 3 security scanners passed. Review the Security Audits panel on this page before installing in production.