สร้าง Private Docker Registry บน Server ตัวเอง

Private Registry คืออะไร?

Private Docker Registry คือที่เก็บ Docker Image ส่วนตัวบน Server ของคุณเอง ไม่ต้องพึ่ง Docker Hub เหมาะสำหรับทีมที่ต้องการความเป็นส่วนตัวสูงหรือ Pull ได้เร็วกว่าเพราะ Network ภายใน

วิธีที่ 1: ใช้ registry:2 อย่างง่าย

docker run -d \
  --name registry \
  --restart unless-stopped \
  -p 5000:5000 \
  -v registry_data:/var/lib/registry \
  registry:2

วิธีที่ 2: Docker Compose พร้อม Basic Auth

version: '3.8'
services:
  registry:
    image: registry:2
    container_name: docker_registry
    restart: unless-stopped
    ports:
      - "5000:5000"
    volumes:
      - registry_data:/var/lib/registry
      - ./auth:/auth
    environment:
      REGISTRY_AUTH: htpasswd
      REGISTRY_AUTH_HTPASSWD_REALM: "Docker Registry"
      REGISTRY_AUTH_HTPASSWD_PATH: /auth/htpasswd
      REGISTRY_STORAGE_DELETE_ENABLED: "true"

volumes:
  registry_data:

สร้าง htpasswd สำหรับ Authentication

# ติดตั้ง htpasswd tool
apt-get install -y apache2-utils

# สร้างไฟล์ auth
mkdir auth
htpasswd -Bbn myuser mypassword > auth/htpasswd

Push Image ไป Private Registry

# Login
docker login localhost:5000 -u myuser -p mypassword

# Tag Image
docker tag myapp:latest localhost:5000/myapp:latest

# Push
docker push localhost:5000/myapp:latest

# Pull กลับ
mcp pull localhost:5000/myapp:latest
docker pull localhost:5000/myapp:latest

เพิ่ม HTTPS ด้วย Nginx Reverse Proxy

version: '3.8'
services:
  registry:
    image: registry:2
    container_name: docker_registry
    restart: unless-stopped
    volumes:
      - registry_data:/var/lib/registry
      - ./auth:/auth
    environment:
      REGISTRY_AUTH: htpasswd
      REGISTRY_AUTH_HTPASSWD_REALM: "Docker Registry"
      REGISTRY_AUTH_HTPASSWD_PATH: /auth/htpasswd

  nginx:
    image: nginx:1.25-alpine
    restart: unless-stopped
    ports:
      - "443:443"
      - "80:80"
    volumes:
      - ./nginx/registry.conf:/etc/nginx/conf.d/default.conf
      - /etc/letsencrypt:/etc/letsencrypt:ro
    depends_on:
      - registry

volumes:
  registry_data:

Nginx config (nginx/registry.conf)

server {
    listen 443 ssl;
    server_name registry.yourdomain.com;

    ssl_certificate /etc/letsencrypt/live/registry.yourdomain.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/registry.yourdomain.com/privkey.pem;

    client_max_body_size 2048m;

    location / {
        proxy_pass http://registry:5000;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}

ใช้งานจาก Server อื่น

# Login จาก Server อื่น
docker login registry.yourdomain.com -u myuser -p mypassword

# Pull Image
docker pull registry.yourdomain.com/myapp:latest

# Push จาก CI/CD
docker tag myapp:v1.0 registry.yourdomain.com/myapp:v1.0
docker push registry.yourdomain.com/myapp:v1.0

Harbor: Private Registry ขั้นสูงกว่า

หากต้องการ GUI, Role-Based Access Control, และการ Scan Security ลองใช้ Harbor เป็น Enterprise-grade Registry:

# ติดตั้งผ่าน Helm (Kubernetes) หรือดาวน์โหลด installer
curl -L https://github.com/goharbor/harbor/releases/download/v2.10.0/harbor-online-installer-v2.10.0.tgz | tar xz
cd harbor
cp harbor.yml.tmpl harbor.yml
# แก้ hostname และ SSL path ใน harbor.yml
./install.sh

สรุป

Private Docker Registry ด้วย registry:2 ติดตั้งง่าย เหมาะสำหรับทีมขนาดเล็กถึงกลาง ถ้าต้องการความครบครันมากขึ้นให้พิจารณาใช้ Harbor แทน