มีคำถามจากการ share เรื่อง Docker จากสถาบัน IMC ว่า
ในการใช้งาน docker image นั้น ควรระบุด้วย tag หรือ digest ดี ?

โดยปกติในการใช้งาน docker image จาก container/image registry server
ยกตัวอย่างเช่น nginx ใน Docker Hub
เราจะใช้งานด้วยการระบุชื่อพร้อม tag ที่ต้องการ
จาก best practice นั้น ไม่แนะนำให้ใช้ tag latest

แต่ถ้าเรื่องความถูกต้อง และ ความปลอดภัย
แนะนำให้ทำการระบุชื่อ image พร้อม digest ของ image

เนื่องจากถ้าทำการ build image ทับใน tag เดิม สามารถทำได้แน่นอน
ทำให้อาจจะเกิดปัญหาได้ เพราะว่า image ไม่เหมือนเดิม
ขัดกับแนวทางเรื่องของ immutable !!

ดังนั้นเพื่อความมั่นใจให้ระบุด้วย image digest
สร้างขึ้นมาเพื่อไม่ให้เกิดการชนกันของ image แต่ละตัวที่ push ขึ้นมา
ซึ่งในแต่ละ tag และการ build จะมีการคำนวณ digest ให้ใหม่
นำเอาทุก ๆ layer ของ image มา hash กันอีกรอบ !!
คล้ายกับ checksum นั่นเอง
สามารถดูเพิ่มเติมเรื่อง Manifest ได้ (ถ้าว่าง ๆ จะมาอธิบายการคำนวณค่า digest ให้อีกครั้ง)
ดังนั้นถ้ามีการเปลี่ยนแปลงเพียงเล็กน้อยค่า digest ก็เปลี่ยน


ตัวอย่างการใช้งาน

ทำการ pull image ลงมา จากนั้นดู digest ของแต่ละ image ดังนี้

ใน Dockerfile ทำการระบุได้ดังนี้

เพียงเท่านี้ก็ทำให้เรามั่นใจขึ้นแล้วนะครับ
ลองดูครับ

หรือเพื่อความปลอดภัยไปอีก ให้ทำการ signed Docker image ไปเลย
เช่น OpenPubKey , Docker Trust และ Connaisseur

Tags: