ข้ามไปที่เนื้อหาหลัก

ทำ Private Registry เก็บ images docker ไว้ใช้เอง

ทำ Private Registry เก็บ images docker ไว้ใช้เอง

คือด้วยความที่เน็ตไม่แรงเอาซะเลย กว่าจะโหลด image จาก hub.docker ได้ ใช้เวลานานพอสมควร ยิ่งตอน push(upload) ก็ใช้เวลามาก ผมเลยย่อระยะทาง การฝาก image มาไว้ที่ registry ส่วนตัว ติดตั้งผ่าน docker ให้ใช้งานได้เร็วขึ้นครับ

เริ่มกันเลย

ผมอธิบายแบ่งเป็น 2 ช่วงนะครับ
 — ติดตั้ง
 — ใช้งาน

ติดตั้ง

สิ่งที่ต้องเตรียม
  1. เริ่มจาก pull image registry มาที่เครื่องก่อน
docker image pull registry:2.6.2
เลข 2.6.2 เป็น version นะครับ ถ้าไม่ใส่จะเรียก latest ให้โดยอัตโนมัติ
2. ทำการ Generating Cert เพื่อขอ two keys ที่จะใช้ จากตัวอย่างนี้เราเถื่อนแท้ ๆ ด้วย Self-Signed นะครัช ใครจะใช้ตัวอื่นๆ ก็ไม่ว่ากัน
generating self cert
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
docker container ls ดู container ทั้งหมดที่ทำงานอยู่
จบขั้นตอนการติดตั้งเท่านี้
เรียกใช้งานจากเครื่อง master และเครื่องอื่นๆ ที่ทำการ trust cert ไว้ได้แล้ว

ใช้งาน

มาไล่กันทีละ step เลย
ทดสอบ ping domainname ถ้า ping ไม่ผ่าน อย่าลืมดูข้อ 4 บทติดตั้งครับ
ping succeeded
ทำการ login ด้วย account ที่เราสร้างไว้ตามข้อ 5 ของบทติดตั้งนะ
docker login hub.cpa:5000
Login Succeeded
ถ้า login ไม่สำเร็จแล้ว Error message ว่า Error response from daemon: Get https://your.domain:5000/v2/: x509: certificate signed by unknown authority
ให้กลับไปดูข้อ 3 ของบทติดตั้งครับ
Error x509

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 กัน
tag image for preparing to push
ทำการ push ขึ้น registry ได้เลย
docker image push hub.cpa:5000/cluster:webservice
เราใช้เวลาในการ push image นี้ไป ~ 50 วินาที
push image to private registry
หลังจากที่ 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 วินาที
pulled image

คำสั่งที่ใช้กับ 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 นี้
จากภาพบอกเราว่า มี 2 images ใน catalog คือ
 image ชื่อ alpineweb และ image ชื่อ cluster
list all images in catalog
  • ดู 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
list all tag on alpine image
cluster [webservice]
alpineweb [web1]
ลอง push image ใน tag อื่นๆขึ้นไป ก็จะประมาณนี้
alpineweb [web1,web2,web3]
push several image tags

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>
delete image
image ถูกลบ (soft delete) เรียบร้อยแล้ว
already soft delete image
และตามมาลบที่ file system ด้วยคำสั่ง
docker exec -it <registry container Id> \
bin/registry garbage-collect \
/etc/docker/registry/config.yml
hard delete
จบแล้วคร้าบบบบ

ความคิดเห็น

โพสต์ยอดนิยมจากบล็อกนี้

Docker Crash Course

 https://www.youtube.com/watch?v=pg19Z8LL06w ▬▬▬▬▬▬ T I M E S T A M P S ⏰ ▬▬▬▬▬▬ 0:00 - Intro and Course Overview 02:54 - What is Docker? 03:51 - What problems Docker solves in development and deployment process 11:38 - Virtual Machine vs Docker 17:19 - Install Docker 21:36 - Docker Images vs Containers 26:32 - Docker Registries 29:38 - Docker Image Versions 32:02 - Main Docker Commands - Pull and Run Docker containers 39:06 - Port Binding 42:50 - Start and Stop containers 46:54 - Private Docker Registries 48:11 - Registry vs Repository 49:09 - Dockerfile - Dockerize Node.js app 58:30 - Build Image 1:02:39 - Docker UI Client 1:03:39 - Overview: Docker in complete software development lifecycle 1:06:38 - Where to go from here

ย้าย Docker Container ข้าม Cloud Provider

ย้าย Docker Container ข้าม Cloud Provider Posted on  02/12/2014   by  Anuchit Chalothorn ปัญหาเรื่องการย้าย Application ข้าม Cloud Provider เป็นปัญหาปกติที่ต้องหาทางแก้ไข ซึ่งแต่ละ Cloud Provider มีช่องทางในการบริการที่ต่างกัน เทคโนโลยีต่างกัน เครื่องมือที่ใช้งานก็ต่างกัน เรียกได้ว่าถ้าจะย้าย instance จะทำได้ยากมาก ครั้งนี้จะให้แนวคิดเรื่องการย้าย Container จาก Cloud Provider ค่ายหนึ่งไปยังอีกค่ายหนึ่งหรือจาก Local ไปยัง Cloud Provider ก็ได้ ซึ่งทำได้หลายวิธี จากภาพแนะนำการย้ายแบบง่ายๆ ผ่าน Docker อย่างเดียวไม่ได้ใช้เครื่องมือใดๆ เพิ่มเติม ถ้าจะให้สะดวกควรมี Orchestration Service อยู่ในแต่ละ Cloud Provider ด้วย ในเบื้องต้นทำความเข้าใจแบบง่ายๆ กันก่อน การทำ Migration ทำได้ 2 แบบ คือ Import / Export ไฟล์ Container ทั้งก้อนจาก Local ไปยัง Cloud วิธีนี้จะให้ความสะดวกมากกว่าแต่การสำรองข้อมูลและการย้ายไฟล์ Export จะช้าขึ้นอยู่กับความเร็วของเน็คเวิร์ก Push / Pull ให้ Commit Container State ปัจจุบันแล้ว push ขึ้น Docker Registry อาจจะเป็น Docker Hub (Private) หรือ P...

Podman

  https://medium.com/@raghavendraguttur/podman-containers-beginners-guide-830b931e66f4