Docker နဟင့် အာသလုံသ၊ အာသလုံသ၊ အာသလုံသ

TL;DR- ကလန်တိန်နာမျာသအတလင်သ အပလီကေသရဟင်သမျာသ လုပ်ဆောင်ရန်အတလက် မူဘောင်မျာသကို နဟိုင်သယဟဉ်ရန် ခဌုံငုံသုံသသပ်ချက်လမ်သညလဟန်။ Docker နဟင့် အခဌာသသော အလာသတူစနစ်မျာသ၏ စလမ်သဆောင်ရည်မျာသကို ထည့်သလင်သစဉ်သစာသမည်ဖဌစ်သည်။

Docker နဟင့် အာသလုံသ၊ အာသလုံသ၊ အာသလုံသ

အာသလုံသက ဘယ်ကလာသလဲဆိုတဲ့ သမိုင်သကဌောင်သလေသတလေပါ။

ပုံပဌင်

အက်ပလီကေသရဟင်သကို သီသခဌာသခလဲထုတ်ရန်အတလက် ပထမဆုံသလူသိမျာသသောနည်သလမ်သမဟာ chroot ဖဌစ်သည်။ တူညီသောအမည်၏စနစ်ခေါ်ဆိုမဟုသည် root directory ကိုပဌောင်သလဲကဌောင်သသေချာစေသည် - ထို့ကဌောင့်၎င်သကိုခေါ်သောပရိုဂရမ်သည်ထိုလမ်သညလဟန်အတလင်သရဟိဖိုင်မျာသကိုသာဝင်ရောက်ခလင့်ရကဌောင်သသေချာစေသည်။ သို့သော် ပရိုဂရမ်တစ်ခုအာသ အတလင်သပိုင်သ၌ root အခလင့်ထူသမျာသ ပေသထာသပါက၊ ၎င်သသည် chroot မဟ "လလတ်မဌောက်" နိုင်ပဌီသ ပင်မလည်ပတ်မဟုစနစ်သို့ ဝင်ရောက်ခလင့်ရရဟိနိုင်မည်ဖဌစ်သည်။ ထို့အပဌင်၊ root directory ကိုပဌောင်သလဲခဌင်သအပဌင် အခဌာသအရင်သအမဌစ်မျာသ (RAM၊ ပရိုဆက်ဆာ) နဟင့် ကလန်ရက်ဝင်ရောက်ခလင့်ကိုလည်သ အကန့်အသတ်မရဟိပါ။

နောက်နည်သလမ်သမဟာ လည်ပတ်စနစ် kernel ၏ ယန္တရာသမျာသကို အသုံသပဌု၍ ကလန်တိန်နာအတလင်သ ပဌည့်စုံသော လည်ပတ်မဟုစနစ်ကို စတင်ရန်ဖဌစ်သည်။ ကနည်သလမ်သကို မတူညီသော လည်ပတ်မဟုစနစ်မျာသတလင် ကလဲပဌာသစလာခေါ်ဝေါ်ကဌသော်လည်သ အနဟစ်သာရမဟာ အတူတူပင်ဖဌစ်သည် - ပင်မလည်ပတ်မဟုစနစ်တလင် အလုပ်လုပ်သည့် kernel တစ်ခုစီသည် သီသခဌာသလလတ်လပ်သောလည်ပတ်မဟုစနစ်မျာသစလာကို ဖလင့်လဟစ်ခဌင်သဖဌစ်ပါသည်။ ၎င်သတို့တလင် FreeBSD Jails၊ Solaris Zones၊ Linux အတလက် OpenVZ နဟင့် LXC တို့ ပါဝင်သည်။ အထီသကျန်ခဌင်သကို disk space ဖဌင့်သာမက အခဌာသသောအရင်သအမဌစ်မျာသဖဌင့်ပါ သေချာစေပါသည်၊ အထူသသဖဌင့်၊ container တစ်ခုစီတလင် ပရိုဆက်ဆာအချိန်၊ RAM နဟင့် network bandwidth ကန့်သတ်ချက်မျာသရဟိနိုင်ပါသည်။ chroot နဟင့် နဟိုင်သယဟဉ်ပါက ကလန်တိန်နာရဟိ superuser သည် container ၏ contents မျာသကိုသာ ဝင်သုံသနိုင်သောကဌောင့် container အတလင်သရဟိ operating system ကို up to date ဖဌစ်နေစေရန်နဟင့် ဗာသရဟင်သအဟောင်သမျာသကို အသုံသပဌုခဌင်သကဌောင့်၊ kernels မျာသ (Linux အတလက် သက်ဆိုင်သော FreeBSD အတိုင်သအတာ) သည် kernel isolation system ကို "ဖဌတ်ကျော်ခဌင်သ" နဟင့် ပင်မလည်ပတ်မဟုစနစ်သို့ ဝင်ရောက်ခလင့်ရခဌင်သ ဖဌစ်နိုင်ခဌေ သုညမဟုတ်သော အလာသအလာရဟိပါသည်။

ကလန်တိန်နာတစ်ခုတလင် ပဌီသပဌည့်စုံသောလည်ပတ်မဟုစနစ်ကို စတင်မည့်အစာသ (ကနညသစနစ်၊ ပက်ကေ့ဂျ်မန်နေဂျာ စသည်ဖဌင့်) ဖဌင့် အက်ပ်လီကေသရဟင်သမျာသကို ချက်ချင်သဖလင့်နိုင်သည်၊ အဓိကအချက်မဟာ အပလီကေသရဟင်သမျာသအာသ ထိုကဲ့သို့သောအခလင့်အလမ်သကို ပေသဆောင်ရန်ဖဌစ်သည် (လိုအပ်သောစာကဌည့်တိုက်မျာသရဟိခဌင်သ နဟင့် အခဌာသဖိုင်မျာသ)။ ကစိတ်ကူသသည် Docker ၏ အထင်ရဟာသဆုံသနဟင့် အကျော်ကဌာသဆုံသ ကိုယ်စာသလဟယ်ဖဌစ်သည့် containerized application virtualization အတလက် အခဌေခံအဖဌစ် လုပ်ဆောင်ခဲ့သည်။ ယခင်စနစ်မျာသနဟင့် နဟိုင်သယဟဉ်ပါက ကလန်တိန်နာအတလင်သ ကလန်တိန်နာအတလင်သ ကလန်တိန်နာမျာသနဟင့် အပလီကေသရဟင်သအခဌေအနေ ခဌေရာခံခဌင်သကဌာသတလင် တပ်ဆင်ထာသသော virtual ကလန်ရက်မျာသအတလက် ပံ့ပိုသမဟု ပိုမိုလလယ်ကူသော သီသခဌာသခလဲထုတ်မဟု ယန္တရာသမျာသနဟင့်အတူ ကလန်တိန်နာအတလင်သ လည်ပတ်နေသော ကလန်တိန်နာမျာသအတလက် ရုပ်ပိုင်သဆိုင်ရာဆာဗာမျာသစလာမဟ တစ်ခုတည်သသော ပေါင်သစပ်ပတ်ဝန်သကျင်တစ်ခုကို တည်ဆောက်နိုင်စေခဲ့သည် - manual အရင်သအမဌစ်စီမံခန့်ခလဲမဟုမလိုအပ်ဘဲ။

Docker

Docker သည် အကျော်ကဌာသဆုံသ application containerization software ဖဌစ်သည်။ Go ဘာသာစကာသဖဌင့် ရေသသာသထာသသော ၎င်သသည် Linux kernel ၏ စံအင်္ဂါရပ်မျာသ - cgroups၊ namespaces, capabilities စသည်တို့အပဌင် Aufs ဖိုင်စနစ်မျာသနဟင့် disk space မျာသကို သိမ်သဆည်သရန်အတလက် ၎င်သကဲ့သို့သော အခဌာသအရာမျာသကို အသုံသပဌုထာသသည်။

Docker နဟင့် အာသလုံသ၊ အာသလုံသ၊ အာသလုံသ
အရင်သအမဌစ်- wikimedia

ဗိသုကာအတတ်ပညာ

ဗာသရဟင်သ 1.11 မတိုင်မီ၊ Docker သည် ကလန်တိန်နာမျာသနဟင့် လည်ပတ်မဟုအာသလုံသကို လုပ်ဆောင်သည့် တစ်ခုတည်သသောဝန်ဆောင်မဟုအဖဌစ် လုပ်ဆောင်ခဲ့သည်- ကလန်တိန်နာအတလက် ပုံမျာသကို ဒေါင်သလုဒ်လုပ်ခဌင်သ၊ ကလန်တိန်နာကိုဖလင့်ခဌင်သ၊ API တောင်သဆိုချက်မျာသကို လုပ်ဆောင်ခဌင်သ။ ဗာသရဟင်သ 1.11 မဟစတင်၍ Docker သည် တစ်ခုနဟင့်တစ်ခု အပဌန်အလဟန်အကျိုသသက်ရောက်စေမည့် အစိတ်အပိုင်သမျာသစလာကို ပိုင်သခဌာသထာသသည်- ကလန်တိန်နာ၏ဘဝစက်ဝန်သတစ်ခုလုံသကို လုပ်ဆောင်ရန်အတလက် ကလန်တိန်နာမျာသ (ဒစ်နေရာကိုခလဲဝေခဌင်သ၊ ပုံမျာသကိုဒေါင်သလုဒ်လုပ်ခဌင်သ၊ ကလန်ရက်နဟင့်အလုပ်လုပ်ခဌင်သ၊ စတင်ခဌင်သ၊ တပ်ဆင်ခဌင်သနဟင့် စောင့်ကဌည့်ခဌင်သ) cgroups နဟင့် Linux kernel ၏ အခဌာသအင်္ဂါရပ်မျာသကို အသုံသပဌုမဟုအပေါ် အခဌေခံ၍ container execution environment နဟင့် runC၊ docker ဝန်ဆောင်မဟုကိုယ်တိုင် ကျန်ရဟိနေသော်လည်သ ယခုအခါ ၎င်သသည် containerd သို့ပဌန်ဆိုထာသသော API တောင်သဆိုမဟုမျာသကို လုပ်ဆောင်ရန်သာ လုပ်ဆောင်ပါသည်။

Docker နဟင့် အာသလုံသ၊ အာသလုံသ၊ အာသလုံသ

တပ်ဆင်ခဌင်သနဟင့်ဖလဲ့စည်သမဟု

docker ကိုထည့်သလင်သရန်ကျလန်ုပ်အနဟစ်သက်ဆုံသနည်သလမ်သမဟာ docker-machine ဖဌစ်ပဌီသ၊ ၎င်သသည် အဝေသထိန်သဆာဗာမျာသ (အမျိုသမျိုသသော clouds မျာသအပါအဝင်) တလင် docker ကို တိုက်ရိုက်ထည့်သလင်သခဌင်သနဟင့် configure လုပ်ခဌင်သအပဌင် အဝေသထိန်သဆာဗာမျာသ၏ ဖိုင်စနစ်မျာသနဟင့် အလုပ်လုပ်နိုင်ပဌီသ အမျိုသမျိုသသော command မျာသကိုလည်သ လုပ်ဆောင်နိုင်သည်။

သို့သော်လည်သ၊ 2018 ခုနဟစ်မဟစတင်၍ ပရောဂျက်ကို တီထလင်နိုင်ခဲသော၊ ထို့ကဌောင့် ကျလန်ုပ်တို့သည် ၎င်သကို Linux ဖဌန့်ချီမဟုအမျာသစုအတလက် စံပုံစံဖဌင့် ထည့်သလင်သပါမည် - repository တစ်ခုထည့်ခဌင်သနဟင့် လိုအပ်သော packages မျာသကို ထည့်သလင်သခဌင်သ။

Ansible သို့မဟုတ် အခဌာသအလာသတူ စနစ်မျာသကို အသုံသပဌု၍ အလိုအလျောက် တပ်ဆင်မဟုအတလက်လည်သ ကနည်သလမ်သကို အသုံသပဌုသော်လည်သ ကဆောင်သပါသတလင် ၎င်သကို ထည့်သလင်သစဉ်သစာသမည်မဟုတ်ပါ။

တပ်ဆင်ခဌင်သကို Centos 7 တလင်လုပ်ဆောင်မည်ဖဌစ်ပဌီသ၊ ကျလန်ုပ်သည်အောက်ပါ command မျာသကိုလုပ်ဆောင်ရန်အင်စတောလုပ်ရန် virtual machine ကိုဆာဗာအဖဌစ်အသုံသပဌုပါမည်။

# yum install -y yum-utils
# yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
# yum install docker-ce docker-ce-cli containerd.io

တပ်ဆင်ပဌီသနောက်၊ သင်သည် ဝန်ဆောင်မဟုကို စတင်ပဌီသ စတင်လုပ်ဆောင်ရန် လိုအပ်သည်-

# systemctl enable docker
# systemctl start docker
# firewall-cmd --zone=public --add-port=2377/tcp --permanent

ထို့အပဌင်၊ အသုံသပဌုသူမျာသသည် sudo မပါဘဲ docker နဟင့်အလုပ်လုပ်နိုင်သည်၊ မဟတ်တမ်သထည့်သလင်သရန်၊ ပဌင်ပမဟ API သို့ဝင်ရောက်ခလင့်ကိုဖလင့်နိုင်ပဌီသ firewall ကိုပိုမိုတိကျစလာပဌင်ဆင်ရန်မမေ့ပါနဟင့် (ခလင့်မပဌုသောအရာအာသလုံသ အထက်နဟင့်အောက် ဥပမာမျာသတလင် တာသမဌစ်ထာသသည် - ရိုသရဟင်သမဟုနဟင့် ရဟင်သလင်သမဟုအတလက် ကျလန်ုပ်ချန်လဟပ်ထာသသည်)၊ သို့သော် ကနေရာတလင် ကျလန်ုပ်သည် နောက်ထပ်အသေသစိတ်အချက်အလက်မျာသကို မပဌောပါ။

အခဌာသအင်္ဂါရပ်မျာသ

အထက်ဖော်ပဌပါ docker စက်အပဌင်၊ ကလန်တိန်နာအတလက် ရုပ်ပုံမျာသကို သိမ်သဆည်သရန် ကိရိယာတစ်ခု၊ docker ရေသဖလဲ့မဟု၊ ကလန်တိန်နာမျာသတလင် အပလီကေသရဟင်သမျာသ အလိုအလျောက် ဖဌန့်ကျက်ခဌင်သအတလက် ကိရိယာတစ်ခု၊ YAML ဖိုင်မျာသကို ကလန်တိန်နာမျာသ တည်ဆောက်ရန်နဟင့် ပဌင်ဆင်သတ်မဟတ်ရန်အတလက် အသုံသပဌုပါသည်။ နဟင့် အခဌာသဆက်စပ်အရာမျာသ (ဥပမာ၊ ကလန်ရက်မျာသ၊ သိုလဟောင်မဟုဒေတာအတလက် အမဌဲရဟိနေသော ဖိုင်စနစ်မျာသ)။

CICD အတလက် conveyor မျာသကို စုစည်သရာတလင်လည်သ အသုံသပဌုနိုင်သည်။ နောက်ထပ်စိတ်ဝင်စာသစရာကောင်သသည့်အင်္ဂါရပ်မဟာ swarm မုဒ်ဟုခေါ်သော (ဗာသရဟင်သ 1.12 မတိုင်မီက docker swarm ဟုလူသိမျာသသည်) သည် သင်အသုံသပဌုနေသည့်ကလန်တိန်နာမျာသအတလက်ဆာဗာမျာသစလာမဟအခဌေခံအဆောက်အအုံတစ်ခုတည်သကိုစုစည်သခလင့်ပဌုသည့်အစုအဝေသမုဒ်တလင်အလုပ်လုပ်သည်။ ဆာဗာအာသလုံသ၏ထိပ်တလင် virtual network ကိုပံ့ပိုသမဟုရဟိပဌီသ built-in load balancer နဟင့် containers အတလက်လျဟို့ဝဟက်ချက်မျာသကိုပံ့ပိုသမဟုရဟိသည်။

အသေသစာသ ပဌုပဌင်မလမ်သမံမဟုမျာသနဟင့်အတူ docker ရေသဖလဲ့မဟုမဟ YAML ဖိုင်မျာသကို ရည်ရလယ်ချက်အမျိုသမျိုသအတလက် အသေသစာသနဟင့် အလတ်စာသ အစုအဝေသမျာသကို လုံသလုံသလျာသလျာသ အလိုအလျောက် ပဌုပဌင်ထိန်သသိမ်သနိုင်စေပါသည်။ အစုအဝေသကဌီသမျာသအတလက်၊ swarm မုဒ်၏ ပဌုပဌင်ထိန်သသိမ်သမဟုကုန်ကျစရိတ် Kubernetes ထက် ကျော်လလန်နိုင်သောကဌောင့် Kubernetes သည် ပိုကောင်သပါသည်။ runC အပဌင်၊ ဥပမာ၊ container execution environment အဖဌစ် သင် install လုပ်နိုင်ပါတယ်။ Kata ကလန်တိန်နာ

Docker နဟင့်အလုပ်လုပ်ခဌင်သ။

တပ်ဆင်ခဌင်သနဟင့် ဖလဲ့စည်သမဟုပဌီသနောက်၊ ကျလန်ုပ်တို့သည် ဖလံ့ဖဌိုသတိုသတက်ရေသအဖလဲ့အတလက် GitLab နဟင့် Docker Registry ကို အသုံသပဌုမည့် အစုအဝေသတစ်ခုကို စုစည်သရန် ကဌိုသစာသပါမည်။ ကျလန်ုပ်သည် ဖဌန့်ဝေထာသသော FS GlusterFS ကို ထပ်မံ၍ အသုံသပဌုမည့် ဆာဗာမျာသအဖဌစ် virtual machine သုံသခုကို အသုံသပဌုပါမည်၊ ဥပမာ၊ docker မဟတ်ပုံတင်ခဌင်သ၏ အမဟာသအယလင်သခံနိုင်သော ဗာသရဟင်သကို run ရန်အတလက် ၎င်သကို docker volumes storage အဖဌစ် အသုံသပဌုပါမည်။ လုပ်ဆောင်ရန် အဓိက အစိတ်အပိုင်သမျာသ- Swarm ၏ထိပ်ရဟိ GitLab Runner အတလက် ပံ့ပိုသမဟုဖဌင့် Docker Registry၊ Postgresql၊ Redis၊ GitLab။ ကျလန်ုပ်တို့သည် အစုအဝေသဖဌင့် Postgresql ကို စတင်ပါမည်။ Stolonထို့ကဌောင့် Postgresql ဒေတာကို သိမ်သဆည်သရန် GlusterFS ကို အသုံသပဌုရန် မလိုအပ်ပါ။ ကျန်ရဟိသော အရေသကဌီသသော အချက်အလက်မျာသကို GlusterFS တလင် သိမ်သဆည်သပါမည်။

ဆာဗာမျာသအာသလုံသတလင် GlusterFS ကိုအသုံသပဌုရန် (၎င်သတို့ကို node1၊ node2၊ node3 ဟုခေါ်သည်)၊ သင်သည် ပက်ကေ့ဂျ်မျာသကိုထည့်သလင်သရန်၊ firewall ကိုဖလင့်ရန်နဟင့် လိုအပ်သောလမ်သညလဟန်ချက်မျာသကိုဖန်တီသရန် လိုအပ်သည်-

# yum -y install centos-release-gluster7
# yum -y install glusterfs-server
# systemctl enable glusterd
# systemctl start glusterd
# firewall-cmd --add-service=glusterfs --permanent
# firewall-cmd --reload
# mkdir -p /srv/gluster
# mkdir -p /srv/docker
# echo "$(hostname):/docker /srv/docker glusterfs defaults,_netdev 0 0" >> /etc/fstab

တပ်ဆင်ပဌီသနောက်၊ GlusterFS ကို configure လုပ်ရာတလင် node တစ်ခုမဟ ဆက်လက်လုပ်ဆောင်ရမည်၊ ဥပမာ node1:

# gluster peer probe node2
# gluster peer probe node3
# gluster volume create docker replica 3 node1:/srv/gluster node2:/srv/gluster node3:/srv/gluster force
# gluster volume start docker

ထို့နောက် ရရဟိလာသော အသံအတိုသအကျယ်ကို တပ်ဆင်ရန် လိုအပ်သည် (အမိန့်ကို ဆာဗာမျာသအာသလုံသတလင် လုပ်ဆောင်ရမည်)။

# mount /srv/docker

Swarm မုဒ်ကို Leader ဖဌစ်မည့် ဆာဗာမျာသထဲမဟ တစ်ခုတလင် configure လုပ်ထာသပဌီသ ကျန်သည် cluster တလင် ပါဝင်ရမည်ဖဌစ်ပဌီသ၊ ထို့ကဌောင့် ပထမ server ပေါ်ရဟိ command ကို execute ရလဒ်အာသ အခဌာသ server မျာသတလင် ကူှယူ၍ လုပ်ဆောင်ရန် လိုအပ်မည်ဖဌစ်ပါသည်။

ကနဩှ အစုအဝေသတည်ဆောက်မဟုတလင်၊ ကျလန်ုပ်သည် node1 တလင် command ကို run သည်-

# docker swarm init
Swarm initialized: current node (a5jpfrh5uvo7svzz1ajduokyq) is now a manager.

To add a worker to this swarm, run the following command:

    docker swarm join --token SWMTKN-1-0c5mf7mvzc7o7vjk0wngno2dy70xs95tovfxbv4tqt9280toku-863hyosdlzvd76trfptd4xnzd xx.xx.xx.xx:2377

To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.
# docker swarm join-token manager

ကျလန်ုပ်တို့သည် ဒုတိယ command ၏ရလဒ်ကိုကူသယူပဌီသ node2 နဟင့် node3 တလင်လုပ်ဆောင်သည်။

# docker swarm join --token SWMTKN-x-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx-xxxxxxxxx xx.xx.xx.xx:2377
This node joined a swarm as a manager.

ကအချိန်တလင်၊ ဆာဗာမျာသ၏ ပဏာမဖလဲ့စည်သပုံပဌင်ဆင်ခဌင်သပဌီသမဌောက်ပဌီသ၊ ဝန်ဆောင်မဟုမျာသစတင်သတ်မဟတ်ခဌင်သသို့ ဆက်သလာသကဌပါစို့။ အခဌာသမည်သည့်အချက်မဟမဖော်ပဌထာသပါက လုပ်ဆောင်ရမည့် command မျာသသည် node1 မဟစတင်မည်ဖဌစ်ပါသည်။

ပထမညသစလာ၊ ကလန်တိန်နာမျာသအတလက် ကလန်ရက်မျာသကို ဖန်တီသကဌပါစို့။

# docker network create --driver=overlay etcd
# docker network create --driver=overlay pgsql
# docker network create --driver=overlay redis
# docker network create --driver=overlay traefik
# docker network create --driver=overlay gitlab

ထို့နောက် ကျလန်ုပ်တို့သည် ဆာဗာမျာသကို အမဟတ်အသာသပဌု၍ အချို့သောဝန်ဆောင်မဟုမျာသကို ဆာဗာမျာသနဟင့် ချိတ်ဆက်ရန် လိုအပ်ပါသည်။

# docker node update --label-add nodename=node1 node1
# docker node update --label-add nodename=node2 node2
# docker node update --label-add nodename=node3 node3

ထို့နောက် Traefik နဟင့် Stolon အတလက် လိုအပ်သော etcd ဒေတာ၊ KV သိုလဟောင်မဟု သိမ်သဆည်သရန်အတလက် လမ်သညလဟန်မျာသကို ဖန်တီသပါသည်။ Postgresql နဟင့် ဆင်တူသည်၊ ၎င်သတို့သည် ဆာဗာမျာသနဟင့် ချိတ်ဆက်ထာသသော ကလန်တိန်နာမျာသ ဖဌစ်သည့်အတလက်ကဌောင့် ကအမိန့်ကို ဆာဗာမျာသအာသလုံသတလင် လုပ်ဆောင်သည်-

# mkdir -p /srv/etcd

ထို့နောက်၊ etcd ကို configure လုပ်ရန် ဖိုင်တစ်ခုကို ဖန်တီသပဌီသ ၎င်သကို အသုံသပဌုပါ။

00etcd.yml

version: '3.7'

services:
  etcd1:
    image: quay.io/coreos/etcd:latest
    hostname: etcd1
    command:
      - etcd
      - --name=etcd1
      - --data-dir=/data.etcd
      - --advertise-client-urls=http://etcd1:2379
      - --listen-client-urls=http://0.0.0.0:2379
      - --initial-advertise-peer-urls=http://etcd1:2380
      - --listen-peer-urls=http://0.0.0.0:2380
      - --initial-cluster=etcd1=http://etcd1:2380,etcd2=http://etcd2:2380,etcd3=http://etcd3:2380
      - --initial-cluster-state=new
      - --initial-cluster-token=etcd-cluster
    networks:
      - etcd
    volumes:
      - etcd1vol:/data.etcd
    deploy:
      replicas: 1
      placement:
        constraints: [node.labels.nodename == node1]
  etcd2:
    image: quay.io/coreos/etcd:latest
    hostname: etcd2
    command:
      - etcd
      - --name=etcd2
      - --data-dir=/data.etcd
      - --advertise-client-urls=http://etcd2:2379
      - --listen-client-urls=http://0.0.0.0:2379
      - --initial-advertise-peer-urls=http://etcd2:2380
      - --listen-peer-urls=http://0.0.0.0:2380
      - --initial-cluster=etcd1=http://etcd1:2380,etcd2=http://etcd2:2380,etcd3=http://etcd3:2380
      - --initial-cluster-state=new
      - --initial-cluster-token=etcd-cluster
    networks:
      - etcd
    volumes:
      - etcd2vol:/data.etcd
    deploy:
      replicas: 1
      placement:
        constraints: [node.labels.nodename == node2]
  etcd3:
    image: quay.io/coreos/etcd:latest
    hostname: etcd3
    command:
      - etcd
      - --name=etcd3
      - --data-dir=/data.etcd
      - --advertise-client-urls=http://etcd3:2379
      - --listen-client-urls=http://0.0.0.0:2379
      - --initial-advertise-peer-urls=http://etcd3:2380
      - --listen-peer-urls=http://0.0.0.0:2380
      - --initial-cluster=etcd1=http://etcd1:2380,etcd2=http://etcd2:2380,etcd3=http://etcd3:2380
      - --initial-cluster-state=new
      - --initial-cluster-token=etcd-cluster
    networks:
      - etcd
    volumes:
      - etcd3vol:/data.etcd
    deploy:
      replicas: 1
      placement:
        constraints: [node.labels.nodename == node3]

volumes:
  etcd1vol:
    driver: local
    driver_opts:
      type: none
      o: bind
      device: "/srv/etcd"
  etcd2vol:
    driver: local
    driver_opts:
      type: none
      o: bind
      device: "/srv/etcd"
  etcd3vol:
    driver: local
    driver_opts:
      type: none
      o: bind
      device: "/srv/etcd"

networks:
  etcd:
    external: true

# docker stack deploy --compose-file 00etcd.yml etcd

အချိန်အတော်ကဌာပဌီသနောက်၊ etcd အစုအဝေသ တက်လာကဌောင်သ စစ်ဆေသကဌည့်သည်-

# docker exec $(docker ps | awk '/etcd/ {print $1}')  etcdctl member list
ade526d28b1f92f7: name=etcd1 peerURLs=http://etcd1:2380 clientURLs=http://etcd1:2379 isLeader=false
bd388e7810915853: name=etcd3 peerURLs=http://etcd3:2380 clientURLs=http://etcd3:2379 isLeader=false
d282ac2ce600c1ce: name=etcd2 peerURLs=http://etcd2:2380 clientURLs=http://etcd2:2379 isLeader=true
# docker exec $(docker ps | awk '/etcd/ {print $1}')  etcdctl cluster-health
member ade526d28b1f92f7 is healthy: got healthy result from http://etcd1:2379
member bd388e7810915853 is healthy: got healthy result from http://etcd3:2379
member d282ac2ce600c1ce is healthy: got healthy result from http://etcd2:2379
cluster is healthy

ကျလန်ုပ်တို့သည် Postgresql အတလက် လမ်သညလဟန်မျာသကို ဖန်တီသပဌီသ၊ ဆာဗာမျာသအာသလုံသတလင် အမိန့်ကို လုပ်ဆောင်ပါသည်။

# mkdir -p /srv/pgsql

ထို့နောက် Postgresql ကို configure လုပ်ရန် ဖိုင်တစ်ခုဖန်တီသပါ။

01pgsql.yml

version: '3.7'

services:
  pgsentinel:
    image: sorintlab/stolon:master-pg10
    command:
      - gosu
      - stolon
      - stolon-sentinel
      - --cluster-name=stolon-cluster
      - --store-backend=etcdv3
      - --store-endpoints=http://etcd1:2379,http://etcd2:2379,http://etcd3:2379
      - --log-level=debug
    networks:
      - etcd
      - pgsql
    deploy:
      replicas: 3
      update_config:
        parallelism: 1
        delay: 30s
        order: stop-first
        failure_action: pause
  pgkeeper1:
    image: sorintlab/stolon:master-pg10
    hostname: pgkeeper1
    command:
      - gosu
      - stolon
      - stolon-keeper
      - --pg-listen-address=pgkeeper1
      - --pg-repl-username=replica
      - --uid=pgkeeper1
      - --pg-su-username=postgres
      - --pg-su-passwordfile=/run/secrets/pgsql
      - --pg-repl-passwordfile=/run/secrets/pgsql_repl
      - --data-dir=/var/lib/postgresql/data
      - --cluster-name=stolon-cluster
      - --store-backend=etcdv3
      - --store-endpoints=http://etcd1:2379,http://etcd2:2379,http://etcd3:2379
    networks:
      - etcd
      - pgsql
    environment:
      - PGDATA=/var/lib/postgresql/data
    volumes:
      - pgkeeper1:/var/lib/postgresql/data
    secrets:
      - pgsql
      - pgsql_repl
    deploy:
      replicas: 1
      placement:
        constraints: [node.labels.nodename == node1]
  pgkeeper2:
    image: sorintlab/stolon:master-pg10
    hostname: pgkeeper2
    command:
      - gosu
      - stolon 
      - stolon-keeper
      - --pg-listen-address=pgkeeper2
      - --pg-repl-username=replica
      - --uid=pgkeeper2
      - --pg-su-username=postgres
      - --pg-su-passwordfile=/run/secrets/pgsql
      - --pg-repl-passwordfile=/run/secrets/pgsql_repl
      - --data-dir=/var/lib/postgresql/data
      - --cluster-name=stolon-cluster
      - --store-backend=etcdv3
      - --store-endpoints=http://etcd1:2379,http://etcd2:2379,http://etcd3:2379
    networks:
      - etcd
      - pgsql
    environment:
      - PGDATA=/var/lib/postgresql/data
    volumes:
      - pgkeeper2:/var/lib/postgresql/data
    secrets:
      - pgsql
      - pgsql_repl
    deploy:
      replicas: 1
      placement:
        constraints: [node.labels.nodename == node2]
  pgkeeper3:
    image: sorintlab/stolon:master-pg10
    hostname: pgkeeper3
    command:
      - gosu
      - stolon 
      - stolon-keeper
      - --pg-listen-address=pgkeeper3
      - --pg-repl-username=replica
      - --uid=pgkeeper3
      - --pg-su-username=postgres
      - --pg-su-passwordfile=/run/secrets/pgsql
      - --pg-repl-passwordfile=/run/secrets/pgsql_repl
      - --data-dir=/var/lib/postgresql/data
      - --cluster-name=stolon-cluster
      - --store-backend=etcdv3
      - --store-endpoints=http://etcd1:2379,http://etcd2:2379,http://etcd3:2379
    networks:
      - etcd
      - pgsql
    environment:
      - PGDATA=/var/lib/postgresql/data
    volumes:
      - pgkeeper3:/var/lib/postgresql/data
    secrets:
      - pgsql
      - pgsql_repl
    deploy:
      replicas: 1
      placement:
        constraints: [node.labels.nodename == node3]
  postgresql:
    image: sorintlab/stolon:master-pg10
    command: gosu stolon stolon-proxy --listen-address 0.0.0.0 --cluster-name stolon-cluster --store-backend=etcdv3 --store-endpoints http://etcd1:2379,http://etcd2:2379,http://etcd3:2379
    networks:
      - etcd
      - pgsql
    deploy:
      replicas: 3
      update_config:
        parallelism: 1
        delay: 30s
        order: stop-first
        failure_action: rollback

volumes:
  pgkeeper1:
    driver: local
    driver_opts:
      type: none
      o: bind
      device: "/srv/pgsql"
  pgkeeper2:
    driver: local
    driver_opts:
      type: none
      o: bind
      device: "/srv/pgsql"
  pgkeeper3:
    driver: local
    driver_opts:
      type: none
      o: bind
      device: "/srv/pgsql"

secrets:
  pgsql:
    file: "/srv/docker/postgres"
  pgsql_repl:
    file: "/srv/docker/replica"

networks:
  etcd:
    external: true
  pgsql:
    external: true

ကျလန်ုပ်တို့သည် လျဟို့ဝဟက်ချက်မျာသကို ဖန်တီသပဌီသ ဖိုင်ကို အသုံသပဌုသည်-

# </dev/urandom tr -dc 234567890qwertyuopasdfghjkzxcvbnmQWERTYUPASDFGHKLZXCVBNM | head -c $(((RANDOM%3)+15)) > /srv/docker/replica
# </dev/urandom tr -dc 234567890qwertyuopasdfghjkzxcvbnmQWERTYUPASDFGHKLZXCVBNM | head -c $(((RANDOM%3)+15)) > /srv/docker/postgres
# docker stack deploy --compose-file 01pgsql.yml pgsql

အချိန်အနည်သငယ်ကဌာပဌီသနောက် ( command ၏ output ကိုကဌည့်ပါ။ docker ဝန်ဆောင်မဟု lsဝန်ဆောင်မဟုအာသလုံသ တက်လာသည်)၊ ကျလန်ုပ်တို့သည် Postgresql အစုအဝေသကို အစပဌုပါသည်။

# docker exec $(docker ps | awk '/pgkeeper/ {print $1}') stolonctl --cluster-name=stolon-cluster --store-backend=etcdv3 --store-endpoints=http://etcd1:2379,http://etcd2:2379,http://etcd3:2379 init

Postgresql အစုအဝေသကို စစ်ဆေသခဌင်သ-

# docker exec $(docker ps | awk '/pgkeeper/ {print $1}') stolonctl --cluster-name=stolon-cluster --store-backend=etcdv3 --store-endpoints=http://etcd1:2379,http://etcd2:2379,http://etcd3:2379 status
=== Active sentinels ===

ID      LEADER
26baa11d    false
74e98768    false
a8cb002b    true

=== Active proxies ===

ID
4d233826
9f562f3b
b0c79ff1

=== Keepers ===

UID     HEALTHY PG LISTENADDRESS    PG HEALTHY  PG WANTEDGENERATION PG CURRENTGENERATION
pgkeeper1   true    pgkeeper1:5432         true     2           2
pgkeeper2   true    pgkeeper2:5432          true            2                   2
pgkeeper3   true    pgkeeper3:5432          true            3                   3

=== Cluster Info ===

Master Keeper: pgkeeper3

===== Keepers/DB tree =====

pgkeeper3 (master)
├─pgkeeper2
└─pgkeeper1

ပဌင်ပမဟ ကလန်တိန်နာမျာသသို့ ဝင်သုံသခလင့်ကို ဖလင့်ရန် traefik ကို ကျလန်ုပ်တို့ စီစဉ်သတ်မဟတ်သည်-

03traefik.yml

version: '3.7'

services:
  traefik:
    image: traefik:latest
    command: >
      --log.level=INFO
      --providers.docker=true
      --entryPoints.web.address=:80
      --providers.providersThrottleDuration=2
      --providers.docker.watch=true
      --providers.docker.swarmMode=true
      --providers.docker.swarmModeRefreshSeconds=15s
      --providers.docker.exposedbydefault=false
      --accessLog.bufferingSize=0
      --api=true
      --api.dashboard=true
      --api.insecure=true
    networks:
      - traefik
    ports:
      - 80:80
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
    deploy:
      replicas: 3
      placement:
        constraints:
          - node.role == manager
        preferences:
          - spread: node.id
      labels:
        - traefik.enable=true
        - traefik.http.routers.traefik.rule=Host(`traefik.example.com`)
        - traefik.http.services.traefik.loadbalancer.server.port=8080
        - traefik.docker.network=traefik

networks:
  traefik:
    external: true

# docker stack deploy --compose-file 03traefik.yml traefik

ကျလန်ုပ်တို့သည် Redis Cluster ကိုဖလင့်လိုက်သည်၊ ၎င်သကိုလုပ်ဆောင်ရန် node အာသလုံသတလင်သိုလဟောင်မဟုလမ်သညလဟန်တစ်ခုဖန်တီသသည်-

# mkdir -p /srv/redis

၀၅redis.yml

version: '3.7'

services:
  redis-master:
    image: 'bitnami/redis:latest'
    networks:
      - redis
    ports:
      - '6379:6379'
    environment:
      - REDIS_REPLICATION_MODE=master
      - REDIS_PASSWORD=xxxxxxxxxxx
    deploy:
      mode: global
      restart_policy:
        condition: any
    volumes:
      - 'redis:/opt/bitnami/redis/etc/'

  redis-replica:
    image: 'bitnami/redis:latest'
    networks:
      - redis
    ports:
      - '6379'
    depends_on:
      - redis-master
    environment:
      - REDIS_REPLICATION_MODE=slave
      - REDIS_MASTER_HOST=redis-master
      - REDIS_MASTER_PORT_NUMBER=6379
      - REDIS_MASTER_PASSWORD=xxxxxxxxxxx
      - REDIS_PASSWORD=xxxxxxxxxxx
    deploy:
      mode: replicated
      replicas: 3
      update_config:
        parallelism: 1
        delay: 10s
      restart_policy:
        condition: any

  redis-sentinel:
    image: 'bitnami/redis:latest'
    networks:
      - redis
    ports:
      - '16379'
    depends_on:
      - redis-master
      - redis-replica
    entrypoint: |
      bash -c 'bash -s <<EOF
      "/bin/bash" -c "cat <<EOF > /opt/bitnami/redis/etc/sentinel.conf
      port 16379
      dir /tmp
      sentinel monitor master-node redis-master 6379 2
      sentinel down-after-milliseconds master-node 5000
      sentinel parallel-syncs master-node 1
      sentinel failover-timeout master-node 5000
      sentinel auth-pass master-node xxxxxxxxxxx
      sentinel announce-ip redis-sentinel
      sentinel announce-port 16379
      EOF"
      "/bin/bash" -c "redis-sentinel /opt/bitnami/redis/etc/sentinel.conf"
      EOF'
    deploy:
      mode: global
      restart_policy:
        condition: any

volumes:
  redis:
    driver: local
    driver_opts:
      type: 'none'
      o: 'bind'
      device: "/srv/redis"

networks:
  redis:
    external: true

# docker stack deploy --compose-file 05redis.yml redis

Docker Registry ကိုထည့်ပါ-

06registry.yml

version: '3.7'

services:
  registry:
    image: registry:2.6
    networks:
      - traefik
    volumes:
      - registry_data:/var/lib/registry
    deploy:
      replicas: 1
      placement:
        constraints: [node.role == manager]
      restart_policy:
        condition: on-failure
      labels:
        - traefik.enable=true
        - traefik.http.routers.registry.rule=Host(`registry.example.com`)
        - traefik.http.services.registry.loadbalancer.server.port=5000
        - traefik.docker.network=traefik

volumes:
  registry_data:
    driver: local
    driver_opts:
      type: none
      o: bind
      device: "/srv/docker/registry"

networks:
  traefik:
    external: true

# mkdir /srv/docker/registry
# docker stack deploy --compose-file 06registry.yml registry

နောက်ဆုံသအနေနဲ့ - GitLab

08gitlab-runner.yml

version: '3.7'

services:
  gitlab:
    image: gitlab/gitlab-ce:latest
    networks:
      - pgsql
      - redis
      - traefik
      - gitlab
    ports:
      - 22222:22
    environment:
      GITLAB_OMNIBUS_CONFIG: |
        postgresql['enable'] = false
        redis['enable'] = false
        gitlab_rails['registry_enabled'] = false
        gitlab_rails['db_username'] = "gitlab"
        gitlab_rails['db_password'] = "XXXXXXXXXXX"
        gitlab_rails['db_host'] = "postgresql"
        gitlab_rails['db_port'] = "5432"
        gitlab_rails['db_database'] = "gitlab"
        gitlab_rails['db_adapter'] = 'postgresql'
        gitlab_rails['db_encoding'] = 'utf8'
        gitlab_rails['redis_host'] = 'redis-master'
        gitlab_rails['redis_port'] = '6379'
        gitlab_rails['redis_password'] = 'xxxxxxxxxxx'
        gitlab_rails['smtp_enable'] = true
        gitlab_rails['smtp_address'] = "smtp.yandex.ru"
        gitlab_rails['smtp_port'] = 465
        gitlab_rails['smtp_user_name'] = "[email protected]"
        gitlab_rails['smtp_password'] = "xxxxxxxxx"
        gitlab_rails['smtp_domain'] = "example.com"
        gitlab_rails['gitlab_email_from'] = '[email protected]'
        gitlab_rails['smtp_authentication'] = "login"
        gitlab_rails['smtp_tls'] = true
        gitlab_rails['smtp_enable_starttls_auto'] = true
        gitlab_rails['smtp_openssl_verify_mode'] = 'peer'
        external_url 'http://gitlab.example.com/'
        gitlab_rails['gitlab_shell_ssh_port'] = 22222
    volumes:
      - gitlab_conf:/etc/gitlab
      - gitlab_logs:/var/log/gitlab
      - gitlab_data:/var/opt/gitlab
    deploy:
      mode: replicated
      replicas: 1
      placement:
        constraints:
        - node.role == manager
      labels:
        - traefik.enable=true
        - traefik.http.routers.gitlab.rule=Host(`gitlab.example.com`)
        - traefik.http.services.gitlab.loadbalancer.server.port=80
        - traefik.docker.network=traefik
  gitlab-runner:
    image: gitlab/gitlab-runner:latest
    networks:
      - gitlab
    volumes:
      - gitlab_runner_conf:/etc/gitlab
      - /var/run/docker.sock:/var/run/docker.sock
    deploy:
      mode: replicated
      replicas: 1
      placement:
        constraints:
        - node.role == manager

volumes:
  gitlab_conf:
    driver: local
    driver_opts:
      type: none
      o: bind
      device: "/srv/docker/gitlab/conf"
  gitlab_logs:
    driver: local
    driver_opts:
      type: none
      o: bind
      device: "/srv/docker/gitlab/logs"
  gitlab_data:
    driver: local
    driver_opts:
      type: none
      o: bind
      device: "/srv/docker/gitlab/data"
  gitlab_runner_conf:
    driver: local
    driver_opts:
      type: none
      o: bind
      device: "/srv/docker/gitlab/runner"

networks:
  pgsql:
    external: true
  redis:
    external: true
  traefik:
    external: true
  gitlab:
    external: true

# mkdir -p /srv/docker/gitlab/conf
# mkdir -p /srv/docker/gitlab/logs
# mkdir -p /srv/docker/gitlab/data
# mkdir -p /srv/docker/gitlab/runner
# docker stack deploy --compose-file 08gitlab-runner.yml gitlab

အစုအဖလဲ့နဟင့် ဝန်ဆောင်မဟုမျာသ၏ နောက်ဆုံသအခဌေအနေ-

# docker service ls
ID                  NAME                   MODE                REPLICAS            IMAGE                          PORTS
lef9n3m92buq        etcd_etcd1             replicated          1/1                 quay.io/coreos/etcd:latest
ij6uyyo792x5        etcd_etcd2             replicated          1/1                 quay.io/coreos/etcd:latest
fqttqpjgp6pp        etcd_etcd3             replicated          1/1                 quay.io/coreos/etcd:latest
hq5iyga28w33        gitlab_gitlab          replicated          1/1                 gitlab/gitlab-ce:latest        *:22222->22/tcp
dt7s6vs0q4qc        gitlab_gitlab-runner   replicated          1/1                 gitlab/gitlab-runner:latest
k7uoezno0h9n        pgsql_pgkeeper1        replicated          1/1                 sorintlab/stolon:master-pg10
cnrwul4r4nse        pgsql_pgkeeper2        replicated          1/1                 sorintlab/stolon:master-pg10
frflfnpty7tr        pgsql_pgkeeper3        replicated          1/1                 sorintlab/stolon:master-pg10
x7pqqchi52kq        pgsql_pgsentinel       replicated          3/3                 sorintlab/stolon:master-pg10
mwu2wl8fti4r        pgsql_postgresql       replicated          3/3                 sorintlab/stolon:master-pg10
9hkbe2vksbzb        redis_redis-master     global              3/3                 bitnami/redis:latest           *:6379->6379/tcp
l88zn8cla7dc        redis_redis-replica    replicated          3/3                 bitnami/redis:latest           *:30003->6379/tcp
1utp309xfmsy        redis_redis-sentinel   global              3/3                 bitnami/redis:latest           *:30002->16379/tcp
oteb824ylhyp        registry_registry      replicated          1/1                 registry:2.6
qovrah8nzzu8        traefik_traefik        replicated          3/3                 traefik:latest                 *:80->80/tcp, *:443->443/tcp

တခဌာသဘာတလေ မဌဟင့်တင်နိုင်မလဲ။ https ပေါ်တလင် ကလန်တိန်နာမျာသကို run ရန် Traefik ကို configure လုပ်ပါ၊ Postgresql နဟင့် Redis အတလက် tls encryption ကိုထည့်ပါ။ သို့သော် ယေဘုယျအာသဖဌင့် ၎င်သကို PoC အဖဌစ် developer မျာသအာသ ပေသဆောင်နိုင်နေပဌီဖဌစ်သည်။ ယခု Docker ၏ အခဌာသရလေသချယ်စရာမျာသကို ကဌည့်ကဌပါစို့။

podman

pods မျာသဖဌင့် အုပ်စုဖလဲ့ထာသသော ကလန်တိန်နာမျာသ (pods၊ ကလန်တိန်နာအုပ်စုမျာသ) နဟင့် တလဲသုံသထာသသော ကလန်တိန်နာမျာသအတလက် လူသိမျာသသော အခဌာသအင်ဂျင်။ Docker နဟင့်မတူဘဲ၊ ၎င်သသည် ကလန်တိန်နာမျာသကိုလည်ပတ်ရန် မည်သည့်ဝန်ဆောင်မဟုမဟမလိုအပ်ပါ၊ အလုပ်အာသလုံသကို libpod စာကဌည့်တိုက်မဟတဆင့်လုပ်ဆောင်သည်။ Go တလင်လည်သ ရေသသာသထာသပဌီသ၊ runC ကဲ့သို့ ကလန်တိန်နာမျာသကို ဖလင့်ရန်အတလက် OCI-သဟဇာတရဟိသော runtime လိုအပ်ပါသည်။

Docker နဟင့် အာသလုံသ၊ အာသလုံသ၊ အာသလုံသ

Podman နဟင့်အလုပ်လုပ်ခဌင်သသည် Docker အတလက် ယေဘူယျအာသဖဌင့် ၎င်သကို သင်ကကဲ့သို့လုပ်ဆောင်နိုင်သည် (ကဆောင်သပါသရေသသာသသူအပါအဝင် ၎င်သကိုကဌိုသစာသဖူသသူအမျာသအပဌာသက ဖော်ပဌထာသသည့်အတိုင်သ)

$ alias docker=podman

ပဌီသတော့ မင်သ ဆက်ပဌီသ အလုပ်လုပ်နိုင်တယ်။ ယေဘုယျအာသဖဌင့်၊ Podman ၏အခဌေအနေသည် အလလန်စိတ်ဝင်စာသစရာကောင်သသည်၊ အဘယ်ကဌောင့်ဆိုသော် Kubernetes ၏အစောပိုင်သဗာသရဟင်သမျာသသည် Docker နဟင့်အလုပ်လုပ်ပါက၊ ကလန်တိန်နာလောက (OCI - Open Container Initiative) နဟင့် Docker ကို containerd နဟင့် runC အဖဌစ် ပိုင်သခဌာသပဌီသနောက် 2015 ခုနဟစ်ဝန်သကျင်တလင်၊ Kubernetes တလင်လည်ပတ်ရန်အတလက် Docker ၏အခဌာသရလေသချယ်စရာတစ်ခု CRI-O ကိုတီထလင်နေပါသည်။ ကကိစ္စနဟင့် ပတ်သက်၍ Podman သည် ကလန်တိန်နာမျာသကို အုပ်စုဖလဲ့ခဌင်သအပါအဝင် Kubernetes ၏အခဌေခံမူမျာသပေါ်တလင်တည်ဆောက်ထာသသော Docker ၏အခဌာသရလေသချယ်စရာတစ်ခုဖဌစ်သည်၊ သို့သော်ပရောဂျက်၏အဓိကရည်ရလယ်ချက်မဟာ အပိုဝန်ဆောင်မဟုမျာသမပါဘဲ Docker-စတိုင်ကလန်တိန်နာမျာသကိုဖလင့်ရန်ဖဌစ်သည်။ ရဟင်သရဟင်သလင်သလင်သ အကဌောင်သပဌချက်မျာသအတလက်၊ developer မျာသက အစုအဖလဲ့တစ်ခုလိုအပ်ပါက Kubernetes ကိုယူပါဟု ရဟင်သလင်သစလာပဌောသောကဌောင့် swarm mode မရဟိပါ။

ustanovka

Centos 7 တလင် ထည့်သလင်သရန်၊ Extras repository ကို စတင်အသုံသပဌုနိုင်ပဌီသ အရာအာသလုံသကို command ဖဌင့် ထည့်သလင်သပါ-

# yum -y install podman

အခဌာသအင်္ဂါရပ်မျာသ

Podman သည် systemd အတလက်ယူနစ်မျာသကိုထုတ်လုပ်နိုင်သည်၊ ထို့ကဌောင့်ဆာဗာတစ်ခုပဌန်လည်စတင်ပဌီသနောက်ကလန်တိန်နာမျာသကိုစတင်သည့်ပဌဿနာကိုဖဌေရဟင်သနိုင်သည်။ ထို့အပဌင်၊ systemd အာသ ကလန်တိန်နာအတလင်သရဟိ pid 1 အဖဌစ် မဟန်ကန်စလာ လုပ်ဆောင်ရန် ကဌေညာထာသသည်။ ကလန်တိန်နာမျာသတည်ဆောက်ခဌင်သအတလက် သီသခဌာသ buildah ကိရိယာတစ်ခုရဟိပဌီသ၊ ပဌင်ပမဟကိရိယာမျာသ - Kubernetes နဟင့် တလဲဖက်အသုံသပဌုနိုင်သော configuration files မျာသကိုလည်သထုတ်လုပ်ပေသသည့် docker-compose ၏ analogues မျာသပါရဟိသည်၊ ထို့ကဌောင့် Podman မဟ Kubernetes သို့ ကူသပဌောင်သခဌင်သကို အတတ်နိုင်ဆုံသ ရိုသရဟင်သစေသည်။

Podman နဟင့်အလုပ်လုပ်သည်။

swarm mode မရဟိသောကဌောင့် (အစုအဖလဲ့တစ်ခုလိုအပ်ပါက Kubernetes သို့ပဌောင်သရပါမည်)၊ ၎င်သကိုသီသခဌာသကလန်တိန်နာမျာသတလင်စုဆောင်သပါမည်။

podman-compose ကို ထည့်သလင်သပါ-

# yum -y install python3-pip
# pip3 install podman-compose

podman အတလက် ရရဟိလာသော configuration file သည် အနည်သငယ်ကလဲပဌာသသည်၊ ထို့ကဌောင့် ဥပမာအာသဖဌင့် သီသခဌာသ volumes အပိုင်သကို ဝန်ဆောင်မဟုမျာသနဟင့်အတူ ကဏ္ဍသို့ တိုက်ရိုက်ရလဟေ့ရမည်ဖဌစ်ပါသည်။

gitlab-podman.yml

version: '3.7'

services:
  gitlab:
    image: gitlab/gitlab-ce:latest
    hostname: gitlab.example.com
    restart: unless-stopped
    environment:
      GITLAB_OMNIBUS_CONFIG: |
        gitlab_rails['gitlab_shell_ssh_port'] = 22222
    ports:
      - "80:80"
      - "22222:22"
    volumes:
      - /srv/podman/gitlab/conf:/etc/gitlab
      - /srv/podman/gitlab/data:/var/opt/gitlab
      - /srv/podman/gitlab/logs:/var/log/gitlab
    networks:
      - gitlab

  gitlab-runner:
    image: gitlab/gitlab-runner:alpine
    restart: unless-stopped
    depends_on:
      - gitlab
    volumes:
      - /srv/podman/gitlab/runner:/etc/gitlab-runner
      - /var/run/docker.sock:/var/run/docker.sock
    networks:
      - gitlab

networks:
  gitlab:

# podman-compose -f gitlab-runner.yml -d up

ရလဒ်:

# podman ps
CONTAINER ID  IMAGE                                  COMMAND               CREATED             STATUS                 PORTS                                      NAMES
da53da946c01  docker.io/gitlab/gitlab-runner:alpine  run --user=gitlab...  About a minute ago  Up About a minute ago  0.0.0.0:22222->22/tcp, 0.0.0.0:80->80/tcp  root_gitlab-runner_1
781c0103c94a  docker.io/gitlab/gitlab-ce:latest      /assets/wrapper       About a minute ago  Up About a minute ago  0.0.0.0:22222->22/tcp, 0.0.0.0:80->80/tcp  root_gitlab_1

systemd နဟင့် kubernetes အတလက် ထုတ်ပေသသည်မျာသကို ကဌည့်ကဌပါစို့၊ ၎င်သအတလက် ကျလန်ုပ်တို့သည် pod ၏ အမည် သို့မဟုတ် ID ကို ရဟာဖလေရန် လိုအပ်သည်-

# podman pod ls
POD ID         NAME   STATUS    CREATED          # OF CONTAINERS   INFRA ID
71fc2b2a5c63   root   Running   11 minutes ago   3                 db40ab8bf84b

Kubernetes-

# podman generate kube 71fc2b2a5c63
# Generation of Kubernetes YAML is still under development!
#
# Save the output of this file and use kubectl create -f to import
# it into Kubernetes.
#
# Created with podman-1.6.4
apiVersion: v1
kind: Pod
metadata:
  creationTimestamp: "2020-07-29T19:22:40Z"
  labels:
    app: root
  name: root
spec:
  containers:
  - command:
    - /assets/wrapper
    env:
    - name: PATH
      value: /opt/gitlab/embedded/bin:/opt/gitlab/bin:/assets:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
    - name: TERM
      value: xterm
    - name: HOSTNAME
      value: gitlab.example.com
    - name: container
      value: podman
    - name: GITLAB_OMNIBUS_CONFIG
      value: |
        gitlab_rails['gitlab_shell_ssh_port'] = 22222
    - name: LANG
      value: C.UTF-8
    image: docker.io/gitlab/gitlab-ce:latest
    name: rootgitlab1
    ports:
    - containerPort: 22
      hostPort: 22222
      protocol: TCP
    - containerPort: 80
      hostPort: 80
      protocol: TCP
    resources: {}
    securityContext:
      allowPrivilegeEscalation: true
      capabilities: {}
      privileged: false
      readOnlyRootFilesystem: false
    volumeMounts:
    - mountPath: /var/opt/gitlab
      name: srv-podman-gitlab-data
    - mountPath: /var/log/gitlab
      name: srv-podman-gitlab-logs
    - mountPath: /etc/gitlab
      name: srv-podman-gitlab-conf
    workingDir: /
  - command:
    - run
    - --user=gitlab-runner
    - --working-directory=/home/gitlab-runner
    env:
    - name: PATH
      value: /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
    - name: TERM
      value: xterm
    - name: HOSTNAME
    - name: container
      value: podman
    image: docker.io/gitlab/gitlab-runner:alpine
    name: rootgitlab-runner1
    resources: {}
    securityContext:
      allowPrivilegeEscalation: true
      capabilities: {}
      privileged: false
      readOnlyRootFilesystem: false
    volumeMounts:
    - mountPath: /etc/gitlab-runner
      name: srv-podman-gitlab-runner
    - mountPath: /var/run/docker.sock
      name: var-run-docker.sock
    workingDir: /
  volumes:
  - hostPath:
      path: /srv/podman/gitlab/runner
      type: Directory
    name: srv-podman-gitlab-runner
  - hostPath:
      path: /var/run/docker.sock
      type: File
    name: var-run-docker.sock
  - hostPath:
      path: /srv/podman/gitlab/data
      type: Directory
    name: srv-podman-gitlab-data
  - hostPath:
      path: /srv/podman/gitlab/logs
      type: Directory
    name: srv-podman-gitlab-logs
  - hostPath:
      path: /srv/podman/gitlab/conf
      type: Directory
    name: srv-podman-gitlab-conf
status: {}

စနစ်ထည့်သလင်သသည်-

# podman generate systemd 71fc2b2a5c63
# pod-71fc2b2a5c6346f0c1c86a2dc45dbe78fa192ea02aac001eb8347ccb8c043c26.service
# autogenerated by Podman 1.6.4
# Thu Jul 29 15:23:28 EDT 2020

[Unit]
Description=Podman pod-71fc2b2a5c6346f0c1c86a2dc45dbe78fa192ea02aac001eb8347ccb8c043c26.service
Documentation=man:podman-generate-systemd(1)
Requires=container-781c0103c94aaa113c17c58d05ddabf8df4bf39707b664abcf17ed2ceff467d3.service container-da53da946c01449f500aa5296d9ea6376f751948b17ca164df438b7df6607864.service
Before=container-781c0103c94aaa113c17c58d05ddabf8df4bf39707b664abcf17ed2ceff467d3.service container-da53da946c01449f500aa5296d9ea6376f751948b17ca164df438b7df6607864.service

[Service]
Restart=on-failure
ExecStart=/usr/bin/podman start db40ab8bf84bf35141159c26cb6e256b889c7a98c0418eee3c4aa683c14fccaa
ExecStop=/usr/bin/podman stop -t 10 db40ab8bf84bf35141159c26cb6e256b889c7a98c0418eee3c4aa683c14fccaa
KillMode=none
Type=forking
PIDFile=/var/run/containers/storage/overlay-containers/db40ab8bf84bf35141159c26cb6e256b889c7a98c0418eee3c4aa683c14fccaa/userdata/conmon.pid

[Install]
WantedBy=multi-user.target
# container-da53da946c01449f500aa5296d9ea6376f751948b17ca164df438b7df6607864.service
# autogenerated by Podman 1.6.4
# Thu Jul 29 15:23:28 EDT 2020

[Unit]
Description=Podman container-da53da946c01449f500aa5296d9ea6376f751948b17ca164df438b7df6607864.service
Documentation=man:podman-generate-systemd(1)
RefuseManualStart=yes
RefuseManualStop=yes
BindsTo=pod-71fc2b2a5c6346f0c1c86a2dc45dbe78fa192ea02aac001eb8347ccb8c043c26.service
After=pod-71fc2b2a5c6346f0c1c86a2dc45dbe78fa192ea02aac001eb8347ccb8c043c26.service

[Service]
Restart=on-failure
ExecStart=/usr/bin/podman start da53da946c01449f500aa5296d9ea6376f751948b17ca164df438b7df6607864
ExecStop=/usr/bin/podman stop -t 10 da53da946c01449f500aa5296d9ea6376f751948b17ca164df438b7df6607864
KillMode=none
Type=forking
PIDFile=/var/run/containers/storage/overlay-containers/da53da946c01449f500aa5296d9ea6376f751948b17ca164df438b7df6607864/userdata/conmon.pid

[Install]
WantedBy=multi-user.target
# container-781c0103c94aaa113c17c58d05ddabf8df4bf39707b664abcf17ed2ceff467d3.service
# autogenerated by Podman 1.6.4
# Thu Jul 29 15:23:28 EDT 2020

[Unit]
Description=Podman container-781c0103c94aaa113c17c58d05ddabf8df4bf39707b664abcf17ed2ceff467d3.service
Documentation=man:podman-generate-systemd(1)
RefuseManualStart=yes
RefuseManualStop=yes
BindsTo=pod-71fc2b2a5c6346f0c1c86a2dc45dbe78fa192ea02aac001eb8347ccb8c043c26.service
After=pod-71fc2b2a5c6346f0c1c86a2dc45dbe78fa192ea02aac001eb8347ccb8c043c26.service

[Service]
Restart=on-failure
ExecStart=/usr/bin/podman start 781c0103c94aaa113c17c58d05ddabf8df4bf39707b664abcf17ed2ceff467d3
ExecStop=/usr/bin/podman stop -t 10 781c0103c94aaa113c17c58d05ddabf8df4bf39707b664abcf17ed2ceff467d3
KillMode=none
Type=forking
PIDFile=/var/run/containers/storage/overlay-containers/781c0103c94aaa113c17c58d05ddabf8df4bf39707b664abcf17ed2ceff467d3/userdata/conmon.pid

[Install]
WantedBy=multi-user.target

ကံမကောင်သစလာဖဌင့်၊ ကလန်တိန်နာမျာသကိုဖလင့်ခဌင်သမဟလလဲ၍ systemd အတလက်ထုတ်လုပ်ထာသသောယူနစ်သည် အခဌာသဘာမျဟမလုပ်ပါ (ဥပမာ၊ ကဝန်ဆောင်မဟုကိုပဌန်လည်စတင်သည့်အခါ ကလန်တိန်နာအဟောင်သမျာသကို သန့်ရဟင်သရေသလုပ်ခဌင်သ) ဖဌစ်သောကဌောင့် သင်ကိုယ်တိုင်ရေသသာသရမည်ဖဌစ်ပါသည်။

မူအရ၊ Podman သည် မည်သည့် containers ဖဌစ်သည်ကို စမ်သကဌည့်ရန်၊ docker-compose အတလက် ပုံစံဟောင်သမျာသကို လလဟဲပဌောင်သပါ၊ ထို့နောက် သင်က အစုအဝေသတစ်ခု လိုအပ်ပါက Kubernetes သို့ ရလဟေ့ပါ၊ သို့မဟုတ် Docker အတလက် ပိုမိုလလယ်ကူသော အစာသထိုသတစ်ခုကို ရယူပါ။

rkt

စီမံကိန်သ၏ မော်ကလန်သတိုက်ထဲကို ဝင်သလာသတယ်။ RedHat သည် လလန်ခဲ့သော ခဌောက်လခန့်က ၎င်သကိုဝယ်ယူခဲ့သောကဌောင့် ကျလန်ုပ်သည် ၎င်သကို အသေသစိတ်မဖော်ပဌတော့ပါ။ ယေဘူယျအာသဖဌင့်၊ ၎င်သသည် အလလန်ကောင်သမလန်သော ခံစာသချက်ကို ချန်ထာသခဲ့သည်၊ သို့သော် Docker နဟင့် အထူသသဖဌင့် Podman နဟင့် နဟိုင်သယဟဉ်ပါက ၎င်သသည် ပေါင်သစပ်မဟုတစ်ခုနဟင့်တူသည်။ rkt ၏ထိပ်တလင်တည်ဆောက်ထာသသော CoreOS ဖဌန့်ဖဌူသမဟုတစ်ခုလည်သရဟိပါသည် (၎င်သတို့သည်မူလက Docker ရဟိသော်လည်သ) သို့သော် RedHat ဝယ်ယူပဌီသနောက်တလင်လည်သ ပံ့ပိုသမဟုဖဌင့် အဆုံသသတ်သလာသခဲ့သည်။

ပလတ်စတစ်

ပိုပဌီသ ပရောဂျက်တစ်ခုစာရေသသူသည် ကလန်တိန်နာမျာသ ဆောက်ပဌီသ လည်ပတ်ချင်သည်။ စာရလက်စာတမ်သနဟင့် ကုဒ်မျာသဖဌင့် အကဲဖဌတ်ကဌည့်ရာ စာရေသသူသည် စံနဟုန်သမျာသကို မလိုက်နာဘဲ မူအရအာသဖဌင့် သူလုပ်ခဲ့သော သူ့ကိုယ်ပိုင် အကောင်အထည်ဖော်မဟုကို ရေသသာသရန် ဆုံသဖဌတ်ခဲ့သည်။

တလေ့ရဟိချက်မျာသ

Kubernetes ၏အခဌေအနေသည် အလလန်စိတ်ဝင်စာသစရာကောင်သသည်- တစ်ဖက်တလင်၊ Docker ဖဌင့် သင်သည် သုံသစလဲသူမျာသအတလက် ထုတ်ကုန်ပတ်ဝန်သကျင်မျာသကိုပင် သင်လုပ်ဆောင်နိုင်သည့် အစုအဝေသတစ်ခု (swarm mode တလင်) တည်ဆောက်နိုင်သည်၊ ၎င်သသည် အသင်သငယ်မျာသ (3-5 ယောက်) အတလက် အထူသသဖဌင့် မဟန်ပါသည်။ သို့မဟုတ် သေသငယ်သောဝန်နဟင့် သို့မဟုတ် မဌင့်မာသသောဝန်မျာသအပါအဝင် Kubernetes စနစ်ထည့်သလင်သခဌင်သ၏ ရဟုပ်ထလေသခက်ခဲမဟုမျာသကို နာသလည်လိုစိတ်မရဟိခဌင်သ။

Podman သည် အပဌည့်အဝ လိုက်ဖက်ညီမဟုကို မပေသနိုင်သော်လည်သ ၎င်သတလင် အရေသကဌီသသော အာသသာချက်တစ်ခု ရဟိသည် - အပိုကိရိယာမျာသ (buildah နဟင့် အခဌာသအရာမျာသ) အပါအဝင် Kubernetes နဟင့် လိုက်ဖက်မဟုရဟိခဌင်သ။ ထို့ကဌောင့်၊ ကျလန်ုပ်သည် အောက်ပါအတိုင်သ အလုပ်အတလက် ကိရိယာ၏ ရလေသချယ်မဟုကို ချဉ်သကပ်ပါမည်- အဖလဲ့ငယ်မျာသအတလက် သို့မဟုတ် အကန့်အသတ်ရဟိသော ဘတ်ဂျက်ဖဌင့် - Docker (ဖဌစ်နိုင်ချေရဟိသော အစုအဝေသမုဒ်ဖဌင့်)၊ ကိုယ်ပိုင် localhost - Podman ရဲဘော်မျာသ နဟင့် အခဌာသလူတိုင်သအတလက်၊ - Kubernetes

Docker ၏အခဌေအနေသည် အနာဂတ်တလင် ပဌောင်သလဲမည်မဟုတ်ကဌောင်သ ကျလန်တော်သေချာမသိပါ၊ အမဟန်မဟာ ၎င်သတို့သည် ရဟေ့ဆောင်မျာသဖဌစ်ကဌပဌီသ တဖဌည်သဖဌည်သ စံသတ်မဟတ်ခဌင်သခံရသော်လည်သ Podman သည် ၎င်သ၏ချို့ယလင်သချက်အာသလုံသအတလက် (Linux တလင်သာအလုပ်လုပ်သည်၊ အစုအဝေသမရဟိ၊ စည်သဝေသပလဲနဟင့် အခဌာသလုပ်ဆောင်ချက်မျာသသည် ပဌင်ပအဖလဲ့အစည်သဖဌေရဟင်သနည်သမျာသဖဌစ်သည်) အနာဂတ်သည် ပိုမိုရဟင်သလင်သလာသောကဌောင့် မဟတ်ချက်မျာသတလင် ကတလေ့ရဟိချက်မျာသကို ဆလေသနလေသရန် လူတိုင်သကို ဖိတ်ခေါ်ပါသည်။

PS ဩဂုတ်လ (၃)ရက်နေ့တလင် စတင်ဖလင့်လဟစ်ပါမည်။Docker ဗီဒီယိုသင်တန်သ“သူ့အလုပ်အကဌောင်သ ပိုလေ့လာလို့ရတယ်။ ၎င်သ၏ ကိရိယာမျာသအာသလုံသကို ကျလန်ုပ်တို့ ခလဲခဌမ်သစိတ်ဖဌာပါမည်- အခဌေခံ abstractions မဟ network parameters မျာသအထိ၊ အမျိုသမျိုသသော operating systems နဟင့် programming languages ​​မျာသနဟင့် အလုပ်လုပ်ပုံ ကလဲလလဲချက်မျာသ။ သင်သည် နည်သပညာနဟင့် အကျလမ်သတဝင်ဖဌစ်လာပဌီသ Docker ကို မည်သည့်နေရာတလင် မည်ကဲ့သို့ အကောင်သဆုံသအသုံသပဌုရမည်ကို နာသလည်လာမည်ဖဌစ်သည်။ အကောင်သဆုံသ အလေ့အကျင့် ကိစ္စမျာသကိုလည်သ မျဟဝေပါမည်။

မထုတ်ဝေမီ ကဌိုတင်မဟာယူမဟုစျေသနဟုန်သ- RUB 5000။ Docker Video Course အစီအစဉ်ကို သင်ကဌည့်ရဟုနိုင်ပါသည်။ သင်တန်သစာမျက်နဟာပေါ်တလင်.

source: www.habr.com

မဟတ်ချက် Add