ทำ Private Registry เก็บ images docker ไว้ใช้เอง
คือด้วยความที่เน็ตไม่แรงเอาซะเลย กว่าจะโหลด image จาก hub.docker ได้ ใช้เวลานานพอสมควร ยิ่งตอน push(upload) ก็ใช้เวลามาก ผมเลยย่อระยะทาง การฝาก image มาไว้ที่ registry ส่วนตัว ติดตั้งผ่าน docker ให้ใช้งานได้เร็วขึ้นครับ
เริ่มกันเลย
ผมอธิบายแบ่งเป็น 2 ช่วงนะครับ
— ติดตั้ง
— ใช้งาน
— ติดตั้ง
— ใช้งาน
ติดตั้ง
สิ่งที่ต้องเตรียม
- เริ่มจาก pull image registry มาที่เครื่องก่อน
docker image pull registry:2.6.2
เลข 2.6.2 เป็น version นะครับ ถ้าไม่ใส่จะเรียก latest ให้โดยอัตโนมัติ
2. ทำการ Generating Cert เพื่อขอ two keys ที่จะใช้ จากตัวอย่างนี้เราเถื่อนแท้ ๆ ด้วย Self-Signed นะครัช ใครจะใช้ตัวอื่นๆ ก็ไม่ว่ากัน

3. เนื่องจากเราทำ self-sign เราต้อง trust cert ด้วยครับ โดยให้ทำการ trust cert ให้กับ ทุกเครื่อง ที่จะใช้ registry นี้
sudo mkdir /etc/docker/certs.d sudo mkdir /etc/docker/certs.d/hub.cpa:5000 sudo cp /path/to/your/cert /etc/docker/certs.d/hub.cpa:5000
4. เพิ่ม alias name ให้เครื่องรู้จักชื่อ domain local ด้วย
sudo -- sh -c -e "echo '172.16.0.2 hub.cpa' >> /etc/hosts"
5. สร้าง user ชื่อ docker และ password ว่า tcuser โดยใช้ registry มาทำการ encrypt password จะสร้างกี่ account ก็ไม่ว่ากันครับ
docker container run -i --rm --entrypoint htpasswd registry:2.6.2 \ -Bbn docker tcuser >> /etc/selfcert/htpasswd
6. ตรวจดูไฟล์ htpasswd ว่าสร้าง account แล้ว
cat /etc/selfcert/htpasswd
7. ใช้คำสั่ง docker เพื่อสร้าง registry
docker container run -d -p 5000:5000 \ --restart=always --name cpa.registry \ --mount type=bind,source=/home/docker,target=/var/lib/registry \ --mount type=bind,source=/etc/selfcert,target=/certs \ --mount type=bind,source=/etc/selfcert,target=/auth \ -e "REGISTRY_AUTH=htpasswd" \ -e "REGISTRY_AUTH_HTPASSWD_REALM=Registry Realm" \ -e REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd \ -e REGISTRY_STORAGE_DELETE_ENABLED=true \ -e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/hub.cpa.crt \ -e REGISTRY_HTTP_TLS_KEY=/certs/hub.cpa.key \ registry:2.6.2
อธบ
- docker container run -d -p 5000:5000 \ — ให้สั่งทำงาน จาก image แบบ detach โดย port 5000 ใน container ให้ออกมาที่ port 5000 ข้างนอก
- --restart=always — ถ้าพัง restart ให้ด้วย
- --name cpa.registry \ — ตั้งชื่อ container ว่า cpa.registry
- --mount type=bind,source=/home/docker,target=/var/lib/registry \ — ทำการ mount /home/docker ให้ไปเป็น /var/lib/registry ใน container
- --mount type=bind,source=/etc/selfcert,target=/certs \ — ทำการ mount /etc/selfcert ให้ไปเป็น /certs ใน container
- --mount type=bind,source=/etc/selfcert,target=/auth \ — ทำการ mount /etc/selfcert ให้ไปเป็น /auth ใน container
- -e "REGISTRY_AUTH=htpasswd" \
- -e "REGISTRY_AUTH_HTPASSWD_REALM=Registry Realm" \
- -e REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd \ — ไฟล์ที่เก็บ account ที่ใช้ในการ login registry
- -e REGISTRY_STORAGE_DELETE_ENABLED=true \
- -e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/hub.cpa.crt \ — ไปเรียก crt จาก path /certs
- -e REGISTRY_HTTP_TLS_KEY=/certs/hub.cpa.key \ — ไปเรียก key จาก path /certs
- registry:2.6.2 — ชื่อ image

จบขั้นตอนการติดตั้งเท่านี้
เรียกใช้งานจากเครื่อง master และเครื่องอื่นๆ ที่ทำการ trust cert ไว้ได้แล้ว
ใช้งาน
มาไล่กันทีละ step เลย
ทดสอบ ping domainname ถ้า ping ไม่ผ่าน อย่าลืมดูข้อ 4 บทติดตั้งครับ




ทำการ login ด้วย account ที่เราสร้างไว้ตามข้อ 5 ของบทติดตั้งนะ
docker login hub.cpa:5000

ถ้า login ไม่สำเร็จแล้ว Error message ว่า Error response from daemon: Get https://your.domain:5000/v2/: x509: certificate signed by unknown authority
ให้กลับไปดูข้อ 3 ของบทติดตั้งครับ
ให้กลับไปดูข้อ 3 ของบทติดตั้งครับ

push image
ทดลอง push image ใส่ registry ของเราเอง
สร้าง image (จาก build dockerfile หรือจาก tag image ก็ได้) ให้มีชื่อเหมือนตอน registry อยู่ข้างหน้า (คล้ายมี username ข้างหน้า เวลาเอาขึ้น hub.docker)
docker image tag <oldname:tag> hub.cpa:5000/<newname:tag>
จากรูป เราจะ push image ขนาด 487 MB ขึ้น registry กัน

ทำการ push ขึ้น registry ได้เลย
docker image push hub.cpa:5000/cluster:webservice
เราใช้เวลาในการ push image นี้ไป ~ 50 วินาที

หลังจากที่ push ขึ้นไปแล้ว ระบบจะคืนเลข digest ของ image มาให้ ให้เราใช้เลขนี้อ้างอิง image ในการใช้งาน
เมื่อ push แล้ว เราลอง pull image จากเครื่องอื่นๆดู
pull image
ดูว่ามี image อะไรบ้าง
docker image ls
ทำการ auth login เพื่อ pull image ลงมาที่เครื่อง
docker login hub.cpa:5000/
จากนั้นให้ pull image ที่เพิ่ง push เมื่อซักครู่ มาไว้ที่เครื่องเพื่อเตรียมใช้งานต่อไป
docker image pull hub.cpa:5000/cluster:webservice
เราใช้เวลาในการ pull image นี้ไป ~ 40 วินาที

คำสั่งที่ใช้กับ registry
- ดู image ทั้งหมดที่มีอยู่ใน catalog
curl -u docker:tcuser \ --cacert ./hub.cpa.crt \ -X GET https://hub.cpa:5000/v2/_catalog
อธบ
curl -u docker:tcuser \ — ทำการ curl ข้อมูล โดยแนบ username&password
--cacert ./hub.cpa.crt \ — แนบ crt ไปด้วย ตาม path นี้(ดูเรื่อง permission ด้วย)
-X GET https://hub.cpa:5000/v2/_catalog — ส่ง request เป็น GET ไปที่ url นี้
--cacert ./hub.cpa.crt \ — แนบ crt ไปด้วย ตาม path นี้(ดูเรื่อง permission ด้วย)
-X GET https://hub.cpa:5000/v2/_catalog — ส่ง request เป็น GET ไปที่ url นี้
จากภาพบอกเราว่า มี 2 images ใน catalog คือ
image ชื่อ alpineweb และ image ชื่อ cluster
image ชื่อ alpineweb และ image ชื่อ cluster

- ดู tag ทั้งหมดของ image ที่สนใจ
curl -u docker:tcuser --cacert ./hub.cpa.crt -X GET https://hub.cpa:5000/v2/alpineweb/tags/list
หรือจะเป็น
curl -u docker:tcuser --cacert ./hub.cpa.crt -X GET https://hub.cpa:5000/v2/cluster/tags/list

cluster [webservice]
alpineweb [web1]
ลอง push image ใน tag อื่นๆขึ้นไป ก็จะประมาณนี้
alpineweb [web1,web2,web3]

delete image
เราต้องใช้เลข digest ในการลบ image ที่เราไม่ใช้ ง่ายที่สุดคือ pull image มาใหม่เพื่อดูเลข digest
curl -u docker:tcuser \ --cacert ./hub.cpa.crt \ -X DELETE https://hub.cpa:5000/v2/<image>/manifests/<digest>

image ถูกลบ (soft delete) เรียบร้อยแล้ว

และตามมาลบที่ file system ด้วยคำสั่ง
docker exec -it <registry container Id> \ bin/registry garbage-collect \ /etc/docker/registry/config.yml

จบแล้วคร้าบบบบ
- รับลิงก์
- X
- อีเมล
- แอปอื่นๆ
- รับลิงก์
- X
- อีเมล
- แอปอื่นๆ
ความคิดเห็น
แสดงความคิดเห็น