docker-image-reduce-size

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

Published on
2 mins read

คราวนี้ก็รู้ทั้งวิธีการใช้ 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 ลงได้มากแน่นอน ยังไงก็ลองใช้เทคนิคที่แนะนำมาดูนะครับ