Containers Intro

Developer တွေဟာ Software Development လုပ်နေရုံနဲ့ပြီးနေတာမဟုတ်ပဲ ကိုယ်ရေးတဲ့ software ကို ship လုပ်ဖို့လိုလာတဲ့တစ်ချိန်ချိန်မှာတော့ Software Deployment နဲ့ပတ်သက်ပြီး ကြုံတွေ့လာရတာပဲဖြစ်ပါတယ်။ ဒါ့ကြောင့် ဒီတစ်ခေါက်မှာတော့ လက်ရှိ Software Development & Deployment မှာအရေးအပါဆုံးဖြစ်နေတဲ့ Containerization ဆိုတဲ့ နည်းပညာအကြောင်းကို ပြောပြသွားမှာဖြစ်ပါတယ်။

Brief

Container ဆိုတာကို အပြင်မှာတော့ ကုန်ပစ္စည်းတွေကို နိုင်ငံတစ်ခုနဲ့တစ်ခုခြားမှာ သယ်ယူပို့ဆောင်တဲ့ (shipping) အချိန်မှာ ထုပ်ပိုးဖို့သုံးတဲ့ physical box ကြီးတွေအနေနဲ့ မြင်ကြမယ်လို့ထင်ပါတယ်။ ဒီ Container တွေဟာ ကုန်ပစ္စည်းတွေကို တခြား destination ဘက်ဆီကိုရောက်တဲ့အခါမှာ shipping စလုပ်တဲ့အချိန်ကအတိုင်း မပျက်စီးမယိုယွင်းစေဖို့ လုပ်ဆောင်ပေးတာဖြစ်ပါတယ်။ Software Development & Deployment မှာလည်း Software တစ်ခုဟာ ဘယ် environment မှာပဲရောက်နေနေ မှန်မှန်ကန်ကန် run နေဖို့ကအရေးအကြီးဆုံးဖြစ်ပါတယ်။ ဆိုလိုတာကတော့ Developer ရဲ့ development environment မှာအလုပ်လုပ်ခဲ့တဲ့ behavior အတိုင်း testing နဲ့ staging environment ၊ ပြီးတော့ နောက်ဆုံး production deployment environment မှာပါ မှန်ကန်နေဖို့ လိုအပ်တာဖြစ်ပါတယ်။ ဒါ့အပြင် underlying architecture အားဖြင့် မတူညီတဲ့ infrastructure တွေမှာလည်း run ဖို့လိုအပ်ပါသေးတယ်။ ဥပမာ Linux မှာ develop လုပ်ခဲ့အတိုင်း Windows မှာလည်း အလုပ်လုပ်ဖို့ဖြစ်ပါတယ်။ Architecture မတူတော့ရင် software တစ်ခုရဲ့ dependencies တွေဟာလည်း ကွဲလွဲတာမျိုးတွေဖြစ်လာနိုင်တာဖြစ်တဲ့အတွက် မှန်မှန်ကန်ကန် run ဖို့ဆိုတာ ခက်ခဲလာတာဖြစ်ပါတယ်။ ဒီလိုမျိုး Consistency ပြဿနာတွေကို ဖြေရှင်းဖို့အတွက် Container တွေကို အသုံးပြုလာကြပါတယ်။

Background Problems

ကိုယ်တိုင်က website တွေကို hosting လုပ်ပေးတဲ့ ဟိုးအရင်တုန်းက Shared Hosting Provider တစ်ခုလို့ ခဏစဉ်းစားကြည့်ရအောင်။ ကိုယ့်မှာ setup လုပ်ထားတဲ့ Hardware တစ်ခုတည်းပေါ်က OS တစ်ခုတည်းပေါ်မှာ customer‌ တွေရဲ့ company web server တွေလာ run ကြမှာဖြစ်ပါတယ်။ အဲဒီထဲမှာမှ competitor တွေဖြစ်တဲ့ Company A နဲ့ Company B ဆိုပြီးရှိမယ်ဆိုကြပါတော့။ Company A က သူ့ရဲ့ product ဆိုင်ရာအချက်အလက်တွေကို ဒီပေါ်က server ပေါ်မှာလာတင်ထားမယ်ဆိုရင် Company B အနေနဲ့ ဒါတွေကိုလှမ်းပြီး ယူလို့ရနေမယ်ဆိုတာပြောစရာလိုမယ်မထင်ပါဘူး။ ဒီလိုမျိုး same hardware, same operating system တစ်ခုတည်းမှာ လာလုပ်ခြင်းဟာ resource တစ်ခုနဲ့တစ်ခုဟာ isolation ရှိနေမှာမဟုတ်တဲ့အတွက် တစ်ခုနဲ့တစ်ခုဟာ နှောင့်ယှက်လို့ရနေမှာပဲဖြစ်ပါတယ်။ ဥပမာ - Company B က သူ့ရဲ့ compeititor ဖြစ်တဲ့ Company A ကလည်း same physical server တည်းမှာရှိတယ်ဆိုပြီး အကယ်၍များသိသွားခဲ့တယ်ဆိုပါစို့။ ဒါဆို Company B က Company A ကိုနှောင့်ယှက်ချင်တယ်ဆိုရင် Company A ရဲ့ process တွေကိုလှမ်း kill တာမျိုး လုပ်လို့ရနေမှာဖြစ်ပါတယ်။ ပိုပြီးဆိုးဝါးတာမျိုးဆိုရင် ဥပမာ Fork Bomb လိုဟာမျိုး CPU, Memory resourdce တွေကိုဝါးမြိုပစ်နိုင်တဲ့ တစ်ခုခုကို သူ့ server မှာပဲ run လိုက်လို့ရှိရင် Company A နဲ့ B အပါအဝင် တခြားအဲ့ဒီ infrastructure ထဲမှာ run နေတဲ့ site တိုင်းဟာ down သွားမှာဖြစ်ပါတယ်။ တိုတိုပြောရရင်တော့ Same Environment မှာ ရှိနေသမျှ အားလုံးဟာ တစ်ခုနဲ့တစ်ခု interact လုပ်လို့ရနေတာဖြစ်တဲ့အတွက် မလိုအပ်ပဲ မဖြစ်သင့်တဲ့ ပြဿနာတွေများလာနိုင်တာဖြစ်ပါတယ်။

Virtual Machines

Virtual Machines တွေမှာတော့ same hardware, different operating system တွေဖြစ်သွားတဲ့အတွက် VM တစ်ခုမှာတင်ထားတဲ့ software က resource အစားများပြီး ကုန်သွားလို့ down သွားရင်တောင် တခြား VM တွေအပေါ် effect ရှိမှာမဟုတ်တော့ပါဘူး။ Scalability အရကြည့်မယ်ဆိုလည်း လိုအပ်သလို VM တွေကိုဖြုတ်တပ်လို့ရတာဖြစ်တဲ့အတွက် အများကြီးပိုပြီး flexible ဖြစ်လာပါတယ်။ ဒါပေမယ့် VM တွေဟာ Operating System တစ်ခုပေါ်မှာ နောက်ထပ် Operating System တွေ run တာဖြစ်တဲ့အတွက် (VM ၁၀ ခုတင်ထားတယ်ဆိုတာ OS ၁၀ ခုတင်တာနဲ့ အတူတူပဲဖြစ်ပါတယ်) resource အားဖြင့်တော့ အကုန်အကျများနေတာဖြစ်ပါတယ်။

လက်ရှိမှာ Amazon-Web-Services (AWS), Digital Ocean, Microsoft Azure, Google Cloud Platform (GCP) စတဲ့ Cloud Provider ကြီးတွေဟာ ခုနကလို VM တွေကိုလွယ်လွယ်ကူကူနဲ့ manage လုပ်လို့ရအောင်လုပ်ပေးပါတယ်။ Hardware နဲ့ ပတ်သက်စရာမရှိတော့ပဲ ဒီ VM တွေ spin up လုပ်ရင်လုပ်သလောက်ပေးရတာဖြစ်ပေမယ့်လည်း Software နဲ့ပတ်သက်ပြီး ကိုယ်တိုင် manage လုပ်ရပါတယ်။ ဥပမာ - droplet ပေါ်က Ubuntu Version ကို ကိုယ်တိုင်မြှင့်ရတာမျိုးပေါ့။ ဒါပေမယ့်လည်း Cloud host ပေါ်က operating system ကြီးတစ်ခုပေါ်မှာ run နေရဆဲပဲဖြစ်ပါတယ်။ ဒီ့ထက်စာရင် host operating system တစ်ခုပေါ်မှာတင် ကြိုက်သလို spin up / down လုပ်လို့ရရင်ပိုကောင်းမှာပါ။

Containers

Container တွေဟာ Virtual Machine တွေကပေးတဲ့ security, resource management features တွေ ပါဝင်ပြီးသားဖြစ်တဲ့အပြင် သပ်သပ် OS ကြီးတစ်ခုပေါ်မှာ run စရာမလိုတော့ပဲ လိုအပ်သလောက်ပဲသုံးတဲ့ Isolated Environment တွေအနေနဲ့ လုပ်ဆောင်ပေးတာဖြစ်ပါတယ်။ ပြန်ပြောရရင် infrastructure တစ်ခုတည်းပေါ်မှာ run နေတဲ့ Container တွေဟာ တစ်ခုနဲ့တစ်ခု နှောင့်ယှက်လို့မရသလို ၊ မြင်လည်းမမြင်နိုင်ပါဘူး။ တစ်ခုနဲ့တစ်ခုရှိမှန်းတောင် သိရမှာမဟုတ်ပါဘူး။ Software Application တွေကို source code နဲ့အတူ သူတို့လိုအပ်တဲ့ configuration တွေ ၊ dependency တွေအားလုံး ၊ ပြောရရင် runtime environment ကြီးတစ်ခုလုံးကို package တစ်ခုအနေနဲ့ ထုပ်ပိုးထားတာဟာ Container တစ်ခုဖြစ်ပါတယ်။

Containerization Vs Virtualization

Container နဲ့ Virtual Machine ဘာတွေကွာခြားလဲဆိုတာကတော့ Virtualization လုပ်တယ်ဆိုတာက operating system ကြီးတစ်ခုလုံးကိုပါ packaging လုပ်တာဖြစ်ပါတယ်။ ဆိုလိုတာကတော့ VM ၃ ခု run နေတဲ့ server တစ်ခုဟာ hypervisor နဲ့ သူ့အပေါ်မှာ နောက်ထပ် တကယ့် operating system ၃ ခု run နေတာဖြစ်ပါတယ်။

Container တွေကတော့ Host Operating System ရဲ့ kernel modules တွေကို share သုံးတဲ့အတွက် ပိုပြီး lightweight ဖြစ်ပါတယ်။ Container တစ်ခုတစ်ခုဟာ Megabyte size လောက်ပဲ များသောအားဖြင့်ရှိတတ်ပြီး VM တွေကတော့ Multiple Gigabyte size တွေရှိတာဖြစ်ပါတယ်။

Containerization and Microservices

Container နဲ့ Microservice တွေဟာ ခွဲလို့မရတဲ့အတွဲတွေဖြစ်ပါတယ်။ Software တွေကို containerised လုပ်လိုက်နိုင်ခြင်းကြောင့် Service တွေဟာ တကယ့် Microservice တွေအနေနဲ့ အလုပ်လုပ်လာနိုင်ပါတယ်။ Service တွေဟာ တစ်ခုနဲ့တစ်ခု တကယ်ကို separate ဖြစ်လာပြီးတော့ manage လုပ်ရတာပိုပြီးလွယ်ကူလာတဲ့အတွက် Architecture ပိုင်းအရရော Scalability အရရော အရမ်းကောင်းလာပါတယ်။ Microservice ဆိုတာကို အတိုပြောရရင် workload ကို ခွဲဝေလုပ်ဆောင်တာဖြစ်တဲ့အတွက် single point of failure မရှိနိုင်တော့ပါဘူး။ ဒါ့ကြောင့် downtime အရနည်းသွားတာဖြစ်ပါတယ်။ ဥပမာ - post တင်တဲ့ service down သွားခဲ့ရင်တော့ chat service တွေက အလုပ်လုပ်နေနိုင်သေးတာဖြစ်ပါတယ်။

Conclusion

လက်ရှိမှာတော့ Containerization နည်းပညာဟာ မရှိမဖြစ်သိထားသင့်တဲ့ အရာတစ်ခုဖြစ်ပါတယ်။ နောက်လာမယ့် article မှာတော့ Container တွေဖြေရှင်းတဲ့ problem တွေကို လက်တွေ့ပြသသွားမှာဖြစ်ပြီးတော့ သူ့ရဲ့ ဒီ Resource Isolation ဟာ ဘယ်လို underlying technology ကိုသုံးပြီး ဘယ်လိုပုံစံမျိုးနဲ့ အလုပ်လုပ်လဲဆိုတာကို ပြောပြသွားမှာဖြစ်ပါတယ်။