เล็กแต่เก๋า ประหยัดพื้นที่ด้วยการปรับปรุง Docker Image ให้มีขนาดเล็กลง

Written by Phumrapee Limpianchop on 30 May, 2018

คราวนี้ก็รู้ทั้งวิธีการใช้ Docker และวิธีการเขียน Dockerfile กันไปแล้ว ก็ถึงคราวจริงจังกับเรื่องของ Storage กันแล้ว

ก็สำหรับคนที่กำลังเขียน Dockerfile สำหรับ Application ทั้งของตัวเอง หรือว่าจะเป็นสำหรับบริษัทก็จะพบปัญหาเดียวกันว่า…

พอ Build Images ขึ้นมาแล้วขนาดใหญ่ชิบหาย

ซึ่งถ้าใครมีพื้นที่จัดเก็บใหญ่ดีก็…ไม่ค่อยมีปัญหาหรอก แต่จะเริ่มมีปัญหาเวลาที่เรา

  • สร้าง container แล้วจะใช้เวลานาน
  • คนอื่น Pull Images นานเพราะ Images ขนาดเท่าช้าง ก็อาจจะมีปัญหาเกี่ยวกับ Network Traffic และ Bandwidth ตามมา

ดังนั้นในบทความนี้ก็จะมาแจก Tips ที่จะช่วยทำให้ขนาด Images เล็กลงนะครับ

Tips 1: ลด Layers ลงให้น้อยที่สุด

อ่าว! คราวนี้ก็จะงงกันว่าอะไรคือ Layers

จินตนาการว่า Dockerfile เราเป็น Sandwich และทุกครั้งที่เราใช้คำสั่งพวก FROM, RUN อะไรพวกนี้อีกหลายๆอันจะใส่ไส้เข้าไปใน Sandwich 1 ชั้น แล้วคราวนี้เวลามีไส้เพิ่มขึ้นมากๆ มันก็จะใหญ่เกินกว่าที่ปากเราจะรับได้ ดังนั้นเทคนิคนึงที่จะสามารถลดขนาด Images ได้นั้นคือต้องใส่ไส้ให้น้อยที่สุด โดยจากเดิมที่เป็น…แบบนี้

RUN yum -y update
RUN yum -y install git

ให้กลายเป็นแบบนี้

RUN yum update && yum install git

สิ่งที่สังเกตุเห็นเลยคือ แต่เดิมมีไส้อยู่ 2 ชั้น เหลือแค่ชั้นเดียวซะแล้ว .-.

แต่เพิ่มเติมคือผมใส่ && ซึ่งในความหมายของ bash คือ หลังทำคำสั่งเสร็จแล้วให้ทำอะไรต่อนั่นเองงงงงงงงงงงงงงงงง

คราวนี้ถ้าใส่คำสั่งซ้อน && เยอะมากๆ ก็อาจจะงงๆในบรรทัดเดียวก็สามารถแยกบรรทัดออกมาได้ แบบนี้

RUN yum -y update && \
    yum -y install git

สิ่งที่เพิ่มเข้าไปคือ \ หรือที่ชาวบ้านเรียกกันว่า BACKSLASH ใช้ในการให้ไปอ่านบรรทัดต่อไป ต่อ…ก็ไปลองเล่นใน bash เองเองล่ะกัน

Tips 2: ลบของไม่จำเป็นออกไปให้หมด!

ใช่แล้ว! พวก vim, nano, curl, htop และไฟล์ขยะทั้งหลายแหล่ ลบออกไปให้หมดก่อนที่จะ build เสร็จเพราะสิ่งที่เราใช้งานจริงๆคือ Application, Base Image และ Package ที่จำเป็นต่อ Application

Q: อ่าว!! แล้วผมจะ Debug ยังไงล่ะ? A: Debug บ้านแกบน Dockerfile ทำไมล่ะ ทุกอย่างควรจะเสร็จตั้งแต่ก่อนขึ้น Images แล้ว

Tips 3: ใช้ Base Images ที่เล็กกว่านี้

Base Images ของ ubuntu ก็ซดไป 100MB++ แล้ว centos อย่าพูดถึง ของพวกนี้ก็ยังใหญ่เกินไปอยู่ดีดังนั้นริฟฟี่จึงขอมานำเสนอ…

alpine:latest นั่นเองงงงงงง ซึ่งขนาดของมันใหญ่แค่ 36MB เท่านั้น?!!!!!!!!!!!! เช็คได้ที่ Docker Store

Tips 4: ใช้ FromLatest.io

บนเว็บก็มีเครื่องมือที่ทรงพลังอย่าง FromLatest.io เหมือนกันโดยจะสามารถส่ง Dockerfile ที่เราเขียนไปเนี่ยตรวจหาข้อผิดพลาด และแนะนำวิธีการช่วย Improve Dockerfile ให้แข็งแกร่งขึ้นได้อีกด้วย

ก็…ถ้าทำทั้งหมดนี้ได้ก็จะสามารถลดขนาด Image ลงได้มากแน่นอน ยังไงก็ลองใช้เทคนิคที่แนะนำมาดูนะครับ