z počátku jsem byl proti systemd init (o zbytku se teď nezmiňuji), nelíbilo se mi to, připadalo mi to složité, SysV podle mě dělal to stejné a ještě jsem nad tím měl kontrolu.
Dnes to hodnotím opačně, systemd init mám rád, líbí se mi v něm pracovat, využívám jeho výhody (sandbox, kontejnery, chroot, privatetmp, logování, alerty, validace, runtime kontrola), dobře se na to integrují další nástroje, služby a server je v determistickém stavu. Věci, pro které se začal používat docker najednou jdou dělat elegantněji v systemd přímo.
Za tuhle zprávu jsem rád, na WSL najednou bude fungovat řada věcí, které se teď musely obcházet.
Věci, pro které se začal používat docker najednou jdou dělat elegantněji v systemd přímo.
Nemáte nějaký příklad, prosím?
(?) Viděl jsem integraci např. supervisorctl do systemd místo instalace do kontejneru, ale to asi nebude tento případ, protože ten docker je tam kvůli dockerizovaným službám i tak potřeba.
Docker se v mnoha ohledech používá jako sandbox aplikace, jako oddělení aplikace od zbytku systému, v tom je systemd mnohem dál, viz pěkný souhrn např. na https://gist.github.com/ageis/f5595e59b1cddb1513d1b425a323db04, doal bych ještě věci jako DynamicUser=true, StateDirectory, ProtectHome=strict. Nemluvě o naprosto šílených výchozích pravidlech ve firewallu, který ho efektivně obchází.
Poté je docker oblíbený jako univerzální conteiner pro distribuci aplikací, to ale často není potřeba, máme tady pro python condu, která s sebou nese vše co může, nebo třeba nixos pro systémové balíčky. Zpravidla jsou ale aplikace v nějakém jazyku jako go, java, kde zabalení do taru a rozbalení zase tak velký problém nedělá. Poté nástroje v os jako lvm dávají možnost si vytvátřet partition pro každou revizi, mountovat je readonly, mít nad tím qouty, zfs umožňuje synchronizovat novou aplikaci ze vzdálenýho server a přenášet pouze rozdíly, mít readonly mount point a kontrolu integrity. Na to vše jsou již hotové nástroje, docker nás naopak nutí udělat úplně nové nástroje.
Pokud někdo přejímá cizí docker image a spouští je na produkci, pro toho asi radu nemám, max. že by to dělat neměl, že by takový image měl kontrolovat, že by ho měl aktualizovat a udržovat aktualizovaný, což ne vždy je snadné.
Primárně mluvím o systémových aplikacích typu ldap server, databáze a různé persistentní služby, naopak třeba webové aplikace s častou změnou se spíše vyplatí nechat v tom dockeru a využít nějakou infrastrukturu typu kubernetes, nomad nebo nějaký ten SASS.
Děkuji. Vím co je docker.
Primárně mluvím o systémových aplikacích typu ldap server, databáze a různé persistentní služby
Proto se na to ptám, protože docker taky poskytuje předkonfigurované balíky služeb - images (třeba ofic.), což systemd imho nedělá. K tomu poskytuje celkem pohodlný způsob jak služby routovat (netrvrdím že to jinak - manuálně - nejde). A to celé v podstatě oddělené od systému.
Zpravidla jsou ale aplikace v nějakém jazyku jako go, java, kde zabalení do taru a rozbalení zase tak velký problém nedělá.
To ale není jediný účel kontejneru - těmi je také předdefinované síťování, buildy i s dalšími službami jak např. zvláštní správce balíků, různé uložiště - automaticky. Samozřejmě že to jde zhákovat i ručně jakýmkoliv automatizátorem - i třeba Make ...
Takže kdybych to shrnul: systemd se ani tak nehodí jako náhrada Dockeru, ale umožňuje orchestrovat služby systému tak nějak, jako to dělá docker.
23. 9. 2022, 20:50 editováno autorem komentáře
@martinpoljak
... Docker hlavně poskytuje jakési "subsety"/obrazy různých služeb a knihoven a automatizuje jejich dekoraci, aniž by jakkoliv musely být svázané s hostem (host) a k tomu poskytuje infrastrukturu jako síť a uložiště, opět bez nutnosti všechno stavět sám v systému. systemd operuje výhradně(?) se službami (a zdroji) v hostujícím systému.
Srovnat systemd a docker je podle mě jako srovnat systemd a nějaký hypervisor - třeba Virtualbox. Ano, to není to samé co docker, ale logický rozdíl je to velmi podobný.
24. 9. 2022, 10:14 editováno autorem komentáře
systemd operuje výhradně(?) se službami (a zdroji) v hostujícím systému.
mozna mel na mysli systemd-nspawn coz je schopne poustet kontejnery podobne jako docker, v zasade to je takovy chroot na stereoidech, ovlada se to pak pres machinectl
navod viz treba https://wiki.debian.org/nspawn
26. 9. 2022, 12:41 editováno autorem komentáře
Jenomže velká část lidí ji řešit až v takové míře nepotřebuje. To je to. Já nehájím jedno ani druhé, ale když budu chtít pro vývoj rozjet nějaké kontejnery, Docker je ta úplně nejsnažší volba. A když už je mám na Dockeru při vývoji, stejně málokdy potřebuju něco moc jiného v produkci.
Je dobře, že existují různé nástroje pro řešení různých úloh, ale případy užití systemd a Dockeru se ani náhodou v plné šíři neprolínají. Jen z části a podle mého z části poměrně malé.
Já jsem se do toho pokoušel párkrát trochu proniknout jako admin strojů kde si uživatelé chtějí pouštět docker - zejména kvůli tomu že všude vždycky došlo k tomu že /var/lib/docker nabobtnalo do obrovských velikostí a nikde jsem nenašel jak člověk zjistí co kolik zabírá a co se může smazat - a zatím se mi to teda nepovedlo.
Dělá se to opačně – ne, že zjišťujete, co k čemu patří, ale necháte Docker smazat vše, co není potřeba. Podman umožňuje pomocí podman volume prune
smazat všechny používané volumes. podman rmi
umožňuje smazat obrazy, tam ale není žádný přepínač, který by smazal všechny nepoužívané. podman container prune
vymaže všechny zastavené kontejnery.
Reálně tedy nejdříve smažete nepoužívané kontejnery, pak volume, a pak případně i nepoužívané obrazy. Akorát pozor na to, a aby zrovna nějaký kontejner nebyl zastavený jen dočasně, případně aby nějaký volume nebyl jen dočasně nepřipojený, a nesmazaly se i ty.
Případně podman container inspect
vypíše ke konkrétnímu kontejneru informace ve formátu JSON, najdete tam které volumes se používají, na jakých obrazech je kontejner založený atd. Takže to se hodí pro případnou automatizaci.
Docker to bude mít podobně, Podman má nadmnožinu příkazů Dockeru.