เรียนรู้ Docker part 4: Hosting Docker Registry

Phai Panda
3 min readAug 16, 2020

--

แหล่งเก็บ 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 is running

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

pull an image

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

tag an image

สังเกตว่าจะได้ 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

push an image

ดูเหมือนจะเรียบร้อยดี ตรวจสอบโดยใช้ browser เปิดไปที่

http://localhost:5000/v2/_catalog

ผล

และตอนนี้เราสามารถทำความสะอาด tag ที่ไม่ได้ใช้ด้วยการลบมันทิ้ง

Remove (Local) Docker Images

เดิมเรามี

all images we have

เมื่อ push image ไปยัง local registry แล้วก็ลบออกจาก Docker ได้

docker image rm localhost:5000/team1/nginx:1.19.2

หรือจะลบตัว image ต้นฉบับเลยด้วยก็ได้

docker image rm nginx:1.19.2

ผล

an image we have

แล้วลอง pull จาก local registry แทน

docker pull localhost:5000/team1/nginx:1.19.2

ผล

pull image from local registry

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

ผลการเปลี่ยนชื่อ

rename an image

สรุป

part นี้ได้ให้ความเข้าใจว่า Docker image ต้องมีที่เก็บเฉพาะที่เรียกว่า registry จะนำไปวางเป็นไฟล์เฉยๆไม่ได้ ดังนั้น Docker ได้จัดเตรียม open source Docker Registry ที่สามารถนำมาติดตั้งเพื่อใช้งานเป็น registry ส่วนตัวหรือสำหรับทีมหรือองค์กรโดยไม่มีค่าใช้จ่าย

อ้างอิง

https://docs.docker.com/registry/deploying/

--

--

No responses yet