กลับไปหน้าบทความ
#Docker#BuildKit#Docker Compose#DevOps#ความปลอดภัย

2 Docker Tricks ที่ช่วยให้ทีมทำงานเร็วขึ้น ปลอดภัยขึ้น และดูแลง่ายขึ้น

เทคนิค Docker สองอย่างที่หลายทีมมองข้ามคือการใช้ BuildKit secrets/SSH เพื่อซ่อนข้อมูลลับระหว่าง build และการใช้ Compose profiles เพื่อแยก dev/prod ในไฟล์เดียว ทั้งสองแนวทางช่วยลดความเสี่ยง ลดความสับสน และประหยัดเวลาการทำ

21 มกราคม 2569อ่านประมาณ 3 นาที

แชร์บทความ

2 Docker Tricks ที่ช่วยให้ทีมทำงานเร็วขึ้น ปลอดภัยขึ้น และดูแลง่ายขึ้น

2 Docker Tricks ที่ช่วยให้ทีมทำงานเร็วขึ้น ปลอดภัยขึ้น และดูแลง่ายขึ้น

Docker เป็นเครื่องมือที่หลายทีมใช้อยู่ทุกวัน แต่ในทางปฏิบัติยังมีเทคนิคบางอย่างที่ไม่ได้ถูกนำมาใช้กันอย่างแพร่หลาย ทั้งที่ช่วยประหยัดเวลาและลดปัญหาได้จริง โดยเฉพาะในเรื่องความปลอดภัยระหว่างการ build image และการจัดการ environment สำหรับการพัฒนาและ production

บทความนี้จะพาไปรู้จัก 2 เทคนิคสำคัญที่นำไปใช้ได้ทันที ได้แก่ BuildKit secrets/SSH และ Compose profiles ซึ่งช่วยให้ workflow ของทีมลื่นขึ้นทั้งในฝั่งนักพัฒนาและระบบ CI/CD

1) ใช้ BuildKit secrets และ SSH เพื่อซ่อน token ระหว่าง build

หนึ่งในพฤติกรรมที่ยังพบได้บ่อยคือการใส่ token, private key หรือ credential ต่าง ๆ ลงใน ARG หรือ ENV ภายใน Dockerfile แล้วค่อยลบออกภายหลัง แม้จะดูเหมือนปลอดภัย แต่ในความเป็นจริงข้อมูลเหล่านี้อาจยังคงหลงเหลืออยู่ใน layer history ของ image ได้

ปัญหาคือ หาก image ถูกส่งต่อหรือหลุดออกไป ข้อมูลลับที่คิดว่าลบแล้วอาจยังถูกกู้กลับมาได้ นี่จึงเป็นความเสี่ยงที่ไม่ควรมองข้าม

BuildKit เข้ามาช่วยแก้ปัญหานี้ด้วยแนวคิดที่ปลอดภัยกว่า นั่นคือทำให้ secret หรือ SSH key มีอยู่เพียง ชั่วคราวในช่วง build เท่านั้น และไม่ถูกบันทึกลงไปใน image ที่ได้

กรณีใช้งานที่พบบ่อย

BuildKit secrets/SSH เหมาะมากกับงานลักษณะต่อไปนี้

  • ต้อง pull private repository ระหว่าง build
  • ต้องติดตั้ง package จาก private registry เช่น npm หรือ pip
  • ต้องดาวน์โหลดไฟล์จาก S3 หรือ artifact server ที่ต้องใช้ token
  • ต้อง clone private submodule ผ่าน git@github.com

ทำไม secret mount ถึงดีกว่า ARG/ENV

แนวทางที่ปลอดภัยคือเก็บ token ไว้ในเครื่องของผู้ใช้งาน เช่นไฟล์ .npmrc หรือ token.txt โดยไม่ commit ขึ้น repository จากนั้นส่งไฟล์ดังกล่าวเข้าไปเป็น secret ตอน build

ใน Dockerfile สามารถ mount secret นี้เพื่อใช้ชั่วคราวใน step ที่ต้องติดตั้ง dependency หรือดาวน์โหลดไฟล์ เมื่อคำสั่งนั้นจบลง secret จะหายไปเองและไม่ถูกฝังอยู่ใน image

ข้อดีของวิธีนี้คือ

  • ลดความเสี่ยงที่ token จะติดไปกับ image
  • ไม่ต้องพึ่งการลบข้อมูลภายหลัง
  • ทำให้ Dockerfile สะอาดและปลอดภัยขึ้น

ใช้ SSH mount เมื่อทำงานกับ private Git repository

หากทีมต้องเข้าถึง private repository ผ่าน SSH การใช้ SSH mount จะสะดวกมาก เพราะไม่จำเป็นต้อง copy private key เข้าไปใน image

BuildKit รองรับการส่งต่อ SSH agent แบบชั่วคราวในช่วง build จึงเหมาะกับงานอย่าง

  • clone private repository
  • ดึง private submodule
  • ติดตั้ง source code ที่เก็บอยู่บน Git server ภายในองค์กร

แนวทางนี้ทั้งปลอดภัยและลดภาระในการจัดการ key ภายใน container image

เพิ่มความเร็วด้วย cache mount

นอกจากเรื่องความปลอดภัยแล้ว BuildKit ยังช่วยเรื่อง performance ได้ดีมากเมื่อใช้งานคู่กับ cache mount เช่นการ cache โฟลเดอร์ของ package manager

ผลที่ได้คือ

  • การ build ครั้งแรกอาจยังใช้เวลาปกติ
  • แต่การ build ครั้งถัดไปจะเร็วขึ้นอย่างชัดเจน
  • ลดเวลารอของนักพัฒนาและ pipeline ใน CI/CD

นี่เป็นจุดที่หลายทีมสัมผัสผลลัพธ์ได้จริง เพราะช่วยลดเวลาสะสมในงานประจำวันลงไปมาก

ข้อควรระวังที่ไม่ควรมองข้าม

แม้จะใช้ BuildKit แล้ว ก็ยังควรระวังเรื่องพื้นฐานเหล่านี้

  • อย่า echo token ออกทาง console ระหว่าง build
  • อย่าเขียน token ลงไฟล์ถาวรภายใน image
  • อย่าใช้ ARG เพื่อเก็บ secret แล้วหวังว่าการลบทีหลังจะเพียงพอ
  • ตรวจสอบให้แน่ใจว่า BuildKit ถูกเปิดใช้งาน โดยเฉพาะใน environment ที่ไม่ได้ใช้ Docker Desktop

2) แยก dev/prod ด้วย Compose profiles ในไฟล์เดียว

อีกปัญหาหนึ่งที่พบได้บ่อยคือการแยกไฟล์ docker-compose.dev.yml และ docker-compose.prod.yml ออกจากกัน แม้ในระยะแรกจะดูเป็นระเบียบ แต่เมื่อเวลาผ่านไปไฟล์ทั้งสองมัก drift หรือค่อย ๆ ต่างกันมากขึ้นโดยไม่ตั้งใจ

ผลคือ

  • แก้ค่าบางอย่างในไฟล์หนึ่ง แต่อีกไฟล์ไม่ได้แก้ตาม
  • คนในทีมสับสนว่าควรใช้อันไหน
  • การดูแลระบบยากขึ้นเรื่อย ๆ เมื่อ service มีจำนวนมากขึ้น

Compose profiles เป็นวิธีที่ช่วยให้เก็บทุกอย่างไว้ในไฟล์เดียว แต่ยังสามารถเลือกเปิดเฉพาะ service ตามบริบทการใช้งานได้

แนวคิดของ Compose profiles

ในไฟล์ Compose เดียวกัน เราสามารถกำหนดได้ว่า service ใดควรเปิดใน profile ไหน เช่น

  • dev สำหรับการพัฒนา
  • test สำหรับการทดสอบ
  • prod สำหรับ production
  • observability สำหรับเครื่องมือ monitoring และ debugging

แนวทางนี้ทำให้โครงสร้างหลักอยู่ร่วมกัน แต่ยังเลือกใช้งานได้ยืดหยุ่นตามสภาพแวดล้อม

ตัวอย่าง service ที่เหมาะกับแต่ละ profile

ในงานจริงมักพบการแบ่งลักษณะนี้

service พื้นฐาน ที่ใช้เกือบทุก environment

  • api
  • worker
  • db

service สำหรับ development เท่านั้น

  • mailhog
  • adminer
  • redis-commander
  • mock-server

service สำหรับ production เท่านั้น

  • nginx
  • autoscaling sidecar
  • monitoring agent

เมื่อกำหนด profile ชัดเจน ทีมจะเปิดเฉพาะสิ่งที่จำเป็นได้ง่ายขึ้น และไม่ต้องดูแลหลายไฟล์พร้อมกัน

วิธีจัดไฟล์ให้เข้าใจง่าย

โครงสร้างที่อ่านง่ายและดูแลง่ายมักเป็นแบบนี้

  1. วาง service พื้นฐานไว้ส่วนบนสุดของไฟล์
  2. ตามด้วยกลุ่มเครื่องมือ dev และกำหนด profiles: ["dev"]
  3. ปิดท้ายด้วย service ที่เกี่ยวกับ production และกำหนด profiles: ["prod"]

หากต้องใช้ค่าต่างกันระหว่าง environment ก็สามารถแยกด้วย env file ได้ โดยยังคงใช้ compose ไฟล์หลักเพียงไฟล์เดียว

ประโยชน์ที่ทีมจะเห็นชัด

การใช้ Compose profiles ให้ผลลัพธ์ที่ดีในหลายมิติ เช่น

  • สมาชิกใหม่ในทีมเปิดชุดพัฒนาได้ในคำสั่งเดียว
  • CI/CD เลือกเปิดเฉพาะ profile ที่เหมาะกับ production ได้ง่าย
  • ลดจำนวนไฟล์ที่ต้องดูแล
  • ลดโอกาสเกิด configuration drift
  • ทำให้การสื่อสารในทีมชัดเจนขึ้น

เมื่อระบบเริ่มโตขึ้น แนวทางนี้จะยิ่งช่วยลดภาระในระยะยาว

ทริคเสริมสำหรับทีมที่กำลังขยาย

หากทีมมีหลาย service และหลายสภาพแวดล้อมมากขึ้น ควรพิจารณาแนวทางต่อไปนี้ร่วมด้วย

  • ตั้งชื่อ profile ให้สื่อความหมายชัดเจน เช่น dev, test, prod, observability
  • แยก env file ตาม environment โดยไม่ต้องแตก compose file หลายชุด
  • เพิ่ม healthcheck ให้ service สำคัญ เพื่อให้การเริ่มระบบหลายตัวพร้อมกันเสถียรมากขึ้น

ทำไมสองเทคนิคนี้จึงควรใช้คู่กัน

BuildKit secrets/SSH ช่วยให้กระบวนการ build ปลอดภัยและสะอาดขึ้น ขณะที่ Compose profiles ช่วยให้การจัดการ service ในแต่ละ environment ชัดเจนและลดความซ้ำซ้อน

เมื่อใช้ร่วมกัน ทีมจะได้ประโยชน์ดังนี้

  • build image ได้อย่างปลอดภัยโดยไม่ทิ้งร่องรอยของ token
  • จัดการ dev/prod ได้ง่ายผ่านไฟล์เดียว
  • ลดเวลาที่เสียไปกับการแก้ปัญหา config และ build ซ้ำ
  • ทำให้ workflow ทั้งของนักพัฒนาและ CI/CD มีความลื่นไหลมากขึ้น

สรุป

Docker ไม่ได้มีประโยชน์แค่เรื่องการแพ็กแอปพลิเคชันเท่านั้น แต่ยังมีเครื่องมือย่อยที่ช่วยยกระดับคุณภาพการทำงานของทีมได้อย่างมาก BuildKit secrets/SSH ช่วยป้องกันการรั่วไหลของข้อมูลลับระหว่าง build และทำให้ image สะอาดขึ้น ส่วน Compose profiles ช่วยรวมการจัดการ dev/prod ให้อยู่ในไฟล์เดียว ลดความสับสนและลดภาระดูแลในระยะยาว

หากทีมของคุณยังไม่ได้ใช้สองอย่างนี้ นี่เป็นจุดเริ่มต้นที่คุ้มค่ามาก เพราะเป็นการปรับ workflow เล็กน้อยที่ให้ผลลัพธ์ชัดเจนทั้งด้านความปลอดภัย ความเร็ว และความเรียบร้อยของระบบ