Иҷрои systemd дар як контейнер

Мо муддати тӯлонӣ мавзӯи истифодаи systemd дар контейнерҳоро пайгирӣ мекардем. Ҳанӯз дар соли 2014, муҳандиси амнияти мо Даниел Уолш мақола навишта буд Иҷрои systemd дар дохили контейнери Docker, ва якчанд сол пас - дигар, ки номида шуд Иҷрои systemd дар як контейнери имтиёзнок, ки дар он изхор намуд, ки вазъият чандон бехтар нашудааст. Аз ҷумла, ӯ навиштааст, ки "мутаассифона, ҳатто пас аз ду сол, агар шумо "системаи Docker" -ро дар Google ҷустуҷӯ кунед, аввалин чизе, ки ба миён меояд, ҳамон мақолаи кӯҳнаи ӯ аст. Пас, вақти он расидааст, ки чизеро тағир диҳед." Илова бар ин, мо аллакай дар бораи он сӯҳбат кардем ихтилофи байни Docker ва таҳиягарони systemd.

Иҷрои systemd дар як контейнер

Дар ин мақола мо нишон медиҳем, ки бо мурури замон чӣ тағир ёфтааст ва чӣ гуна Подман дар ин масъала ба мо кӯмак карда метавонад.

Сабабҳои зиёде барои иҷро кардани systemd дар дохили контейнер мавҷуданд, ба монанди:

  1. Контейнерҳои бисёрхизматӣ - бисёр одамон мехоҳанд, ки замимаҳои бисёрхизматрасонии худро аз мошинҳои виртуалӣ хориҷ кунанд ва онҳоро дар контейнерҳо иҷро кунанд. Албатта, беҳтар мебуд, ки чунин замимаҳо ба микросервисҳо тақсим карда шаванд, аммо на ҳама медонанд, ки чӣ тавр ин корро кардан мумкин аст ё танҳо вақт надорад. Аз ин рӯ, иҷро кардани чунин барномаҳо ба монанди хидматҳое, ки systemd аз файлҳои воҳид оғоз кардааст, комилан маъно дорад.
  2. Файлҳои воҳиди системавӣ - Аксари барномаҳое, ки дар дохили контейнер кор мекунанд, аз коде сохта шудаанд, ки қаблан дар мошинҳои виртуалӣ ё физикӣ кор мекарданд. Ин замимаҳо дорои файли воҳид мебошанд, ки барои ин барномаҳо навишта шудаанд ва мефаҳманд, ки чӣ гуна онҳо бояд оғоз шаванд. Аз ин рӯ, беҳтар аст, ки хидматҳоро бо истифода аз усулҳои дастгирӣшаванда оғоз кунед, на ин ки хидмати ибтидоии шахсии худро вайрон кунед.
  3. Systemd менеҷери раванд аст. Он хидматҳоро (хомӯш мекунад, хидматҳоро аз нав оғоз мекунад ё равандҳои зомбиро мекушад) беҳтар аз ҳама асбоби дигар идора мекунад.

Гуфта мешавад, сабабҳои зиёд барои кор накардани systemd дар контейнерҳо вуҷуд дорад. Муҳим он аст, ки systemd/journald баромади контейнерҳо ва асбобҳоро назорат мекунад Кубернитель ё кушодан интизор шавед, ки контейнерҳо гузоришро мустақиман ба stdout ва stderr нависед. Аз ин рӯ, агар шумо хоҳед, ки контейнерҳоро тавассути асбобҳои оркестрсозӣ, ба монанди асбобҳои дар боло зикршуда идора кунед, шумо бояд бо истифодаи контейнерҳои системавӣ ба таври ҷиддӣ фикр кунед. Илова бар ин, таҳиягарони Docker ва Moby аксар вақт ба истифодаи systemd дар контейнерҳо сахт муқобилат мекарданд.

Омадани Подман

Мо бо камоли хушнудӣ хабар медиҳем, ки вазъият ниҳоят пеш рафт. Гурӯҳе, ки барои идора кардани контейнерҳо дар Red Hat тасмим гирифт, ки таҳия кунад муҳаррики контейнерии худ. Ӯ ном гирифт Подман ва ҳамон интерфейси сатри фармонро (CLI) ҳамчун Docker пешниҳод мекунад. Ва тақрибан ҳамаи фармонҳои Docker метавонанд дар Podman ҳамин тавр истифода шаванд. Мо зуд-зуд семинархо мегузаронем, ки холо онхо ном доранд Тағир додани Docker ба Podman, ва аввалин слайд барои навиштан даъват мекунад: тахаллуси docker=podman.

Бисёр одамон ин корро мекунанд.

Ман ва Подмани ман ба ҳеҷ ваҷҳ муқобили контейнерҳои системавӣ нестем. Дар ниҳоят, Systemd зерсистемаи маъмултарин истифодашавандаи Linux мебошад ва иҷоза надодан ба он дар контейнерҳо дуруст кор кардан маънои онро надорад, ки чӣ гуна ҳазорон одамон ба идора кардани контейнерҳо одат кардаанд.

Подман медонад, ки чӣ бояд кард, то systemd дар як контейнер дуруст кор кунад. Он ба чизҳое ниёз дорад, ба монанди насб кардани tmpfs дар /run ва /tmp. Вай дӯст медорад, ки муҳити "контейнерӣ" фаъол бошад ва интизор аст, ки иҷозати навиштан ба қисми феҳристи гурӯҳҳо ва ҷузвдони /var/log/journald.

Вақте ки шумо контейнереро оғоз мекунед, ки дар он фармони аввал init ё systemd аст, Podman ба таври худкор tmpfs ва Cgroups-ро танзим мекунад, то боварӣ ҳосил кунад, ки systemd бе мушкилот оғоз мешавад. Барои бастани ин ҳолати худкор оғозёбӣ, имконоти --systemd=false -ро истифода баред. Лутфан таваҷҷӯҳ намоед, ки Podman танҳо режими systemd-ро истифода мебарад, вақте мебинад, ки ба он фармони systemd ё init лозим аст.

Ин аст иқтибос аз дастур:

марди подман давида
...

–systemd=true|false

Иҷро кардани контейнер дар реҷаи systemd. Бо нобаёнӣ фаъол карда шудааст.

Агар шумо фармони systemd ё init-ро дар дохили контейнер иҷро кунед, Podman нуқтаҳои васлкунии tmpfs-ро дар директорияҳои зерин танзим мекунад:

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

Инчунин сигнали қатъии пешфарз SIGRTMIN+3 хоҳад буд.

Ҳамаи ин ба systemd имкон медиҳад, ки дар як контейнери пӯшида бидуни тағирот кор кунад.

ЭЗОҲ: systemd кӯшиш мекунад, ки ба системаи файлии cgroup нависад. Аммо, SELinux ба таври нобаёнӣ контейнерҳоро аз иҷрои ин кор пешгирӣ мекунад. Барои фаъол кардани навиштан, параметри мантиқии container_manage_cgroup -ро фаъол созед:

setsebool -P container_manage_cgroup ҳақиқӣ

Акнун бубинед, ки Dockerfile барои иҷро кардани systemd дар контейнер бо Podman чӣ гуна аст:

# 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 мегӯем, ки ба systemd иҷозат диҳад, ки конфигуратсияи Cgroups-ро тағир диҳад:

# 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 кӯшиш накунед! Дар он ҷо ба шумо лозим меояд, ки бо даф рақс кунед, то ин гуна контейнерҳоро тавассути демон ба кор баред. (Барои он ки ҳамааш дар Docker бефосила кор кунад, майдонҳо ва бастаҳои иловагӣ талаб карда мешаванд, ё он бояд дар як контейнери имтиёзнок иҷро карда шавад. Барои тафсилот нигаред. мақола.)

Якчанд чизҳои ҷолиб дар бораи Podman ва systemd

Подман дар файлҳои воҳиди системавӣ нисбат ба Docker беҳтар кор мекунад

Агар ҳангоми боркунии система контейнерҳоро оғоз кардан лозим бошад, шумо метавонед танҳо фармонҳои мувофиқи Podman-ро ба файли воҳиди система гузоред, ки хидматро оғоз мекунад ва онро назорат мекунад. Подман модели стандартии fork-exec -ро истифода мебарад. Ба ибораи дигар, равандҳои контейнерӣ фарзандони раванди Подман мебошанд, аз ин рӯ systemd метавонад онҳоро ба осонӣ назорат кунад.

Docker модели муштарӣ-серверро истифода мебарад ва фармонҳои Docker CLI низ метавонанд мустақиман дар файли воҳид ҷойгир карда шаванд. Аммо, вақте ки муштарии Docker ба демони Docker пайваст мешавад, он (муштарӣ) танҳо як раванди дигари коркарди stdin ва stdout мегардад. Дар навбати худ, systemd дар бораи робитаи мизоҷи Docker ва контейнере, ки таҳти назорати демони Docker кор мекунад, тасаввуроте надорад ва аз ин рӯ, дар доираи ин модел, systemd аслан хидматро назорат карда наметавонад.

Фаъолсозии система тавассути розетка

Подман фаъолсозӣ тавассути розеткаро дуруст идора мекунад. Азбаски Podman модели fork-exec-ро истифода мебарад, он метавонад розеткаро ба равандҳои контейнерии кӯдаки худ интиқол диҳад. Docker ин корро карда наметавонад, зеро он модели муштарӣ-серверро истифода мебарад.

Хидмати varlink, ки Podman барои муошират бо мизоҷони дурдаст ба контейнерҳо истифода мебарад, воқеан тавассути розетка фаъол карда мешавад. Бастаи cockpit-podman, ки дар Node.js ва як қисми лоиҳаи кокпит навишта шудааст, ба одамон имкон медиҳад, ки тавассути интерфейси веб бо контейнерҳои Podman муошират кунанд. Веб-демоне, ки дар кокпит-подман кор мекунад, паёмҳоро ба васлаки varlink мефиристад, ки система онро гӯш мекунад. Сипас Systemd барномаи Podman-ро фаъол мекунад, то паёмҳоро қабул кунад ва идоракунии контейнерҳоро оғоз кунад. Фаъолсозии systemd тавассути розетка эҳтиёҷ ба демони доимӣ ҳангоми татбиқи API-ҳои дурдастро аз байн мебарад.

Илова бар ин, мо муштарии дигари Podman-ро бо номи podman-remote таҳия карда истодаем, ки ҳамон Podman CLI-ро амалӣ мекунад, аммо varlink-ро барои идора кардани контейнерҳо даъват мекунад. Podman-remote метавонад дар болои сеансҳои SSH кор кунад, ки ба шумо имкон медиҳад, ки бо контейнерҳо дар мошинҳои гуногун бехатар муошират кунед. Бо гузашти вақт, мо нақша дорем, ки podman-remote-ро барои дастгирии MacOS ва Windows дар баробари Linux фаъол созем, то таҳиягарон дар ин платформаҳо тавонанд мошини виртуалии Linux-ро бо Podman varlink кор кунанд ва аз таҷрибаи пурраи он, ки контейнерҳо дар мошини маҳаллӣ кор мекунанд, дошта бошанд.

SD_NOTIFY

Systemd ба шумо имкон медиҳад, ки оғози хидматҳои ёрирасонро то оғози хидмати контейнерии онҳо ба таъхир андозед. Подман метавонад васлаки SD_NOTIFY-ро ба хидмати контейнерӣ интиқол диҳад, то хидмат ба система огоҳ кунад, ки он ба кор омода аст. Ва боз, Docker, ки модели муштарӣ-серверро истифода мебарад, ин корро карда наметавонад.

Дар накшахо

Мо нақша дорем, ки фармони podman тавлиди systemd CONTAINERID-ро илова кунем, ки файли воҳиди системавиро барои идоракунии контейнери мушаххаси мушаххас тавлид мекунад. Ин бояд ҳам дар решавӣ ва ҳам решавӣ барои контейнерҳои беимтиёз кор кунад. Мо ҳатто дархостро барои вақти кории бо OCI мувофиқи systemd-nspawn дидем.

хулоса

Иҷрои systemd дар контейнер зарурати фаҳмо аст. Ва ба шарофати Podman, мо дар ниҳоят вақти кори контейнер дорем, ки бо systemd мухолифат намекунад, аммо истифодаи онро осон мекунад.

Манбаъ: will.com

Илова Эзоҳ