Alpine with LEMP



ทำ Lightweight Web Container

ก่อนหน้านี้ทำ web server container ไว้อันหนึ่ง (ทีม Dev ถนัด Ubuntu) ใช้ Ubuntu + Nginx + PHP7 + FFmpeg + bower + node.js + และอื่นๆอีกเล็กน้อย ได้ขนาดของ container เกือบ 600 MB... ใหญ่มากๆ

จึงเป็นที่มาของการทำ container ที่บางเบากว่าเดิม แต่ประสิทธิภาพไม่ลดลง 
ที่สำคัญ ต้องไม่ไปกระทบ code เดิม หรือไปทำให้ทีมงานต้องลำบาก แน่นอนว่า Distro ขนาดเล็กอย่าง #Alpine จึงเป็นตัวเลือกแรกๆ  ใน website ของ Alpine คุยไว้ว่า มีขนาด ไม่เกิน 5 MB 8MB แต่พอดึงลงมาดู พบว่า มีขนาดเพียงแค่ 3.99 MB เท่านั้น



ลองเปรียบเทียบขนาด Linux container ของแต่ล่ะ Distro



Distro Container size
CentOS193 MB
Ubuntu 117 MB
Photon 128 MB
Debian 124 MB
Busybox 1.11 MB
Alpine 3.99 MB

จะเห็นว่า Busybox มีขนาดเล็กที่สุด ผมมักจะเห็น Busybox ถูกใช้อุปกรณ์ขนาดเล็ก ที่มี resource จำกัด เช่นพวก embedded hardware, router, hub, Wireless AP ขนาดเล็ก


Alpine ถูกพัฒนาเพิ่มเติม โดยใช้พื้นฐานจาก busybox มี package manager ที่ใช้งานง่ายอย่าง apk

ทั้ง Apache และ Nginx ต่างก็มี container ที่ใช้ Alpine โดย
  • Container ของ Apache มีขนาด 94.8 MB 
  • Container ของ Nginx มีขนาด 15.5 MB 
ทั้ง 2 อัน ทำเหมือนกันเลย คือ Compile แบบ จัดเต็ม  แนบ module ต่างๆเข้าไปด้วย ซึ่งจริงๆ แล้วบาง feature ก็ไม่ได้มีความจำเป็นต้องใช้งาน

ก็เลยตัดสินใจทำเองดีกว่า  โดยการใช้ Alpine + Nginx  และติดตั้งแบบ binary ใน Repo ได้ขนาด Container เพียงแค่ 6.45 MB เท่านั้น พอเอา PHP7 เข้าไปด้วย ขนาดเพิ่มมาเป็น 26.3 MB  ตามภาพด้านล่าง




Alpine + Nginx+ PHP7
จากขนาด 600 MB ตอนนี้ลดเหลือ 26.3 MB แม้ยังไม่รวม package อื่นๆที่ต้องใช้เพิ่มเติม ซึ่งชัดเจนว่าขนาด Container ยังไงก็ไม่เกิน 100 MB หรือลดลงจากเดิมไม่น้อยกว่า 6 เท่า

อย่างไรก็ตาม การลดขนาดของ container ให้มีขนาดเล็กลงนั้น ไม่ได้ช่วยให้ใช้ resource ของ Servers น้อยลง หรือเร็วกว่าเดิม แต่มีประโยชน์ในแง่ของการดูแล ความเร็ว ลด Bandwidth ในการ deploy ไปยัง cloud 

มาลองดูว่าจะมีวิธีลดขนาดลงกว่านี้อีกไหม
  • ถ้าไม่ใช้ Nginx  ยังพอมี web server ขนาดเล็กอย่างเช่น lighttpd, thttpd, lighttpd ซึ่งบางตัวก็จะ support แค่ CGI แต่ไม่สามารถใช้ FastCGI (PHP-FPM) ได้ --  แต่เดี๋ยวนะ ตัว nginx ขนาดแค่ 2.88 MB เอง น่าจะไม่คุ้ม หากต้องแลกกับ performance ของ Nginx/PHP
  • ใช้ Busybox ไปเลยไหม ลดได้อีก 2.8 MB -- แลกกับการบริหารจัดการ ดูแลรักษา ไม่คุ้ม
  • Compile ทั้ง Nginx และ PHP เอง โดยเลือกใช้เฉพาะ module ที่ต้องการ  จะเห็นว่าผมยังใช้ binary package จาก Repo อยู่ ซึ่งแม้มีขนาดเล็ก แต่ก็ยังมี feature ที่ไม่จำเป็นอยู่ -- อันนี้น่าจะช่วยได้

Comments

Popular Posts