Pergala di konteynerê de diherike

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î Pergala di hundurê konteynirek Docker de dimeşîne, û çend sal şûnda - ya din, ku jê re tê gotin Pergala di konteynirek ne-îmtiyaz de dimeşîne, û tê de diyar kir ku rewş zêde baştir nebûye. Bi taybetî, wî nivîsî ku "mixabin, du sal şûnda jî, heke hûn "pergala Docker" google bikin, yekem tiştê ku derdikeve heman gotara wî ya kevn e. Ji ber vê yekê dem hatiye ku tiştek were guhertin.” Ji bilî vê, me berê jî li ser axivî nakokiya di navbera Docker û pêşdebirên pergalê de.

Pergala di konteynerê de diherike

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:

  1. 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.
  2. 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.
  3. 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 Kubernetes an openshift li bendê bin ku konteynir rasterast li stdout û stderr têketinê binivîsin. Ji ber vê yekê, heke hûn diçin ku konteyneran bi navgîniya amûrên orkestrayê yên mîna yên ku li jor hatine destnîşan kirin rêvebirin, divê hûn bi giranî li ser karanîna konteynerên-based systemd bifikirin. Wekî din, pêşdebirên Docker û Moby bi gelemperî li dijî karanîna systemd di konteyneran de ne.

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 motora konteynerê xwe. Navekî wî girt podman û heman navbeynkariya xeta fermanê (CLI) wekî Docker pêşkêşî dike. Hema hema hemî fermanên Docker dikarin di Podman de bi heman rengî werin bikar anîn. Em gelek caran semîneran li dar dixin, ku niha tê gotin Guhertina Docker li Podman, û slideya yekem ji bo nivîsandinê bang dike: nasnav docker=podman.

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 gotara.)

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

Add a comment