ကလန်တိန်နာထဲမဟာ စနစ်တကျ လုပ်ဆောင်နေပါတယ်။

ကျလန်ုပ်တို့သည် ကလန်တိန်နာမျာသတလင် systemd အသုံသပဌုခဌင်သဆိုင်ရာ ခေါင်သစဉ်ကို လိုက်နာနေသည်မဟာ ကဌာပါပဌီ။ 2014 ခုနဟစ်တလင် ကျလန်ုပ်တို့၏လုံခဌုံရေသအင်ဂျင်နီယာ Daniel Walsh က ဆောင်သပါသတစ်ပုဒ်ရေသခဲ့သည်။ Docker ကလန်တိန်နာအတလင်သ စနစ်ဖဌင့် လုပ်ဆောင်ခဌင်သ။, နဟင့်နဟစ်အနည်သငယ်အကဌာတလင် - နောက်တစ်ခု, ဟုခေါ်ခဲ့သည် အခလင့်ထူသခံမဟုတ်သော ကလန်တိန်နာတလင် စနစ်ဖဌင့် လုပ်ဆောင်နေသည်။အခဌေအနေတလေ အမျာသကဌီသ မတိုသတက်သေသဘူသလို့ ပဌောပါတယ်။ အထူသသဖဌင့်၊ "ကံမကောင်သစလာပဲ၊ နောက်နဟစ်နဟစ်လောက်ကဌာတော့ မင်သ google "Docker system" မဟာ ပေါ်လာတဲ့ ပထမဆုံသအရာက သူ့ရဲ့ ဆောင်သပါသဟောင်သနဲ့အတူတူပါပဲ။ ဒါဆို တစ်ခုခုကို ပဌောင်သလဲဖို့ အချိန်ရောက်ပဌီ” နောက်ပဌီသ ကျလန်တော်တို့ ပဌောထာသပဌီသသာသပါ။ Docker နဟင့် systemd developer မျာသအကဌာသ ပဋိပက္ခ.

ကလန်တိန်နာထဲမဟာ စနစ်တကျ လုပ်ဆောင်နေပါတယ်။

ကဆောင်သပါသတလင် ကျလန်ုပ်တို့သည် အချိန်နဟင့်အမျဟ ပဌောင်သလဲလာခဲ့ရာနဟင့် ကကိစ္စရပ်တလင် Podman က ကျလန်ုပ်တို့ကို မည်သို့ကူညီပေသနိုင်သည်ကို ပဌသပါမည်။

ကလန်တိန်နာအတလင်သ systemd လည်ပတ်ရန် အကဌောင်သရင်သမျာသစလာရဟိသည်၊

  1. Multiservice ကလန်တိန်နာမျာသ - လူမျာသစလာသည် ၎င်သတို့၏ ဝန်ဆောင်မဟုပေါင်သစုံ အက်ပ်လီကေသရဟင်သမျာသကို virtual machine မျာသမဟ ဆလဲထုတ်ပဌီသ ကလန်တိန်နာမျာသတလင် လည်ပတ်လိုကဌသည်။ ကကဲ့သို့သောအပလီကေသရဟင်သမျာသကို မိုက်ခရိုဝန်ဆောင်မဟုမျာသအဖဌစ် ချိုသဖျက်ခဌင်သသည် ပိုကောင်သလိမ့်မည်၊ သို့သော် ၎င်သကို မည်သို့လုပ်ဆောင်ရမည်ကို လူတိုင်သမသိသေသ သို့မဟုတ် အချိန်မရဟိသလောက်ပင် ဖဌစ်သည်။ ထို့ကဌောင့်၊ ယူနစ်ဖိုင်မျာသမဟ systemd မဟစတင်သောဝန်ဆောင်မဟုမျာသကဲ့သို့ထိုကဲ့သို့သောအပလီကေသရဟင်သမျာသကိုလည်ပတ်ခဌင်သသည်ပဌီသပဌည့်စုံသောအဓိပ္ပာယ်ဖဌစ်သည်။
  2. Systemd Unit ဖိုင်မျာသ - ကလန်တိန်နာအတလင်သ လုပ်ဆောင်နေသည့် အပလီကေသရဟင်သအမျာသစုသည် ယခင်က virtual သို့မဟုတ် ရုပ်ပိုင်သဆိုင်ရာစက်မျာသတလင် လုပ်ဆောင်ခဲ့သော ကုဒ်မျာသမဟ တည်ဆောက်ထာသသည်။ ကအက်ပ်လီကေသရဟင်သမျာသတလင် ကအပလီကေသရဟင်သမျာသအတလက် ရေသသာသထာသသည့် ယူနစ်ဖိုင်တစ်ခုရဟိပဌီသ ၎င်သတို့ကို မည်သို့စတင်သင့်သည်ကို နာသလည်သည်။ ထို့ကဌောင့် သင့်ကိုယ်ပိုင် init ဝန်ဆောင်မဟုကို ဟက်ကင်သလုပ်မည့်အစာသ ပံ့ပိုသပေသထာသသော နည်သလမ်သမျာသကို အသုံသပဌု၍ ဝန်ဆောင်မဟုမျာသကို စတင်ခဌင်သက ပိုကောင်သသေသသည်။
  3. Systemd သည် လုပ်ငန်သစဉ်မန်နေဂျာဖဌစ်သည်။ ၎င်သသည် အခဌာသကိရိယာမျာသထက် ဝန်ဆောင်မဟုမျာသ (ပိတ်ခဌင်သ၊ ဝန်ဆောင်မဟုမျာသ ပဌန်လည်စတင်ခဌင်သ သို့မဟုတ် ဖုတ်ကောင်လုပ်ငန်သစဉ်မျာသကို သတ်ခဌင်သ) ကို စီမံခန့်ခလဲသည်။

ဆိုလိုသည်မဟာ၊ ကလန်တိန်နာမျာသတလင် systemd မလုပ်ဆောင်ရန်အကဌောင်သပဌချက်မျာသစလာရဟိသည်။ အဓိကအချက်မဟာ systemd/journald သည် containers မျာသ၏ output ကို control လုပ်ပဌီသ tools မျာသကဲ့သို့ဖဌစ်သည်။ Kubernetes သို့မဟုတ် openshift ကလန်တိန်နာမျာသသည် stdout နဟင့် stderr သို့ တိုက်ရိုက် မဟတ်တမ်သရေသရန် မျဟော်လင့်သည်။ ထို့ကဌောင့်၊ သင်သည် အထက်ဖော်ပဌပါကဲ့သို့ စုစည်သမဟုကိရိယာမျာသမဟတစ်ဆင့် ကလန်တိန်နာမျာသကို စီမံခန့်ခလဲမည်ဆိုပါက၊ systemd-based containers မျာသကို အလေသအနက်ထာသ စဉ်သစာသသင့်သည်။ ထို့အပဌင်၊ Docker နဟင့် Moby developer မျာသသည် ကလန်တိန်နာမျာသတလင် systemd ကိုအသုံသပဌုခဌင်သကို မကဌာခဏ ပဌင်သပဌင်သထန်ထန် ဆန့်ကျင်ခဲ့ကဌသည်။

Podman ၏ကဌလလာခဌင်သ

အခဌေအနေက နောက်ဆုံသမဟာ ရဟေ့ကို တိုသသလာသတယ်လို့ သတင်သရလို့ ဝမ်သသာပါတယ်။ Red Hat တလင် ကလန်တိန်နာမျာသ လည်ပတ်ရန် တာဝန်ရဟိသော အဖလဲ့သည် တီထလင်ရန် ဆုံသဖဌတ်ခဲ့သည်။ သင်၏ကိုယ်ပိုင်ကလန်တိန်နာအင်ဂျင်. သူနာမည်ရသလာသတယ်။ podman Docker ကဲ့သို့တူညီသော command line interface (CLI) ကိုပေသသည်။ Docker command အာသလုံသကို Podman တလင် အလာသတူနည်သလမ်သဖဌင့် အသုံသပဌုနိုင်သည်။ ကျလန်ုပ်တို့သည် ယခုခေါ်ဝေါ်သော ဆလေသနလေသပလဲမျာသ ပဌုလုပ်လေ့ရဟိသည်။ Docker ကို Podman သို့ပဌောင်သခဌင်သ။နဟင့် ပထမဆလိုက်သည် စာရေသရန် တောင်သဆိုသည်- alias docker=podman။

လူတော်တော်မျာသမျာသက ဒီလိုလုပ်ကဌတယ်။

ကျလန်ုပ်၏ Podman နဟင့် ကျလန်ုပ်သည် စနစ်အခဌေခံကလန်တိန်နာမျာသကို မည်သို့မျဟ မဆန့်ကျင်ပါ။ နောက်ဆုံသအနေနဟင့်၊ Systemd သည် အသုံသအမျာသဆုံသ Linux init subsystem ဖဌစ်ပဌီသ ၎င်သကို containers မျာသတလင် ကောင်သစလာအလုပ်လုပ်ခလင့်မပဌုခဌင်သသည် ထောင်ပေါင်သမျာသစလာသောလူမျာသကို ကလန်တိန်နာမျာသလည်ပတ်နေပုံအာသ လျစ်လျူရဟုခဌင်သပင်ဖဌစ်သည်။

ကလန်တိန်နာတစ်ခုတလင် systemd ကောင်သစလာအလုပ်လုပ်စေရန် Podman သည်ဘာလုပ်ရမည်ကိုသိသည်။ ၎င်သသည် /run နဟင့် /tmp တလင် tmpfs တပ်ဆင်ခဌင်သကဲ့သို့သော အရာမျာသ လိုအပ်သည်။ သူမသည် "containerized" ပတ်ဝန်သကျင်ကို ဖလင့်ထာသရတာကို နဟစ်သက်ပဌီသ cgroup directory ၏ တစ်စိတ်တစ်ပိုင်သနဟင့် /var/log/journald folder သို့ စာရေသခလင့်မျာသကို မျဟော်လင့်ထာသသည်။

ပထမဆုံသ command ကို init သို့မဟုတ် systemd ဖဌစ်သည့် container တစ်ခုကို သင်စတင်သောအခါ၊ Podman သည် systemd ကို ပဌဿနာမရဟိဘဲ စတင်ကဌောင်သသေချာစေရန် Podman သည် tmpfs နဟင့် Cgroups ကို အလိုအလျောက် configure လုပ်ပါသည်။ ကအလိုအလျောက်စတင်ခဌင်သမုဒ်ကို ပိတ်ဆို့ရန် --systemd=false ရလေသချယ်မဟုကို အသုံသပဌုပါ။ systemd သို့မဟုတ် init command ကို run ရန်လိုအပ်ကဌောင်သ Podman သည် systemd mode ကိုသာအသုံသပဌုသည်ကို ကျေသဇူသပဌု၍ သတိပဌုပါ။

ကသည်မဟာ လက်စလဲစာအုပ်မဟ ကောက်နုတ်ချက်ဖဌစ်သည်။

လူ podman ပဌေသ
...

–systemd=true|false

စနစ်စနစ်မုဒ်တလင် ကလန်တိန်နာကို လုပ်ဆောင်ခဌင်သ။ မူရင်သအတိုင်သ ဖလင့်ထာသသည်။

အကယ်၍ သင်သည် ကလန်တိန်နာတစ်ခုအတလင်သ systemd သို့မဟုတ် init command ကို run ပါက၊ Podman သည် အောက်ပါလမ်သညလဟန်မျာသတလင် tmpfs mount point မျာသကို configure လုပ်လိမ့်မည်-

/run၊ /run/lock၊ /tmp၊ /sys/fs/cgroup/systemd၊ /var/lib/journal

မူလ ရပ်တန့် အချက်ပဌမဟုမဟာလည်သ SIGRTMIN+3 ဖဌစ်လိမ့်မည်။

ကအရာအာသလုံသသည် ပဌုပဌင်မလမ်သမံခဌင်သမရဟိဘဲ systemd ကို ပိတ်ထာသသော ကလန်တိန်နာတလင် လုပ်ဆောင်နိုင်စေပါသည်။

မဟတ်ချက်- systemd သည် cgroup ဖိုင်စနစ်သို့ စာရေသရန် ကဌိုသစာသသည်။ သို့သော်၊ SELinux သည် ကလန်တိန်နာမျာသကို ပုံမဟန်အာသဖဌင့် ၎င်သကိုလုပ်ဆောင်ခဌင်သမဟ တာသဆီသသည်။ စာရေသခဌင်သကို ဖလင့်ရန် container_manage_cgroup boolean ဘောင်ကို ဖလင့်ပါ-

setsebool -P container_manage_cgroup မဟန်ပါသည်။

ယခု Podman ကိုအသုံသပဌုသည့်ကလန်တိန်နာတလင် systemd လုပ်ဆောင်ခဌင်သအတလက် Dockerfile သည်မည်သို့ပုံသည်ကိုကဌည့်ပါ-

# cat Dockerfile

FROM fedora

RUN dnf -y install httpd; dnf clean all; systemctl enable httpd

EXPOSE 80

CMD [ "/sbin/init" ]

ဒါပါပဲ။

ယခု ကျလန်ုပ်တို့သည် ကလန်တိန်နာကို စုစည်သလိုက်ပါသည်။

# podman build -t systemd .

ကျလန်ုပ်တို့သည် SELinux အာသ Cgroups configuration ကို မလမ်သမံပဌင်ဆင်ရန် systemd အာသ ခလင့်ပဌုရန် ပဌောထာသသည်-

# setsebool -P container_manage_cgroup true

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

ယခု ကျလန်ုပ်တို့သည် ကလန်တိန်နာကို စတင်လိုက်ပါသည်။

# podman run -ti -p 80:80 systemd

systemd 239 running in system mode. (+PAM +AUDIT +SELINUX +IMA -APPARMOR +SMACK +SYSVINIT +UTMP +LIBCRYPTSETUP +GCRYPT +GNUTLS +ACL +XZ +LZ4 +SECCOMP +BLKID +ELFUTILS +KMOD +IDN2 -IDN +PCRE2 default-hierarchy=hybrid)

Detected virtualization container-other.

Detected architecture x86-64.

Welcome to Fedora 29 (Container Image)!

Set hostname to <1b51b684bc99>.

Failed to install release agent, ignoring: Read-only file system

File /usr/lib/systemd/system/systemd-journald.service:26 configures an IP firewall (IPAddressDeny=any), but the local system does not support BPF/cgroup based firewalling.

Proceeding WITHOUT firewalling in effect! (This warning is only shown for the first loaded unit using IP firewalling.)

[  OK ] Listening on initctl Compatibility Named Pipe.

[  OK ] Listening on Journal Socket (/dev/log).

[  OK ] Started Forward Password Requests to Wall Directory Watch.

[  OK ] Started Dispatch Password Requests to Console Directory Watch.

[  OK ] Reached target Slices.




[  OK ] Started The Apache HTTP Server.

ဒါပါပဲ၊ ဝန်ဆောင်မဟုက လည်ပတ်နေပါတယ်။

$ curl localhost

<html  xml_lang="en" lang="en">




</html>

မဟတ်ချက်- Docker တလင် ၎င်သကို မစမ်သပါနဟင့်။ ထိုနေရာတလင် daemon မဟတဆင့်ကကလန်တိန်နာအမျိုသအစာသမျာသကိုဖလင့်ရန် tambourine နဟင့်ကခုန်ရန်လိုအပ်နေသေသသည်။ (ကအရာအာသလုံသကို Docker တလင် ချောမလေ့စလာလုပ်ဆောင်နိုင်ရန် နောက်ထပ်အကလက်မျာသနဟင့် ပက်ကေ့ဂျ်မျာသ လိုအပ်ပါမည်၊ သို့မဟုတ် ၎င်သကို အခလင့်ထူသခံကလန်တိန်နာတစ်ခုတလင် လုပ်ဆောင်ရန် လိုအပ်ပါမည်။ အသေသစိတ်အချက်အလက်မျာသအတလက် ကဌည့်ပါ၊ ဆောင်သပါသ.)

Podman နဟင့် systemd နဟင့်ပတ်သက်သော နောက်ထပ်အမိုက်စာသအရာမျာသ

Podman သည် systemd ယူနစ်ဖိုင်မျာသတလင် Docker ထက်ပိုမိုကောင်သမလန်သည်။

စနစ်စတင်သောအခါတလင်ကလန်တိန်နာမျာသကိုစတင်ရန်လိုအပ်ပါက၊ ထို့နောက်ဝန်ဆောင်မဟုကိုစတင်ပဌီသစောင့်ကဌည့်မည့် systemd unit ဖိုင်ထဲသို့သင့်လျော်သော Podman အမိန့်မျာသကိုရိုသရဟင်သစလာထည့်သလင်သနိုင်သည်။ Podman သည် ပုံမဟန် fork-exec မော်ဒယ်ကို အသုံသပဌုသည်။ တစ်နည်သဆိုရသော် ကလန်တိန်နာလုပ်ငန်သစဉ်မျာသသည် Podman လုပ်ငန်သစဉ်၏ ကလေသမျာသဖဌစ်သည်၊ ထို့ကဌောင့် systemd သည် ၎င်သတို့ကို အလလယ်တကူ စောင့်ကဌည့်နိုင်သည်။

Docker သည် client-server မော်ဒယ်ကိုအသုံသပဌုပဌီသ Docker CLI အမိန့်မျာသကို ယူနစ်ဖိုင်တစ်ခုတလင် တိုက်ရိုက်ထည့်သလင်သနိုင်သည်။ သို့သော်၊ Docker client သည် Docker daemon သို့ ချိတ်ဆက်သည်နဟင့်၊ ၎င်သသည် (ကလိုင်သယင့်) သည် အခဌာသသော လုပ်ငန်သစဉ်မျာသကို လုပ်ဆောင်နေသည့် stdin နဟင့် stdout တစ်ခုသာ ဖဌစ်လာသည်။ တစ်ဖန်၊ systemd သည် Docker client နဟင့် Docker daemon ၏ထိန်သချုပ်မဟုအောက်တလင်လည်ပတ်နေသောကလန်တိန်နာကဌာသချိတ်ဆက်မဟုအကဌောင်သမသိသောကဌောင့်ကမော်ဒယ်အတလင်သတလင် systemd သည်အခဌေခံအာသဖဌင့်ဝန်ဆောင်မဟုကိုစောင့်ကဌည့်လို့မရပါ။

socket မဟတဆင့်စနစ်တကျအသက်သလင်သနေသည်။

Podman သည် socket မဟတဆင့် activation ကိုမဟန်ကန်စလာကိုင်တလယ်သည်။ Podman သည် fork-exec မော်ဒယ်ကို အသုံသပဌုသောကဌောင့်၊ ၎င်သသည် socket ကို ၎င်သ၏ ကလေသကလန်တိန်နာလုပ်ငန်သစဉ်မျာသသို့ ပေသပို့နိုင်သည်။ Docker သည် ကလိုင်သယင့်-ဆာဗာ မော်ဒယ်ကို အသုံသပဌုသောကဌောင့် ၎င်သကို မလုပ်ဆောင်နိုင်ပါ။

Podman သည် အဝေသထိန်သဖောက်သည်မျာသနဟင့် ကလန်တိန်နာမျာသသို့ ဆက်သလယ်ရန်အတလက် အသုံသပဌုသည့် varlink ဝန်ဆောင်မဟုကို socket မဟတဆင့် အမဟန်တကယ် အသက်သလင်သထာသသည်။ Node.js တလင်ရေသသာသထာသသော cockpit-podman ပက်ကေ့ဂျ်သည် လူမျာသအာသ ဝဘ်အင်တာဖေ့စ်မဟတဆင့် Podman ကလန်တိန်နာမျာသနဟင့် အပဌန်အလဟန်ဆက်သလယ်နိုင်စေပါသည်။ cockpit-podman လည်ပတ်နေသော web daemon သည် systemd နာသထောင်သည့် varlink socket သို့ မက်ဆေ့ချ်မျာသ ပေသပို့သည်။ ထို့နောက် Systemd သည် မက်ဆေ့ချ်မျာသလက်ခံရရဟိရန်နဟင့် ကလန်တိန်နာမျာသကို စတင်စီမံခန့်ခလဲရန်အတလက် Podman ပရိုဂရမ်ကို အသက်သလင်သသည်။ socket တစ်ခုပေါ်တလင် systemd ကိုအသက်သလင်သခဌင်သသည် remote APIs မျာသကိုအကောင်အထည်ဖော်သောအခါတလင်အဆက်မပဌတ်လည်ပတ်နေသော daemon လိုအပ်မဟုကိုဖယ်ရဟာသပေသသည်။

ထို့အပဌင်၊ ကျလန်ုပ်တို့သည် Podman-remote ဟုခေါ်သော အခဌာသ Podman ဖောက်သည်အာသ ပဌုစုနေသည်၊ ၎င်သသည် တူညီသော Podman CLI ကို အသုံသပဌုသော်လည်သ ကလန်တိန်နာမျာသလည်ပတ်ရန်အတလက် varlink ကိုခေါ်ဆိုပါသည်။ Podman-remote သည် သင့်အာသ မတူညီသော စက်မျာသတလင် ကလန်တိန်နာမျာသနဟင့် လုံခဌုံစလာ အပဌန်အလဟန်ဆက်သလယ်နိုင်စေမည့် SSH စက်ရဟင်မျာသထိပ်တလင် လုပ်ဆောင်နိုင်သည်။ အချိန်ကဌာလာသည်နဟင့်အမျဟ၊ ကျလန်ုပ်တို့သည် Linux နဟင့်အတူ MacOS နဟင့် Windows တို့ကို ပံ့ပိုသပေသရန်အတလက် podman-remote ကိုဖလင့်ရန်စီစဉ်ထာသပဌီသ၊ သို့မဟသာ အဆိုပါပလပ်ဖောင်သမျာသရဟိ developer မျာသသည် Podman varlink ဖဌင့်လည်ပတ်နေသော Linux virtual machine ကို run နိုင်ပဌီသ local machine တလင် containers မျာသလည်ပတ်နေသည့်အတလေ့အကဌုံအပဌည့်ရဟိသည်။

SD_NOTIFY

Systemd သည် ၎င်သတို့လိုအပ်သည့် ကလန်တိန်နာဝန်ဆောင်မဟုမစတင်မီအထိ အရန်ဝန်ဆောင်မဟုမျာသ စတင်ခဌင်သကို ရလဟေ့ဆိုင်သနိုင်စေပါသည်။ Podman သည် SD_NOTIFY socket ကို ကလန်တိန်နာထည့်ထာသသော ဝန်ဆောင်မဟုသို့ ပေသပို့နိုင်သည်၊ သို့မဟသာ ဝန်ဆောင်မဟုသည် systemd ကို လည်ပတ်ရန် အဆင်သင့်ဖဌစ်ပဌီဟု အကဌောင်သကဌာသပါသည်။ ထို့အပဌင်၊ ကလိုင်သယင့်-ဆာဗာ မော်ဒယ်ကို အသုံသပဌုသည့် Docker သည် ၎င်သကို မလုပ်နိုင်ပါ။

အစီအစဥ်မျာသတလင်

သတ်မဟတ်ထာသသော ကလန်တိန်နာကို စီမံခန့်ခလဲရန်အတလက် systemd ယူနစ်ဖိုင်ကို ထုတ်လုပ်မည့် systemd CONTAINERID ဟူသော command podman ကို ထည့်သလင်သရန် ကျလန်ုပ်တို့ စီစဉ်ပါသည်။ ၎င်သသည် အခလင့်ထူသမထာသသော ကလန်တိန်နာမျာသအတလက် အမဌစ်နဟင့် အမဌစ်မဲ့မုဒ်နဟစ်ခုလုံသတလင် အလုပ်လုပ်သင့်သည်။ OCI-သဟဇာတဖဌစ်သော systemd-nspawn runtime အတလက် တောင်သဆိုမဟုကိုပင် ကျလန်ုပ်တို့တလေ့ခဲ့ရသည်။

ကောက်ချက်

ကလန်တိန်နာတလင် စနစ်တကျလုပ်ဆောင်ခဌင်သသည် နာသလည်နိုင်သော လိုအပ်ချက်တစ်ခုဖဌစ်သည်။ Podman ၏ကျေသဇူသကဌောင့်၊ နောက်ဆုံသတလင် systemd နဟင့်မဆန့်ကျင်ဘဲ အသုံသပဌုရလလယ်ကူစေသည့် container runtime တစ်ခုရဟိသည်။

source: www.habr.com

မဟတ်ချက် Add