เรียนรู้ Docker part 4: Hosting Docker Registry
แหล่งเก็บ image ของ Docker เรียกว่า Registry หลายคนรู้จัก Docker Hub และเคยใช้บริการมาแล้ว หนนี้เราจะมาทำความรู้จักกับ open source Docker Registry แบบติดตั้งเพื่อใช้งานภายในทีม องค์กร จะทำเป็น web hooks ทำ automated builds หรืออื่นๆก็ได้
อ่านตอนก่อนหน้า
จะติดตั้ง Docker Registry ก็ต้องติดตั้ง Docker เสียก่อน
Docker Registry นี้แท้จริงคือ registry image ที่รันด้วย Docker นั่นแหละ ฉะนั้นต่อจากนี้จะเรียกว่า local registry นะครับ
Deploy Local Registry
ด้วยคำสั่งนี้
docker run -d -p 5000:5000 --restart=always --name registry registry:2
-d
หมายถึง รันเป็น background
-p
หมายถึง port ที่ใช้ ภายนอก:ภายใน
ภายนอกหมายถึงเราเข้าถึง ส่วนภายในคือภายใน local registry เอง
--restart=always
กำหนดให้ container ตัวนี้ restart ตาม Docker restart เป็นไปโดยอัตโนมัติ
ผล
local registry ที่เกิดขึ้นนี้เหมาะแก่การทำ test เท่านั้น หากต้องการทำเป็น production ให้อ่านเพิ่มเติม
ขั้นตอนถัดไปผมจะแสดงตัวอย่างการ pull, tag และ push an image ที่ต้องการไปยัง local registry
Pull an Image
สมมติผมได้ pull nginx image มาจาก Docker Hub แบบนี้
docker pull nginx:1.19.2
:1.19.2
คือ tag มีความหมายเป็นเลขเวอร์ชันของ nginx ตัวนี้ หากไม่กำหนดจะได้เป็นเวอร์ชันล่าสุด (latest) ณ เวลานั้นๆ
ชื่อ image และ tag จะคั่นด้วยเครื่องหมาย :
ผลการ pull
Tag an Image
เมื่อเรามี image ที่ต้องการแล้ว เราจะสามารถส่งมันไปยัง local registry ได้ก็ต่อเมื่อนำมันไปติด tag ก่อน
บอกไปเลยจะส่งไป host ใด port อะไร ที่ไหน ด้วยชื่ออไร กำกับเวอร์ชันได้อีก
docker tag nginx:1.19.2 localhost:5000/team1/nginx:1.19.2
tag nginx:1.19.2
บอกว่าเลือก image ตัวนี้ที่ tag 1.19.2 เป็นตัวต้นฉบับ
localhost:5000
คือจะส่งไปยัง localhost ที่ port หมายเลข 5000
/team1/nginx:1.19.2
คืออยากแยกด้วยชื่อทีมก่อน (ไม่ทำก็ได้) แล้วจึงเป็นชื่อ image และ tag (กรณีนี้ตั้งใจตั้งให้เหมือน image ตัวต้นฉบับ)
ผลการ tag
สังเกตว่าจะได้ localhost:5000/team1/nginx เป็นชื่อและ tag เป็น 1.19.2 โดยที่มี image id เป็นตัวเดียวกันกับ image ตัวต้นฉบับ (4bb46517cac3)
Push an Image
จากนั้นสามารถ push image ที่ติด tag แล้วได้
docker push localhost:5000/team1/nginx:1.19.2
ผลการ push
ดูเหมือนจะเรียบร้อยดี ตรวจสอบโดยใช้ browser เปิดไปที่
http://localhost:5000/v2/_catalog
ผล
และตอนนี้เราสามารถทำความสะอาด tag ที่ไม่ได้ใช้ด้วยการลบมันทิ้ง
Remove (Local) Docker Images
เดิมเรามี
เมื่อ push image ไปยัง local registry แล้วก็ลบออกจาก Docker ได้
docker image rm localhost:5000/team1/nginx:1.19.2
หรือจะลบตัว image ต้นฉบับเลยด้วยก็ได้
docker image rm nginx:1.19.2
ผล
แล้วลอง pull จาก local registry แทน
docker pull localhost:5000/team1/nginx:1.19.2
ผล
Rename an Image
ในบางทีชื่อที่เพิ่ง pull มาก็ยาว เช่น localhost:5000/team1/nginx:1.19.2 อยากได้สั้นเหมือนเดิม เช่น nginx:1.19.2 ก็ทำได้ด้วยการ tag กลับ จะอ้างชื่อหรืออ้างจาก image id ก็ได้
ตัวอย่าง
docker tag localhost:5000/team1/nginx:1.19.2 nginx:1.19.2
แล้วก็ลบออก
docker image rm localhost:5000/team1/nginx:1.19.2
ผลการเปลี่ยนชื่อ
สรุป
part นี้ได้ให้ความเข้าใจว่า Docker image ต้องมีที่เก็บเฉพาะที่เรียกว่า registry จะนำไปวางเป็นไฟล์เฉยๆไม่ได้ ดังนั้น Docker ได้จัดเตรียม open source Docker Registry ที่สามารถนำมาติดตั้งเพื่อใช้งานเป็น registry ส่วนตัวหรือสำหรับทีมหรือองค์กรโดยไม่มีค่าใช้จ่าย
อ้างอิง
https://docs.docker.com/registry/deploying/