Tylko Docker? A może systemd-nspawn?

Docker to chyba dziś najczęściej wymieniana implementacja kontenerów w świecie Linuksa. Ale czy jedyna? Oczywiście, że nie. Jak zwykle świat Open Source oferuje dużą różnorodność. Dla przykładu zwróćmy uwagę na systemd – m. in. menedżer usług w RHEL7 – posiadający własną implementację kontenerów.

Rozwiązanie to działa przede wszystkim w oparciu izolację systemu plików (podobnie do „chroot”) oraz ścisłą integrację z systemd. Co ciekawe pierwotnym celem stworzenia kontenerów „nspawn” (spawn a namespace container) było… testowanie i rozwijanie samego systemd. My oczywiście możemy wykorzystać ten mechanizm do innych celów: testowanie innej wersji systemu operacyjnego lub oprogramowania.

Zobaczmy na przykładzie, jak to działa.

Powiedzmy, że korzystamy z Fedory 23 i chcemy uruchomić kontener z systemem Fedora 22. (działa dla Fedora Linux od wersji 19 do 23) W pierwszym kroku zbudujemy „dysk” tego kontenera:

# semanage fcontext -a -t svirt_sandbox_file_t '/var/lib/machines(/.*)?'
# dnf -y --releasever=22 --installroot=/var/lib/machines/fedora22 \
    --disablerepo='*' --enablerepo=fedora --enablerepo=updates \
    install systemd passwd dnf fedora-release vim-minimal
# restorecon -Rvv /var/lib/machines/

Zatem w katalogu /var/lib/machines/fedora22 mamy system plików Fedory 22. Teraz możemy uruchomić kontener (a w nim proces /bin/bash) i ustawić hasło administratora:

# systemd-nspawn -D /var/lib/machines/fedora22
Spawning container fedora22 on /var/lib/machines/fedora22.
Press ^] three times within 1s to kill container.
-bash-4.3# passwd
Changing password for user root.
New password: 
Retype new password: 
passwd: all authentication tokens updated successfully.
-bash-4.3# logout
Container fedora22 exited successfully.

Teraz możemy uruchomić kontener poprzez systemd:

# systemd-nspawn -b -D /var/lib/machines/fedora22
(...)
[  OK  ] Started Update UTMP about System Runlevel Changes.
[  OK  ] Started Cleanup of Temporary Directories.
[  OK  ] Started dnf makecache.
 
Fedora release 22 (Twenty Two)
Kernel 4.4.4-301.fc23.x86_64 on an x86_64 (console)
 
fedora22 login:

Warto wspomnieć wspomnieć, że do administracji kontenerami służy polecenie „machinectl”:

# machinectl list
MACHINE       CLASS SERVICE     
qemu-fedora22 vm    libvirt-qemu
1 machines listed.

Podsumowanie

Czy dziś nspawn może być poważną konkurencją dla Dockera? W tej chwili nie, ale otwartość kodu otwartego może przyspieszyć jego rozwój. A że jest on ściśle związany z samym systemem, to warto obserwować jego ewolucję.