Jak víme, ve výchozím nastavení kontejner Docker běží bez systemd
znamená, že uživatel nemůže používat systemctl
příkaz. Je to proto, že jakýkoli kontejner, který vytvoříme na Dockeru, nebyl zaveden pomocí init. Zde se naučíme, jak spustit Systemd v kontejnerech Alamlinux/Rocky Linux/CentOS 8 Docker.
No, otázka je, proč se nám zobrazuje chyba kdykoli spustíme systemctl
příkaz v jakémkoli kontejneru dockeru? Jaký je za tím důvod?
Ve skutečnosti, podle vývojářů Docker, které také doporučují, by člověk měl používat jednu službu uvnitř kontejneru. To znamená, že pokud plánujete nainstalovat WordPress pomocí kontejneru, měl by pro každou aplikaci existovat jeden kontejner. Například Apache + PHP na jednom kontejneru, zatímco MySQL na jiném. Proto byl Docker vyvinut na tomto modelu, což znamená, že není potřeba, aby Systemd, který najdeme v jakémkoli standardním linuxovém systému, řídil a spouštěl více služeb paralelně. Proto, jak Docker navrhuje spouštět více kontejnerů pro různé aplikace, proto vývojáři deaktivovali tohoto správce systémových procesů, aby zlepšili izolaci a zabezpečení kontejneru, to je důvod, proč se zobrazí chyba, kdykoli chceme použít systemctl
příkaz.
Tip – Co je Systemd?
Systemd je správce systému a relací (inicializace systému ), který je zodpovědný za správu všech služeb spuštěných v systému po celou dobu provozu počítače, od procesu spouštění až po vypnutí. Procesy jsou vždy spouštěny paralelně (v rámci možností), aby byl proces bootování co nejkratší.
Také systemd
je prvním procesem, který se spustí v systému Linux, proto spouštíme ps -aux
příkaz na libovolném linuxovém terminálu vidíme, že první proces (PID 1) je přidělen systemd
.
ps -aux
Na druhou stranu, když spustíte stejný příkaz uvnitř kontejneru, uvidíte PID (1) znamená, že první proces systému byl přidělen bash .
To je důvod, proč se chyba zobrazí pokaždé, když se pokusíte spustit nějakou službu v kontejneru Docker pomocí systemctl příkaz.
Instalovat nebo povolit systemd v kontejnerech Almalinux nebo Rocky Linux 8 Docker
Vytvořte soubor Docker
Existují určité příkazy, které musíme provést před vytvořením kontejneru pomocí Almalinuxu nebo Rockyho. Místo toho, abychom je spouštěli v jediném příkazu, pojďme je přidat do souboru dockeru, abychom vytvořili obrázek Docker s povoleným systemd
.
Vytvořte adresář řekněme ‘sysmd
‘ :
mkdir sysmd
přepněte na něj:
cd sysmd
Vytvoření souboru dockeru:
nano Dockerfile
Příkazy ke spuštění v souboru Docker pro získání Systemd
Nyní zkopírujte a vložte dané příkazy do souboru Docker:
Poznámka :Změňte almalinux
na rockylinux
, pokud chcete vytvořit Docker Image pro spuštění Rocky Linuxu.
Dané příkazy v souboru vytáhnou Docker Image (Almalinux nebo Rocky) a poté provedou následující příkaz včetně připojení svazku a příkazu potřebného k povolení Systemd. Také odstraníme některé soubory spojené se systemd, abychom povolili další služby, které v našem kontejneru Docker příkazového řádku nevyžadujeme.
Z almalinuxu ENV kontejner dockerRUN (cd /lib/systemd/system/sysinit.target.wants/; for i in; do [ $i ==systemd-tmpfiles-setup.service ] || rm -f $i; hotovo);RUN rm -rf /lib/systemd/system/multi-user.target.wants/ \&&rm -rf /etc/systemd/system/.wants/ \&&rm -rf /lib/systemd/system/local-fs.target. chce/ \&&rm -f /lib/systemd/system/sockets.target.wants/udev \&&rm -f /lib/systemd/system/sockets.target.wants/initctl \&&rm -rf /lib/systemd/ system/basic.target.wants/ \&&rm -f /lib/systemd/system/anaconda.target.wants/*VOLUME [ “/sys/fs/cgroup” ]CMD ["/usr/sbin/init"]
Uložte soubor stisknutím Ctrl+O stiskněte Enter a poté stiskněte Ctrl+X pro ukončení souboru.
Vytvoření souboru kontejneru Docker pomocí systemd
Nyní načteme a vytvoříme obraz kontejneru a přitom předáme příkazy zadané v souboru Docker. K tomu existuje příkaz s názvem-
docker build
a používáme totéž.docker build -t almalinux-md .Poznámka :Můžete změnit almalinux-md s jakýmkoli jménem, které chcete dát svému obrázku. A také nezapomeňte přidat tečku (. ), jak je uvedeno ve výše uvedeném příkazu, vede
build
příkaz k vyhledání souboru Docker v adresáři.Můžete vidět, že všechny příkazy zadané v souboru byly provedeny
docker build
vytvořit nový obrázek s názvem, který jste mu dali.
Výstup:
Odeslání kontextu sestavení do démona Docker 2,56 kB Krok 1/6 :Z almalinuxu ---> 4ca63ce1d8a9 Krok 2/6 :ENV kontejnerový docker ---> Spuštění v 57d447426e1a Odebrání mezilehlého kontejneru 57d447426e1a ---> 4ca63ce1d8a9 Krok 57d447426e1a 6 :RUN (cd /lib/systemd/system/sysinit.target.wants/; for i in; do [ $i ==systemd-tmpfiles-setup.service ] || rm -f $i; hotovo); ---> Spuštění v bc3b161040e6 Odebrání přechodného kontejneru bc3b161040e6 ---> 6f51cf56580e Krok 4/6 :SPUŠTĚTE rm -rf /lib/systemd/system/multi-user.target.wants/ &&rm -rf /etc /.wants/ &&rm -rf /lib/systemd/system/local-fs.target.wants/ &&rm -f /lib/systemd/system/sockets.target.wants/udev &&rm -f /lib/systemd/ system/sockets.target.wants/initctl &&rm -rf /lib/systemd/system/basic.target.wants/ &&rm -f /lib/systemd/system/anaconda.target.wants/* ---> Spuštěno 082cfe33fc89 Odebrání mezikontejneru 082cfe33fc89 ---> 9f8224491315 Krok 5/6 :VOLUME [ “/sys/fs/cgroup” ] ---> Krok zaběhnutí fe0177b04643 Vyjmutí 204b mezikontejneru 204b-1017 MD 21b"-1017 /usr/sbin/init"] ---> Spuštěno bff7b36d4964 Odebrání přechodného kontejneru bff7b36d4964 ---> 9b8dfd7c1d81 Úspěšně vytvořeno 9b8dfd7c1d81 Úspěšně označeno almalinux-md:latest
Vyhledejte vytvořený obrázek Almalinux nebo Rocky Linux
Nyní se podívejme, zda obrázek, který jsme tam vytvořili pro spuštění kontejnerů, nebo ne:
obrázky dockeru
Vytvořte nebo spusťte kontejner Docker pomocí systemd
Máme obrázek, který jsme právě vytvořili, pojďme ho použít k vytvoření kontejneru.
docker run -itd --privileged--name h2smedia almalinux-md
h2smedia
je hezké jméno, které chceme dát našemu kontejneru, zatímcoalmalinux-md
je název obrázku, který jsme vytvořili, nahraďte jej svým.Upozornění :Zde spouštíme kontejner s privilegovaným flag, to dodá kontejnerům extra sílu, jednoduše řečeno - kontejner bude mít práva nebo oprávnění root k hostitelskému počítači. Takové kontejnery obvykle používáme, když chceme poskytnout přímý přístup k hardwaru (hostitele) nebo chceme spustit kontejner uvnitř kontejneru. Proto se doporučuje nepoužívat takové kontejnery pro komerční nebo podnikové použití, kde k některým službám přistupují externí uživatelé. Vytvořte jej pouze pro vývojové nebo místní účely. To je důvod, proč jsme spustili výše uvedený příkaz s tímto příznakem, abychom mohli mít v našem kontejneru zařízení Systemd nebo init.
Přepnout na Container Bash
Nyní se podívejme na příkazový řádek kontejneru a zkontrolujeme, zda můžeme spustit
systemctl
příkaz nebo ne.
![]()
Nyní máte Docker Image s Systemd a to vám umožní vytvořit tolik kontejnerů, kolik chcete pro vývoj nebo testování místních aplikací.
Další výukové programy:
• Jak nainstalovat a nastavit Docker Container na AlmaLinux 8
• Jak vytvořit soubor servisní jednotky Systemd v Linuxu
• Analyzovat dobu spouštění systému Linux pomocí Systemd
Nainstalujte Centreon Monitoring na AlmaLinux 8 | Rocky Linux 8 Jak nainstalovat WordPress na AlmaLinux 8 | Rocky Linux 8Rocky Linux