Em ji mêj ve mijara karanîna systemd di konteyneran de dişopînin. Di sala 2014-an de, endezyarê ewlehiya me Daniel Walsh gotarek nivîsî
Di vê gotarê de em ê nîşan bidin ku bi demê re çi guheriye û Podman çawa dikare di vê mijarê de alîkariya me bike.
Gelek sedem hene ku meriv pergalê di hundurê konteynerek de bimeşîne, wek:
- Konteynirên multiservice - Pir kes dixwazin serîlêdanên xwe yên pir-karûbar ji makîneyên virtual derxînin û wan di konteyneran de bimeşînin. Bê guman, çêtir e ku meriv serîlêdanên weha di nav mîkroservisan de bişkîne, lê her kes nizane hîna wiya çawa bike an jî tenê wextê wê tune. Ji ber vê yekê, xebitandina serîlêdanên weha wekî karûbarên ku ji hêla systemd ve ji pelên yekîneyê ve hatî destpêkirin watedar e.
- Pelên yekîneya pergalê - Piraniya serîlêdanên ku di hundurê konteyneran de têne xebitandin ji koda ku berê li ser makîneyên virtual an fizîkî dixebitin têne çêkirin. Van serlêdanan dosyayek yekîneyek heye ku ji bo van serlêdanan hatî nivîsandin û fam dike ku divê ew çawa werin destpêkirin. Ji ber vê yekê hîn çêtir e ku meriv karûbaran bi karanîna rêbazên piştgirîkirî dest pê bike, ne ji hackkirina karûbarê destpêkê ya xwe.
- Systemd rêveberê pêvajoyê ye. Ew karûbaran (diqede, karûbaran ji nû ve dide destpêkirin, an pêvajoyên zombî dikuje) ji her amûrek din çêtir birêve dibe.
Wê got, gelek sedem hene ku meriv pergala di konteyneran de nexebitîne. Ya sereke ev e ku systemd/rojname derketina konteyneran, û amûrên mîna wan kontrol dike
Hatina Podman
Em kêfxweş in ku radigihînin ku rewş di dawiyê de pêş ketiye. Tîma ku berpirsiyarê meşandina konteynerên li Red Hat biryar da ku pêşve bibe
Gelek kes vê yekê dikin.
Ez û Podmanê min bi tu awayî li dijî konteynerên bingehîn ên pergalê ne. Beriya her tiştî, Systemd bine-pergala destpêkê ya Linux-ê ya ku herî zêde tê bikar anîn e, û nehiştina ku ew bi rêkûpêk di konteyneran de bixebite tê vê wateyê ku meriv çawa bi hezaran kes bi xebitandina konteyneran fêr bûne.
Podman dizane ku çi bike da ku pergala di konteynerê de bi rêkûpêk bixebite. Pêdiviya wê bi tiştên mîna danîna tmpfs li ser /run û /tmp heye. Ew hez dike ku hawîrdora "konteynerkirî" çalak bike û li bendê ye ku bigihîje nivîsandina beşa xwe ya pelrêça cgroup û peldanka /var/log/journald.
Gava ku hûn konteynirek ku tê de fermana yekem init an systemd e dest pê dikin, Podman bixweber tmpfs û Cgroups mîheng dike da ku bicîh bike ku systemd bê pirsgirêk dest pê dike. Ji bo astengkirina vê moda destpêkirina otomatîkê, vebijarka --systemd=false bikar bînin. Ji kerema xwe not bikin ku Podman tenê moda pergalê bikar tîne dema ku dibîne ku ew hewce dike ku fermanek systemd an destpêkirinê bimeşîne.
Li vir perçeyek ji manualê ye:
man podman run
...–systemd=rast|derew
Di moda pergalê de konteynir dimeşîne. Ji hêla xwerû ve hatî çalak kirin.
Ger hûn di hundurê konteynir de fermanek systemd an init bimeşînin, Podman dê xalên mountê tmpfs di pelrêçikên jêrîn de mîheng bike:
/run, /run/lock, /tmp, /sys/fs/cgroup/systemd, /var/lib/journal
Di heman demê de sînyala rawestandina xwerû dê SIGRTMIN+3 be.
Hemî ev dihêle ku systemd bêyî guheztinan di konteynerek girtî de bixebite.
BİXWÎNE: systemd hewl dide ku li pergala pelê cgroup binivîse. Lêbelê, SELinux rê li ber konteyneran digire ku vê yekê ji hêla xwerû ve bikin. Ji bo çalakkirina nivîsandinê, parametreya boolean container_manage_cgroup çalak bike:
setsebool -P container_manage_cgroup rast
Naha binihêrin ka Dockerfile ji bo xebitandina pergala di konteynerek bi karanîna Podman re çawa xuya dike:
# cat Dockerfile
FROM fedora
RUN dnf -y install httpd; dnf clean all; systemctl enable httpd
EXPOSE 80
CMD [ "/sbin/init" ]
Navê pêger.
Niha em konteynerê kom dikin:
# podman build -t systemd .
Em ji SELinux re dibêjin ku destûrê bide systemd ku veavakirina Cgroups biguherîne:
# setsebool -P container_manage_cgroup true
Bi awayê, gelek kes vê gavê ji bîr dikin. Xweşbextane, ev tenê pêdivî ye ku carekê were kirin û mîheng piştî nûvekirina pergalê tê hilanîn.
Naha em tenê konteynerê dest pê dikin:
# 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.
Ew e, karûbar bi rê ve diçe û dimeşîne:
$ curl localhost
<html xml_lang="en" lang="en">
…
</html>
BİXWÎNE: Vê li ser Docker neceribîne! Li wir hûn hîn jî hewce ne ku bi tembûrê re dans bikin da ku hûn van celeb konteyneran bi navgîniya daemon vekin. (Dê zevî û pakêtên din hewce bibin ku ev hemî di Docker de bêkêmasî bixebite, an jî dê hewce bike ku ew di konteynirek îmtiyaz de were xebitandin. Ji bo hûrguliyan, binêre
Li ser Podman û pergalê çend tiştên din ên xweş
Podman di pelên yekîneya pergalê de ji Docker çêtir dixebite
Ger pêdivî ye ku konteynir gava ku pergalê boot dike dest pê bikin, wê hingê hûn dikarin bi tenê emrên Podman-ê yên guncan têxin nav pelê yekîneya systemd, ku dê karûbar dest pê bike û wê bişopîne. Podman modela standard fork-exec bikar tîne. Bi gotinek din, pêvajoyên konteyneran zarokên pêvajoya Podman in, ji ber vê yekê systemd bi hêsanî dikare wan bişopîne.
Docker modelek xerîdar-server bikar tîne, û fermanên Docker CLI jî dikarin rasterast di pelek yekîneyê de werin danîn. Lêbelê, gava ku xerîdar Docker bi daemonê Docker ve girêdide, ew (muwekîlê) dibe ku pêvajoyek din a stdin û stdout pêvajoyê dike. Di encamê de, systemd di derbarê pêwendiya di navbera xerîdar Docker û konteynera ku di bin kontrola daemonê Docker de dimeşe, ti ramanek tune, û ji ber vê yekê, di nav vê modelê de, systemd bi bingehîn nikare karûbarê bişopîne.
Sîstema bi rêya soketê çalak dike
Podman aktîvkirina bi riya soketê rast digire. Ji ber ku Podman modela fork-exec bikar tîne, ew dikare soketê bigihîne pêvajoyên konteynera zaroka xwe. Docker nikare vê yekê bike ji ber ku ew modelek xerîdar-server bikar tîne.
Karûbarê varlink ya ku Podman bikar tîne da ku bi xerîdarên dûr ve bi konteyneran re ragihîne bi rastî bi riya soketek ve tê çalak kirin. Pakêta cockpit-podman, ku di Node.js de hatî nivîsandin û beşek ji projeya kokpîtê ye, dihêle ku mirov bi navgînek tevnvî bi konteynerên Podman re têkilî daynin. Daemonê webê ku cockpit-podman dimeşîne, peyaman ji soketek varlinkê re dişîne ku systemd lê guhdarî dike. Systemd dûv re bernameya Podman çalak dike da ku peyaman bistîne û dest bi rêvebirina konteyneran bike. Çalakkirina pergala li ser soketek pêdivî ye ku dema ku API-yên ji dûr ve têne bicîh kirin hewcedariya damemonek bi domdarî dimeşîne ji holê radike.
Wekî din, em xerîdarek Podmanek din a bi navê podman-dûr pêşde diçin, ku heman Podman CLI bicîh tîne lê gazî varlink dike ku konteyneran bimeşîne. Podman-dûr dikare li ser danişînên SSH-ê bixebite, ku dihêle hûn bi ewlehî bi konteynerên li ser makîneyên cihêreng re têkilî daynin. Bi demê re, em plan dikin ku podman-dûr çalak bikin da ku MacOS û Windows ligel Linux-ê piştgirî bike, da ku pêşdebirên li ser wan platforman dikarin makîneyek virtual Linux ya ku bi Podman varlink ve tê xebitandin bimeşînin û xwedî ezmûnek bêkêmasî bin ku konteynir li ser makîneya herêmî dixebitin.
SD_NOTIFY
Systemd dihêle hûn destpêkirina karûbarên alîkar taloq bikin heya ku karûbarê konteyneran a ku ew hewce dike dest pê bike. Podman dikare soketa SD_NOTIFY bişîne karûbarê konteynirkirî da ku karûbar pergalê agahdar bike ku ew amade ye ku bixebite. Û dîsa, Docker, ku modela xerîdar-server bikar tîne, nikare vê yekê bike.
Di planan de
Em plan dikin ku emrê podman lê zêde bikin ku pergalad CONTAINERID biafirîne, ku dê pelek yekîneya pergalê biafirîne da ku konteynirek taybetî ya ku hatî destnîşan kirin birêve bibe. Pêdivî ye ku ev ji bo konteynerên bêdestûr hem di modên root û hem jî bê root de bixebite. Me tewra daxwazek ji bo dema xebitandina systemd-nspawn-ya hevgirtî ya OCI dîtiye.
encamê
Rêvekirina pergala di konteynerê de pêdivîyek têgihîştî ye. Û spas ji Podman re, di dawiyê de me demek xebitandina konteyneran heye ku bi systemd re nakokî nake, lê karanîna wê hêsan dike.
Source: www.habr.com