Ejecutar systemd dentro de un contenedor acoplable (arch linux)

12

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

Comienzo 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.

Intenta descubrir cómo iniciar las cosas correctamente en systemd comienza.

Michael Neale
fuente
La systemdpágina del manual sería un buen lugar para comenzar. Google también publica varios artículos sobre cómo ejecutar systemd en docker.
lanza el
¿Podría explicar por qué necesita systemd?
030

Respuestas:

4

Para ejecutar systemd en un contenedor Docker, el sistema host también debe ejecutar systemd. Esto significa que no puede usar Ubuntu como el host. En este momento, las únicas distribuciones de host que conozco de ese trabajo son Fedora (que, a diferencia de Ubuntu, tiene la última versión de Docker) o RHEL 7.

Michael Hampton
fuente
44
Arch Linux también usa systemd.
Jason Antman
8
ubuntu a partir del 16.04 usa systemd por defecto
Scott Stensland
4

Aquí mi pice maestro: D ejecutando systemd dentro de un contenedor docker con ubuntu: D Tengo Ubuntu trabajando con systemd dentro de docker

GitHub Repo 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 view
system logs, "systemctl reboot" to reboot, "systemctl default" or ^D to
try again to boot into default mode.
root@502ec40509a5:~# exit
google-frank-dspeed
fuente
66
Técnicamente esto funciona, pero tuvo que romper la seguridad del contenedor para hacerlo. Esto no es apropiado para una implementación de producción.
Michael Hampton
Hoy esto es posible más fácil con menos banderas de seguridad
google-frank-dspeed
2

Actualmente, systemd no se ejecuta correctamente dentro de un contenedor acoplable, debido a un conjunto completo de razones, es decir, la falta de los privilegios correctos. Puede leer sobre eso en una variedad de problemas de github en el proyecto de docker, como ejecutar systemd dentro de contenedores de archivadores de docker que se cuelgan o segfaults y problemas relacionados con la supervisión 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 algunos parches ya se han fusionado para mejorar el comportamiento, por lo que podemos esperar que esto funcione muy pronto.

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

Alexander Jung-Loddenkemper
fuente
2

Puede ejecutar systemd dentro de un contenedor acoplable. El sistema operativo host no importa, aunque necesitará 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/

Tony H
fuente
44
Bienvenido a ServerFault. En lugar de vincular a una solución, incluya los puntos esenciales de la misma aquí en su respuesta. De esa forma, su respuesta seguirá siendo útil si el objetivo del enlace desaparece.
Andrew Schulman
El artículo al que enlaza contiene información muy útil. Para que su respuesta sea completa, resuma sus principales consejos útiles (además de montar el host /sys/fs/cgroup, que ha mencionado).
Amir
Y aquí hay un artículo de seguimiento con más información útil: developers.redhat.com/blog/2016/09/13/…
Amir
1

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

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

Michael Neale
fuente
1

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

docker run -d \
    -v /sys/fs/cgroup:/sys/fs/cgroup:ro \
    --cap-add SYS_ADMIN \
    debian:jessie  /sbin/init
docker 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.

twildfarmer
fuente
1
systemctl show-environmentReutrns para mí Failed to get D-Bus connection: Unknown error -1. Cuando comienzo el contenedor con una --privilegedbandera en lugar de --cap-add SYS_ADMIN( docker run -d --privileged -v /sys/fs/cgroup:/sys/fs/cgroup:ro --name=ubuntu_systemd_test debian:jessie /sbin/init) systemctl responde como de costumbre
czerasz
@twildfarmer gracias. También para cualquiera que intente esto. Otro Dockerfile en el que esto se ha implementado es: syslog.me/2016/03/31/an-init-system-in-a-docker-container
Vivek Kodira
0

A partir de 2018, esto ahora funciona para mí: docker run -it -e container=docker your-image-name /sbin/init

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

Robin Green
fuente
¿Puedes dar detalles sobre qué imagen estás usando para esto? He probado Ubuntu, Debian, Arch, Alpine y OpenSUSE y ninguno de ellos funciona. O el binario no existe o init no puede abrir los recursos.
Código Bling