ติดตั้ง Harbor Docker Registry บน VPS
Harbor เป็น container image registry แบบ open-source ที่ให้ความสามารถในการจัดเก็บ Docker images อย่างปลอดภัยโดยมี HTTPS, user management, vulnerability scanning และ image replication สำหรับทีมงาน หากคุณต้องการ private registry สำหรับ team แทนการใช้ Docker Hub บทความนี้จะสอนวิธีติดตั้ง Harbor บน VPS ของคุณให้พร้อมใช้งาน รวมถึง setup HTTPS, user management, และ vulnerability scanning ด้วย
ความต้องการของระบบ
ก่อนเริ่มการติดตั้ง Harbor ตรวจสอบให้แน่ใจว่าตรงตามความต้องการเหล่านี้:
- CPU: 2 cores ขึ้นไป (4+ cores แนะนำ)
- RAM: 4 GB ขึ้นไป (8+ GB แนะนำ)
- Storage: 160 GB ขึ้นไป (เพื่อเก็บ Docker images)
- Docker Engine: 17.06.0 CE ขึ้นไป
- Docker Compose: 1.18.0 ขึ้นไป
- Domain name: สำหรับ HTTPS (เช่น registry.example.com)
ในบทความนี้เราจะใช้ VPS ที่มี CPU 4 cores, RAM 8 GB และ 200 GB storage ซึ่งเหมาะสมสำหรับ Harbor instance ขนาดกลาง
ติดตั้ง Docker และ Docker Compose
Harbor ขึ้นอยู่กับ Docker และ Docker Compose ดังนั้นเราต้องติดตั้ง tools เหล่านี้ก่อน หากคุณมี Docker และ Docker Compose อยู่แล้วสามารถข้ามส่วนนี้ได้
# อัปเดต package manager
sudo apt update && sudo apt upgrade -y
# ติดตั้ง Docker
sudo apt install -y docker.io docker-compose
# เพิ่ม user ปัจจุบันเข้า docker group
sudo usermod -aG docker $USER
newgrp docker
# ตรวจสอบการติดตั้ง Docker
docker --version
docker-compose --version
newgrp docker คุณอาจต้องเปิด terminal ใหม่เพื่อให้ user group ทำงานอย่างถูกต้องดาวน์โหลดและเตรียมการ Harbor
ดาวน์โหลด Harbor binary package จาก GitHub releases page และเตรียมดิเรกทอรี่สำหรับการติดตั้ง
# สร้างดิเรกทอรี่สำหรับ Harbor
mkdir -p ~/harbor
cd ~/harbor
# ดาวน์โหลด Harbor (ตรวจสอบ version ล่าสุดจาก github.com/goharbor/harbor/releases)
wget https://github.com/goharbor/harbor/releases/download/v2.8.4/harbor-offline-installer-v2.8.4.tgz
# แตกไฟล์
tar xzf harbor-offline-installer-v2.8.4.tgz
# เข้าไปในดิเรกทอรี่ Harbor
cd harbor
# ดูไฟล์ที่มี
ls -la
จะเห็นไฟล์ harbor.yml.tmpl ซึ่งเป็น template configuration และ install.sh ซึ่งจะใช้ติดตั้ง Harbor
ตั้งค่า Harbor Configuration
คัดลอก template configuration และแก้ไขให้เหมาะสมกับสภาวะการใช้งานของคุณ
# คัดลอก template เป็น harbor.yml
cp harbor.yml.tmpl harbor.yml
# แก้ไข harbor.yml ด้วย nano หรือ vim
nano harbor.yml
ส่วนต่อไปนี้คือการตั้งค่าที่สำคัญใน harbor.yml:
# ชื่อ hostname ของ Harbor registry
hostname: registry.example.com
# HTTP port (ปกติ 80)
http:
port: 80
# HTTPS port (ปกติ 443) - เปิดใช้งาน HTTPS
https:
port: 443
certificate: /path/to/your/certificate.crt
private_key: /path/to/your/private.key
# ข้อมูล Harbor admin
harbor_admin_password: YourSecurePassword123!
# ปริมาณ storage สำหรับ database
data_volume: /data
# เปิดใช้งาน vulnerability scanning
trivyoffline: true
# เปิดใช้งาน image replication
replication:
enabled: true
# Log level (info, debug, warning, error)
log:
level: info
ตั้งค่า HTTPS ด้วย Let's Encrypt
เพื่อให้ Harbor มีความปลอดภัยสูง เราต้องใช้ HTTPS ซึ่งสามารถได้รับ SSL certificate ฟรีจาก Let's Encrypt ผ่าน Certbot
# ติดตั้ง Certbot
sudo apt install -y certbot python3-certbot-nginx
# สร้าง SSL certificate จาก Let's Encrypt
# (ตรวจสอบให้แน่ใจว่า domain ชี้ไป VPS IP ของคุณก่อน)
sudo certbot certonly --standalone -d registry.example.com
# Certbot จะบันทึก certificate ไว้ที่:
# /etc/letsencrypt/live/registry.example.com/fullchain.pem (certificate)
# /etc/letsencrypt/live/registry.example.com/privkey.pem (private key)
หลังจากได้ SSL certificate แล้ว อัปเดต harbor.yml ให้ชี้ไปยังไฟล์ certificate และ private key:
https:
port: 443
certificate: /etc/letsencrypt/live/registry.example.com/fullchain.pem
private_key: /etc/letsencrypt/live/registry.example.com/privkey.pem
ติดตั้ง Harbor
เมื่อเตรียมการตั้งค่า HTTPS และ configuration เรียบร้อยแล้วสามารถรันตัวติดตั้ง Harbor ได้
# ย้ายไปยังดิเรกทอรี่ Harbor
cd ~/harbor/harbor
# รัน install script
sudo ./install.sh
# จาก script จะแสดง loading progress
# [Step 0]: checking if docker command is available ...
# [Step 1]: checking docker version ...
# [Step 2]: checking docker-compose version ...
# [Step 3]: Preparing environment ...
# [Step 4]: Building docker images ...
# [Step 5]: Prepare notary files ...
# [Step 6]: Prepare core files ...
# [Step 7]: docker-compose up -d ...
# ติดตั้งเสร็จแล้วจะเห็น:
# ✔ ----Harbor has been installed and started successfully.----
การติดตั้งอาจใช้เวลา 5-15 นาทีขึ้นอยู่กับความเร็วเน็ตเวิร์ก และประสิทธิภาพ VPS หลังจากเสร็จสมบูรณ์ Harbor services จะเริ่มทำงานแบบ background
เพิ่มผู้ใช้และตั้งค่า Project
หลังการติดตั้ง Harbor ให้เข้า web interface ที่ https://registry.example.com ด้วย username admin และรหัสผ่านที่ตั้งไว้ใน harbor.yml
ขั้นตอนการเพิ่มผู้ใช้ใหม่:
- เข้า Harbor web UI ด้วย admin account
- ไปที่ Administration > Users
- กด "New User" และกรอกข้อมูล username, email และรหัสผ่าน
- เลือก user role (Project Admin, Developer, Guest)
- กด "OK" เพื่อสร้าง user
สร้าง project ใหม่สำหรับเก็บ Docker images:
- ไปที่ Projects > New Project
- ตั้งชื่อ project (เช่น "myapp")
- เลือก access level (Public หรือ Private)
- อนุญาต repository public/private
- เปิดใช้งาน image scanning
ตรวจสอบว่า Harbor ทำงานถูกต้อง
เมื่อติดตั้ง Harbor เสร็จแล้วให้ตรวจสอบว่าทุก service ทำงานถูกต้องด้วยคำสั่งต่อไปนี้:
# เช็ค Docker containers ของ Harbor
docker-compose ps
# ควรเห็น containers เหล่านี้:
# NAME COMMAND STATUS
# harbor-core "/harbor/start.sh" Up (healthy)
# harbor-portal "nginx -g daemon off" Up (healthy)
# harbor-db "docker-entrypoint..." Up (healthy)
# harbor-jobservice "/harbor/start.sh" Up (healthy)
# registry "/entrypoint.sh /etc..." Up (healthy)
# redis "redis-server redis..." Up (healthy)
# ตรวจสอบ Harbor API health status
curl -k https://registry.example.com/api/v2.0/systeminfo
# ผลลัพธ์ควรเป็น JSON ที่มี project_creation_restriction เป็น "authenticated"
# ตรวจสอบ container logs
docker-compose logs harbor-core
# เข้า Harbor web interface เพื่อตรวจสอบ
# https://registry.example.com
# Login ด้วย admin account
-k flag กับ curl เพื่อสกip SSL verificationPush และ Pull Docker Images
เมื่อ Harbor พร้อมใช้งานแล้วสามารถ push Docker images ไปเก็บที่ Harbor private registry ได้
# Login เข้า Harbor registry
docker login -u admin -p YourPassword https://registry.example.com
# Tag Docker image ให้ชี้ไปยัง Harbor registry
docker tag myapp:latest registry.example.com/myapp/myapp:latest
# Push image ไปยัง Harbor
docker push registry.example.com/myapp/myapp:latest
# ผลลัพธ์ควรเป็น:
# The push refers to repository [registry.example.com/myapp/myapp]
# sha256:abc123... Pushed
# 1.2 MB
# Pull image จาก Harbor
docker pull registry.example.com/myapp/myapp:latest
หลังจาก push images ไปยัง Harbor สามารถดูรายการ images ในหน้า Projects > myapp > Repositories ได้
แก้ปัญหาที่พบบ่อย
ข้อผิดพลาด: Connection refused - 111
ข้อผิดพลาดนี้เกิดขึ้นเมื่อพยายาม login หรือ push image แต่ Harbor service ยังไม่พร้อม หรือ port ยังไม่เปิด
วิธีแก้:
# ตรวจสอบว่า Harbor containers กำลังทำงาน
docker-compose ps
# ถ้าไม่มีใครทำงาน ให้เริ่ม Harbor
cd ~/harbor/harbor
docker-compose up -d
# ตรวจสอบว่า port 443 และ 80 เปิดในไฟร์วอลล์
sudo ufw status
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw reload
# ตรวจสอบ port ว่าเปิดหรือไม่
netstat -tlnp | grep -E ':80|:443'
ข้อผิดพลาด: SSL certificate verify failed
ข้อผิดพลาดนี้เกิดขึ้นเมื่อ SSL certificate ไม่ถูกต้องหรือหมดอายุ
วิธีแก้:
# ตรวจสอบวันหมดอายุของ SSL certificate
openssl x509 -in /etc/letsencrypt/live/registry.example.com/fullchain.pem -noout -enddate
# Renew SSL certificate ถ้าหมดอายุ
sudo certbot renew
# สำหรับ self-signed certificate ให้เพิ่ม certificate ไปยัง Docker daemon
# คัดลอก certificate ไปยัง /etc/docker/certs.d/
sudo mkdir -p /etc/docker/certs.d/registry.example.com
sudo cp /etc/letsencrypt/live/registry.example.com/fullchain.pem \
/etc/docker/certs.d/registry.example.com/ca.crt
# Restart Docker
sudo systemctl restart docker
ข้อผิดพลาด: unauthorized: authentication required
ข้อผิดพลาดนี้เกิดขึ้นเมื่อลืม login หรือ credentials ไม่ถูกต้อง
วิธีแก้:
# ตรวจสอบว่า logged in หรือไม่
cat ~/.docker/config.json
# Login ใหม่
docker logout registry.example.com
docker login -u admin -p YourPassword registry.example.com
# ตรวจสอบการ login ว่าสำเร็จ
curl -u admin:YourPassword https://registry.example.com/api/v2.0/systeminfo -k
ข้อผิดพลาด: insufficient_scope - project/repo/artifact scope
ข้อผิดพลาดนี้เกิดขึ้นเมื่อ user ไม่มีสิทธิ์ push images ไปยัง project นั้น
วิธีแก้:
# เข้า Harbor web UI ด้วย admin account
# ไปที่ Projects > myapp > Members
# เพิ่ม user ที่ต้องการให้มีสิทธิ์ push/pull images
# เลือก role เป็น "Maintainer" หรือ "Developer"
# หลังเปลี่ยน role ให้ user logout แล้ว login ใหม่
docker logout registry.example.com
docker login -u username -p password registry.example.com
คำถามที่พบบ่อย
Harbor สามารถเก็บ images ได้กี่ตัว?
Harbor สามารถเก็บ Docker images ได้จำนวนมากมาย ข้อจำกัดหลักคือพื้นที่เก็บข้อมูล (storage) ของ VPS ขนาดของแต่ละ image ที่แตกต่างกัน ตัวอย่างเช่น Ubuntu image ขนาดประมาณ 77 MB, Node.js ขนาดประมาณ 900 MB ดังนั้นหาก storage เท่า 200 GB สามารถเก็บ images ได้ประมาณ 200-300 ตัว ขึ้นอยู่กับขนาดของแต่ละตัว เพื่อเพิ่มความสามารถในการเก็บ สามารถขยาย storage ของ VPS ได้
สามารถใช้ Harbor กับ Kubernetes ได้หรือไม่?
ใช่ Harbor ทำงานได้ดีกับ Kubernetes เมื่อ push images ไปยัง Harbor เสร็จแล้ว สามารถให้ Kubernetes pull images จาก Harbor registry ได้โดยการสร้าง imagePullSecret ใน Kubernetes Deployment manifest ตัวอย่างคำสั่ง:
# สร้าง secret สำหรับเก็บ Harbor credentials
kubectl create secret docker-registry harbor-secret \
--docker-server=registry.example.com \
--docker-username=admin \
--docker-password=YourPassword \
[email protected]
# ใช้ secret ใน Deployment manifest
apiVersion: apps/v1
kind: Deployment
metadata:
name: myapp
spec:
template:
spec:
imagePullSecrets:
- name: harbor-secret
containers:
- name: myapp
image: registry.example.com/myapp/myapp:latest
วิธีสำรองข้อมูล Harbor registry ได้อย่างไร?
เพื่อสำรองข้อมูล Harbor ต้องสำรองไฟล์ database และ images volumes ด้วยคำสั่งต่อไปนี้:
# หยุด Harbor services
cd ~/harbor/harbor
docker-compose stop
# สำรองข้อมูล Harbor
sudo tar czf ~/harbor-backup-$(date +%Y%m%d).tar.gz \
-C /data registry/ database/
# เริ่ม Harbor services ใหม่
docker-compose start
# เพื่อ restore backup ให้ stop Harbor แล้ว extract files
docker-compose stop
sudo rm -rf /data/{registry,database}
sudo tar xzf ~/harbor-backup-20240627.tar.gz -C /data
docker-compose start