What is the problem?
ပြသနာက ငါ့စက်မှာအလုပ်လုပ်တယ်။ သူ့စက်မှာအလုပ်မလုပ်ဘူး။ server မှာအလုပ်မလုပ်ဘူး။
ကျနော်တို့ တစ်ခါတစ်လေ ငါ့စက်မှာတော့အလုပ်လုပ်တယ်ဆိုတဲ့ ပြသနာကြုံရလေ့ရှိတယ်။ ဥပမာ ကျနော်တို့ web app တစ်ခုရေးကြတယ်။ အဲ့ဒါကို ubuntu server မှာတင်ရမယ်။ local development လုပ်တဲ့စက်က window ဖြစ်နေတယ်။ အဲ့ဒီတော့ ကျနော်တို့ server ပေါ်တင်တဲ့အချိန်မှာ enviroment မတူတာကြောင့်ပြသနာတွေတက်နိုင်တယ်။ interpreter or compliser version မတူတာတွေ ကျနော်တို့ web app run ဖို့လိုတဲ့ file တွေမရှိတာတွေ အစရှိတဲ့ပြသနာတွေတက်နိုင်တယ်။
အဲ့လို environment specific issue တွေက developer တွေအတွက်အရမ်းအာရုံနောက်စေတယ်။ အဲ့ဒီတော့ ဒီအတွက် solution တွေရှာလာကြတယ်။
Solutions
Virtualization
Host operating system မှာ virtual os တွေတင်ပြီးသုံးတဲ့ solution။ ဒီ solution က ကိုယ် deploy မယ့် server နဲ့ တူညီတဲ့ os တွေစက်မှာတင်ပြီး သုံးတာ။ server နဲ့ local environment တူတူဖြစ်သွားတော့ ခုနက ပြသနာပြေလည်သွားလိမ့်မယ်။
Containerization
Processes တွေကို အုပ်စုခွဲပြီး isolate လုပ်တဲ့ solution။ အဲ့လိုအုပ်စုခွဲလိုက်တဲ့အတွက် project တစ်ခုချင်းအတွက် unique ဖြစ်တဲ့ env တွေကိုတည်ဆောက်လို့ရသွားတယ်။ အဲ့လို တည်ဆောက်ထားတဲ့ env တွေကိုတခြားစက်တွေမှာလည်းအလွယ်တကူပြန်တည်ဆောက်လို့ရအောင်လုပ်တယ်။ အဲ့တာက ခုနက ပြသနာကိုပြေလည်သွားစေတယ်။
note: တကယ်တော့ containerization နဲ့ virtualization ကဖြေရှင်းပေးလိုက်တဲ့ problems တွေကအများကြီးပါ။ ကိုယ့်စက်မှာပဲအလုပ်လုပ်တယ်ဆိုတာက အဲ့ဒီပြသနာတွေထဲကတစ်ခုပေါ့
Virtualization(A technology used to run multiple os on a single machine)
Virtualization အကြောင်း မလေ့လာခင် ကျနော်တို့ os တွေဘယ်လိုအလုပ်လုပ်လဲ အရင်သိဖို့လိုမယ်။
OS ကိုသုံးပိုင်း ခွဲပြီးကြည့်လိုက်မယ်။
User space
Kernel space
Hardware
Hardware ဆိုတာက ram, cpu,.. etc အစရှိတာတွေပါလိမ့်မယ်။ os ဆိုတာက တကယ်တော့ အဲ့ဒီ hardware တွေကို စီမံခန့်ခွဲပေးတဲ့ software တစ်ခုပဲ။
OS မှာ kernel ဆိုတဲ့ program လေးတစ်ခုပါတယ်။ kernel ကဘာလုပ်ပေးလဲဆိုတော့ software layer နဲ့ hardware layer ကြားမှာတံတားတစ်ခုအနေနဲ့ဆောင်ရွက်ပေးတယ်။
ကိုယ့်ရဲ့ application က ဖိုင်တစ်ခုကို ဖွင့်မယ်ဆိုပါတော့ အဲ့ဒါကို kernel ကလုပ်ပေးတယ်ပြီးရင် ရလာတဲ့ output ကိုပဲကိုယ့် app ကိုပြန်ပေးတယ်။
အဲ့ဒီတော့ os တစ်ခုကိုကျနော်တို့ သုံးနေရင်ကျနော်တို့က user space မှာပဲသုံးနေတယ်။ ကျနော်တို့ ခိုင်းစေလိုက်တာတွေကို kernel ကတဆင့် hardware ကိုလိုသလို mange ပြီးအလုပ်လုပ်ပေးနေတယ်။
Hypervisor ( the heart of virtualization )
VMware, virtual box အစရှိတဲ့ software တွေက ကိုယ့်ရဲ့ OS ပေါ်မှာ virtual os တစ်ခုကို ဖန်တီးပေးတယ်။ အဲ့ဒီ software တွေမှာ Hypervisor ဆိုတဲ့ component လေးတစ်ခုပါတယ်။ Hypervisor ရဲ့အလုပ်လုပ်ပုံက kernel နဲ့ဆင်တယ်။
Kernel
software တွေ run ဖို့ လိုအပ်တဲ့ hardware management တွေလုပ်ပေးတယ်။
Hypervisor
virtual os တစ်ခု run ဖို့လိုအပ်တဲ့ hardware management တွေလုပ်ပေးတယ်။ virtual hardware တစ်ခုကိုတည်ဆောက်ပေးတယ်။ ဥပမာ ကိုယ်က ubuntu ကို VMware မှာတင်မယ်ဆိုပါစို့။ ပထမစစချင်း cpu, ram size, disk size စတာတွေကိုရွေးပေးလိုက်တယ်။ hypervisor ကကိုယ်ရွေးပေးလိုက်တဲ့ အတိုင်း virtual hardware တစ်ခုတည်ဆောက်လိုက်တယ်။ ubuntu က အဲ့လို hypervisor က create ပေးလိုက်တဲ့ virtual hardware ပေါ်မှာအလုပ်လုပ်တယ်။ တကယ့်ကိုယ့်စက်ရဲ့ hardware ပေါ်မှာအလုပ်မလုပ်ဘူး။
Hypervisor 2 မျိုးရှိတယ် native hypervisor နဲ့ hosted hypervisor.
Native hypervisor
os မလို, kernel မလို။ hardware ကိုတိုက်ရိုက်လှမ်း manage တယ်။
Hosted hypervisor
နောက်ကွယ်က run ပေးနေတဲ့ OS တစ်ခုရှိတယ်။ အဲ့ဒီ OS ကိုသုံးပြီးတော့ စက်ရဲ့ resource တွေကို manage လုပ်တယ်။
အဲ့ဒီတော့ user က supervisor ကိုသုံးပြီး သက်ဆိုင်ရာ virtual OS တွေကိုသုံးလို့ရမယ်။ အဲ့လို virtual တင်ထားတဲ့ OS တွေကို guest OS လို့ခေါ်ပြီး မူရင်း OS ကို host OS လို့ခေါ်တယ်။
Pros and Cons of Virtualization
Virtualization ရဲ့အဓိကကောင်းတဲ့အချက်က OS အများကြီးကို စက်တစ်ခုထဲပေါ်မှာ run လို့ရသွားတယ်။
အဓိကဆိုးတဲ့အချက်က resource မတရားစားတယ်။ သူက OS ကြီးတစ်ခုလုံးကို ပြန် install တာဖြစ်တဲ့အတွက် OS တစ်ခု install ဖို့ disk space လိုမယ်။ run ဖို့ memory လိုမယ်။ OS များလာလေ resource စားတာများလာလေပဲ။ ပြီးတော့ start up time ကလည်းမတရားကြာတယ်။ ဘာလို့လဲဆိုတော့ သူက OS တစ်ခုလုံးပြန် run ပေးရမှာဖြစ်တဲ့အတွက် booting time တွေ configuration time တွေလိုတယ်။
Containerization (A technology used to isolate a group of processes)
Container ဆိုတာ ကျနော်တို့ software or service တစ်ခု run ဖို့ လိုအပ်သမျှ အားလုံးပါတဲ့ package လို့မှတ်လို့ရတယ်။ ဘာတွေလိုအပ်တယ်ဆိုတာ ကတော့ ကျနော်တို့ configure လုပ်ပေးရမှာပေ့ါ။ ပြီးတော့ container တွေက standalone ဖြစ်တယ်။ ဥပမာ project A အတွက် configure လုပ်ထားတဲ့ container နဲ့ project B အတွက် configure လုပ်ထားတဲ့ container က စာဖတ်သူသာ ရည်းစားရသွားမယ်။ container ၂ခု ဘယ်တော့မှ conflict ဖြစ်မှာမဟုတ်ဘူး။
Containerization ကိုနားလည်ဖို့ဆို ပထမ စစချင်းကျနော်တို့ linux kernel technologies တွေဖြစ်တဲ့ cgroup နဲ့ namespace တွေကိုနားလည်ဖို့လိုတယ်။
Namespace
processes တွေကို isolated လုပ်ပေးတဲ့နည်းပညာ ။ pc တစ်ခုထဲမှာရှိတဲ့ container တွေတစ်ခုနဲ့တစ်ခု process တွေအနှောင့်အယှက်မရှိရအောင်လုပ်ပေးတယ်။
Cgroup
process group တစ်ခုက ယူသုံးနိုင်တဲ့ resource(cpu,disk,network,etc..) တွေကို ထိန်းညှိပေးတဲ့နည်းပညာ ။ hypervisor နဲ့မတူတာ cgroup က operating system level မှာ ထိန်းညှိပေးတယ်။ hypervisor က hardware level မှာ ထိန်းညှိတယ်။ အဲ့တာကြောင့် cgroup က hypervisor လို complete isolation ကိုမပေးဘူး။ တစ်နည်းပြောမယ်ဆို hypervisor က resource ကို limit လုပ်ပလိုက်တယ်။ cgroup က control ပဲလုပ်တယ် တကယ်သီးသန့် ခွဲခြားလိုက်တာမဟုတ်ဘူး။
Containers
Container လို့ပြောလိုက်ရင် ကျနော်တို့စစချင်း စဥ်းစားမိတာ docker ဖြစ်လိမ့်မယ်။ တကယ်တော့ docker ရဲ့ initial version က linux Container(LXC) ပေါ်မှာအခြေခံပြီးေဆာက်ထားတယ်။
LXC က linux namespace နဲ့ cgroup feature တွေကိုသုံးပြီး light weight container တွေဆောက်ဖို့ရေးထားတာပဲ။
Summary
Containers တွေက vm တွေလိုပဲသီးသန့်ဖြစ်တဲ့ environment ကို provide ပေးတယ်။ ဒါပေမယ့် virtual machine ရဲ့ resource စားတဲ့ပြသနာကိုဖြေရှင်းထားတယ်။
VM က hardware layer ကနေ virtualized လုပ်ပလိုက်တယ်။
Container က operating system layer ကနေပဲ isolate လုပ်ပလိုက်တယ်။
တနည်းအားဖြင့် container က process level isolation လုပ်တယ်။ VM က full system level isolation လုပ်တယ်။
VM မှာ guest OS ကြီးကို install ပေးဖို့လိုတယ်။
Container မှာ မလိုဘူး။