
Docker Registry
Stand up a private Docker Registry v2 with a web UI for tagging, browsing, and deleting images on a solo builder’s LAN or VPS.
Install
npx skills add https://github.com/pluginagentmarketplace/custom-plugin-docker --skill docker-registryWhat is this skill?
- 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
Adoption & trust: 1 installs on skills.sh; 2 GitHub stars; 1/3 security scanners passed (skills.sh audits); trending (+100% hot-view momentum).
Recommended Skills
Azure Kubernetesmicrosoft/azure-skills
Github Actions Docsxixu-me/skills
Deploy To Vercelvercel-labs/agent-skills
Vercel Cli With Tokensvercel-labs/agent-skills
Turborepovercel/turborepo
Docker Expertsickn33/antigravity-awesome-skills
Journey fit
Primary fit
Operate is the right shelf because the artifact is long-running registry infrastructure you maintain after the app exists. Infra subphase matches container image storage, compose networking, and persistent volume layout—not application feature work.
Common Questions / 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.
SKILL.md
READMESKILL.md - Docker Registry
# 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 ```bash docker run -d -p 5000:5000 --name registry registry:2 ``` ### Push Image to Registry ```bash # Tag the image docker tag myapp:latest localhost:5000/myapp:latest # Push to registry docker push localhost:5000/myapp:latest ``` ### Pull Image from Registry ```bash docker pull localhost:5000/myapp:latest ``` ## Authentication Setup ### Create Password File ```bash mkdir auth docker run --rm --entrypoint htpasswd \ httpd:2 -Bbn admin password123 > auth/htpasswd ``` ### Run with Authentication ```bash 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:2 ``` ### Login to Registry ```bash docker login localhost:5000 ``` ## TLS Configuration ### Generate Self-Signed Certificate ```bash mkdir certs openssl req -newkey rsa:4096 -nodes -sha256 \ -keyout certs/domain.key -x509 -days 365 \ -out certs/domain.crt ``` ### Run with TLS ```bash 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:2 ``` ## Registry API ### List Repositories ```bash curl http://localhost:5000/v2/_catalog ``` ### List Tags ```bash curl http://localhost:5000/v2/myapp/tags/list ``` ### Delete Image ```bash # 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/$DIGEST ``` ## Garbage Collection ```bash # 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 [[ $