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 คุยไว้ว่า มีขนาด ไม่เกิน
ลองเปรียบเทียบขนาด Linux container ของแต่ล่ะ Distro
Distro | Container size |
CentOS | 193 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
ก็เลยตัดสินใจทำเองดีกว่า โดยการใช้ Alpine + Nginx และติดตั้งแบบ binary ใน Repo ได้ขนาด Container เพียงแค่ 6.45 MB เท่านั้น พอเอา PHP7 เข้าไปด้วย ขนาดเพิ่มมาเป็น 26.3 MB ตามภาพด้านล่าง
Alpine + Nginx+ PHP7 |
อย่างไรก็ตาม การลดขนาดของ 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