Bạn có biết?
Bạn có bao giờ phải chờ 10 phút để pull một image từ Docker Hub về server production không? Hoặc lo lắng về việc để image “free” (public) trên Docker Hub có thể bị ai đó tải xuống?
Docker Registry giúp bạn lưu trữ và quản lý image privately — nhanh hơn, bảo mật hơn, và kiểm soát được phiên bản.
Docker Registry là gì?
Docker Registry là hệ thống lưu trữ và phân phối Docker images. Có hai loại:
- ✅ Public Registry — Docker Hub (images công khai)
- ✅ Private Registry — Registry riêng (chỉ team nội bộ)
Public Registry (Docker Hub)
# Tìm kiếm image
$ docker search nginx
# Pull image từ Docker Hub
$ docker pull nginx:latest
# Push lên Docker Hub
$ docker tag myapp:latest username/myapp:latest
$ docker push username/myapp:latest
Private Registry
# Chạy local registry (port 5000)
$ docker run -d -p 5000:5000 --name registry registry:2
# Tag image cho local registry
$ docker tag myapp:latest localhost:5000/myapp:latest
# Push lên local registry
$ docker push localhost:5000/myapp:latest
# Pull từ local registry
$ docker pull localhost:5000/myapp:latest
Cài đặt Private Registry
1. Docker Registry Image
# Khởi động registry
$ docker run -d \
--name my-registry \
-p 5000:5000 \
-v registry-data:/var/lib/registry \
registry:2
# Kiểm tra registry đang chạy
$ curl http://localhost:5000/v2/_catalog
2. Cấu hình TLS (Production)
Production cần TLS để bảo mật:
# Tạo certificates (self-signed cho dev)
$ openssl req -x509 -newkey rsa:4096 \
-keyout registry.key -out registry.crt \
-days 365 -nodes -subj '/CN=registry.example.com'
# Chạy registry với TLS
$ docker run -d \
--name my-registry \
-p 5000:5000 \
-v $(pwd)/certs:/certs \
-e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/registry.crt \
-e REGISTRY_HTTP_TLS_KEY=/certs/registry.key \
registry:2
3. Authentication
# Tạo password file
$ mkdir auth
$ docker run --entrypoint htpasswd registry:2 -Bbn user password > auth/htpasswd
# Chạy registry với auth
$ docker run -d \
--name my-registry \
-p 5000:5000 \
-v $(pwd)/auth:/auth \
-e REGISTRY_AUTH=htpasswd \
-e REGISTRY_AUTH_HTPASSWD_REALM="Registry Realm" \
-e REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd \
registry:2
# Login
$ docker login registry.example.com:5000 -u user -p password
4. Docker Compose
# docker-compose.yml cho Private Registry
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/registry.crt
- REGISTRY_HTTP_TLS_KEY=/certs/registry.key
- REGISTRY_AUTH=htpasswd
- REGISTRY_AUTH_HTPASSWD_REALM="Registry Realm"
- REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd
volumes:
registry-data:
Quản lý Images trong Registry
1. Xem danh sách images
# Xem tất cả repositories
$ curl http://localhost:5000/v2/_catalog
{"repositories":["myapp","nginx"]}
# Xem tags của một image
$ curl http://localhost:5000/v2/myapp/tags/list
{"name":"myapp","tags":["latest","v1.0.0","v1.0.1"]}
2. Xóa images
# Bật chế độ cho phép xóa
# Thêm vào environment:
# REGISTRY_STORAGE_DELETE_ENABLED=true
# Xóa manifest (tag)
$ curl -X DELETE http://localhost:5000/v2/myapp/manifests/sha256:abc...
# Garbage collection
$ docker exec registry bin/registry garbage-collect /etc/docker/registry/config.yml
3. Web UI cho Registry
# Docker Registry UI (hominh/registry-web)
$ docker run -d \
-p 8080:8080 \
-e REGISTRY_URL=http://registry:5000 \
-e REGISTRY_NAME=localhost:5000 \
--link registry \
hominh/registry-web
Docker Hub vs Private Registry
| Tiêu chí | Docker Hub | Private Registry |
|---|---|---|
| Giá | Miễn phí (1 private), Paid cho nhiều | Miễn phí (tự host) |
| Tốc độ | Phụ thuộc internet | Nhanh (local network) |
| Bảo mật | Công khai hoặc paid private | Kiểm soát hoàn toàn |
| Access Control | User-based | User + IP + Certificate |
| Storage | Unlimited (paid) | Unlimited (tự quản lý) |
| CI/CD | Webhook có sẵn | Tự tích hợp |
Cloud Private Registries
1. AWS ECR (Elastic Container Registry)
# Cài đặt AWS CLI
$ aws ecr get-login-password | docker login --username AWS --password-stdin account.dkr.ecr.region.amazonaws.com
# Push image
$ docker tag myapp:latest account.dkr.ecr.region.amazonaws.com/myapp:latest
$ docker push account.dkr.ecr.region.amazonaws.com/myapp:latest
2. Google Artifact Registry
# Configure Docker
$ gcloud auth configure-docker
# Tag và push
$ docker tag myapp:latest region-docker.pkg.dev/project/myapp:latest
$ docker push region-docker.pkg.dev/project/myapp:latest
3. Azure Container Registry
# Login
$ az acr login --name myregistry
# Push image
$ docker tag myapp:latest myregistry.azurecr.io/myapp:latest
$ docker push myregistry.azurecr.io/myapp:latest
4. GitHub Container Registry (GHCR)
# Login với GitHub token
$ echo $GITHUB_TOKEN | docker login ghcr.io -u $GITHUB_USER --password-stdin
# Push
$ docker tag myapp:latest ghcr.io/user/myapp:latest
$ docker push ghcr.io/user/myapp:latest
5. Docker Hub Private
# Tạo repository private
# Settings → Repository → Set visibility → Private
# Pull/Push như bình thường
$ docker pull myorg/private-image:latest
$ docker push myorg/private-image:latest
Best Practices
- Quản lý phiên bản rõ ràng — Tag theo semantic version (v1.0.0)
- Luôn có latest — Cập nhật tag latest khi release stable
- Cấu hình TLS — Không dùng registry không có HTTPS
- Thiết lập authentication — Không để registry công khai
- Cache images locally — Pull về local registry để dùng nhanh
- Dọn dẹp thường xuyên — Xóa old tags và unused layers
- Scan images trước khi push — Dùng Docker Scout/Trivy
- Image retention policy — Giới hạn số tags retain
- Kiểm soát quyền truy cập — RBAC cho team
- Backup registry data — Định kỳ backup images
Bước tiếp theo
Kết thúc phần Nâng cao! Tiếp theo, hãy chuyển sang phần Thực hành — Deploy web app với Docker.
👉 Đọc tiếp: Deploy Web App với Docker: Nginx + Node.js