Ejecución de systemd dentro de un contenedor docker (arch linux)

Estoy tratando de ver si puedo ejecutar systemd dentro de un contenedor docker (que ejecuta arch linux en el contenedor).

Inicio docker con todas las capacidades y enlazo mount en cgroups:

docker run -it --rm --privileged -v /sys/fs/cgroup:/sys/fs/cgroup:ro ..

sin embargo, si intento ejecutar el binario systemd:

Trying to run as user instance, but the system has not been booted with systemd.

Tratando de averiguar cómo iniciar las cosas correctamente en systemd se inicia.

Aquí mi pieza maestra: D ejecutando systemd dentro de un contenedor docker con ubuntu: DI Consiguió que Ubuntu trabajara con systemd dentro de docker

Repositorio de GitHub para mi contenedor docker-systemd

$ docker run -it --cap-add SYS_ADMIN -v /sys/fs/cgroup:/sys/fs/cgroup:ro dockerimages/docker-systemd

Salida:

systemd 218 running in system mode. (+PAM +AUDIT +SELINUX +IMA +APPARMOR +SMACK +SYSVINIT +UTMP +LIBCRYPTSETUP +GCRYPT -GNUTLS +ACL +XZ -LZ4 -SECCOMP +BLKID -ELFUTILS +KMOD -IDN)Detected virtualization 'docker'.Detected architecture 'x86-64'.Welcome to Ubuntu Vivid Vervet (development branch)!Set hostname to <502ec40509a5>.[  OK  ] Created slice Root Slice.[  OK  ] Created slice System Slice.         Starting Emergency Shell...[  OK  ] Started Emergency Shell.Startup finished in 5ms.Welcome to emergency mode! After logging in, type "journalctl -xb" to viewsystem logs, "systemctl reboot" to reboot, "systemctl default" or ^D totry again to boot into default mode.root@502ec40509a5:~# exit

Actualización 2021

Se enviaron muchos parches a diferentes proyectos como los repositorios de docker upstream por REDHAT.To para ser más claros, mi hermano David Walsh @ REDHAT también publicó mucho sobre eso.https://developers.redhat.com/blog/author/rhatdan/.

La ejecución de SystemD Sin Privilegios adicionales requiere

/run como un tmpfs./sys/fs/cgroup solo lectura./sys/fs/cgroup/systemd lectura / escritura./etc/machine-id Necesita contener un ID de máquina únicoSIGRTMIN+3 como stopsignal como sigterm no funcionará/var/log/journal Si no existe, escribirá en la memoria

docker run -d \     --tmpfs /tmp \    --tmpfs /run \    -v /sys/fs/cgroup:/sys/fs/cgroup:ro \    --stop-signal SIGRTMIN+3 \    httpd /sbin/init

Nota: El indicador Stopsignal se puede soltar cuando el dockerfile contiene STOPSIGNAL SIGRTMIN+3

Ver el Post completo. https://developers.redhat.com/blog/2016/09/13/running-systemd-in-a-non-privileged-container/

Nota: Hoy con Podman esto sería aún más simple, lea sobre esto aquí:https://developers.redhat.com/blog/2019/04/24/how-to-run-systemd-in-a-container/

Para ejecutar systemd en un contenedor Docker, el host el sistema también debe ejecutar systemd. Esto significa que no puede usar Ubuntu < 16.04 como host.

Actualmente, systemd no se ejecuta correctamente dentro de un contenedor docker, debido a una serie de razones, es decir, la falta de los privilegios correctos. Puede leer sobre eso en una variedad de problemas de github en el proyecto docker como la ejecución de systemd dentro del contenedor docker arch se bloquea o se segfaults y problemas relacionados con el monitoreo de inicio/proceso. (Me gustaría vincular más problemas aquí, pero no puedo, ya que aparentemente no tengo suficiente reputación).

Como puede ver, este es un tema en el que se está trabajando actualmente y ya se han fusionado algunos parches para mejorar el comportamiento, por lo que podemos esperar que esto funcione bastante pronto.

Aparentemente, algunos desarrolladores ya lograron que se ejecutara en sistemas fedora, como lo han documentado en su blog.

A partir de 2018, esto ahora funciona para mí: docker run -it -e container=docker tu-nombre-de-imagen /sbin/init

Sin embargo, esto no le dará un shell, por lo que primero deberá habilitar algún servicio de systemd (por ejemplo, sshd) dentro de la imagen si aún no se ha hecho, para hacer algo útil.

Encontré esta pregunta al intentar hacer esto en el contenedor oficial debian:8.Para cualquier otra persona que intente hacer esto en el contenedor oficial debian:8 (debian:jessie), la respuesta de @Frank-from-DSPEED funciona con una ligera modificación como se describe en una publicación antigua de git hub:

docker run -d \    -v /sys/fs/cgroup:/sys/fs/cgroup:ro \    --cap-add SYS_ADMIN \    debian:jessie  /sbin/initdocker exec -it <your-new-container-name-or-ID> bash

Luego, desde el contenedor:

systemctl show-environment

Esto funciona perfectamente para mí y, dado que este es solo un entorno de desarrollo, el problema de seguridad no me importa.

Nota: El comando/sbin /init hace que/sbin / init sea el Proceso 1, que es una parte clave para que esto funcione.

Pude trabajar hacia atrás a partir de esto: https://registry.hub.docker.com/u/codekoala/arch/

Docker 1.1 hace que esto sea más fácil ya que los grupos (ro) ya se proporcionan en los contenedores; actualmente, todavía necesito acceso priv para que pueda crear montajes PrivateTmp, pero de lo contrario, siempre que especifique el cmd que se ejecutará como el binario systemd, funciona bien.

Puede ejecutar systemd dentro de un contenedor docker. El sistema operativo del host no importa, aunque deberá montar el volumen /sys/fs/cgroup del host. Lo hice funcionar siguiendo esta guía: http://developerblog.redhat.com/2014/05/05/running-systemd-within-docker-container/

La página de manual ‘systemd’ sería un buen lugar para comenzar. Google también ofrece varios artículos sobre la ejecución de systemd en docker.