Esecuzione di systemd all'interno di un contenitore docker (arch linux)


12

Sto cercando di vedere se riesco a eseguire systemd all'interno di un contenitore docker (che esegue arch linux nel contenitore).

Inizio la finestra mobile con tutte le funzionalità e associo mount in cgroups:

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

tuttavia, se provo a eseguire il binario systemd:

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

Si tenta di scoprire come avviare correttamente le cose su systemd.


La systemdpagina man sarebbe un buon punto di partenza. Google produce anche diversi articoli su come eseguire systemd sotto la finestra mobile.
Larks

Potresti spiegare perché hai bisogno di systemd?
030

Risposte:


4

Per eseguire systemd in un contenitore Docker, anche il sistema host deve eseguire systemd. Questo significa che non puoi usare Ubuntu come host. Al momento le uniche distribuzioni host che conosco di quel lavoro sono Fedora (che, a differenza di Ubuntu, ha l'ultima versione di Docker) o RHEL 7.


4
Arch Linux utilizza anche systemd.
Jason Antman,

8
Ubuntu a partire dal 16.04 usa systemd di default
Scott Stensland

4

Qui il mio pice principale: D che esegue systemd all'interno di un contenitore docker con Ubuntu: D Ho Ubuntu che funziona con systemd all'interno della finestra mobile

GitHub Repo per il mio contenitore docker-systemd

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

Produzione:

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

6
Tecnicamente funziona, ma per farlo è necessario interrompere la sicurezza del contenitore. Questo non è appropriato per una distribuzione di produzione.
Michael Hampton

Oggi thuis è possibile più facilmente con meno bandiere di sicurezza
google-frank-dspeed

2

Attualmente systemd non funziona correttamente all'interno di un contenitore docker, a causa di una serie di motivi, ovvero la mancanza dei privilegi corretti. Puoi leggerlo in una varietà di problemi di github sul progetto docker come l' esecuzione di systemd all'interno del contenitore dell'arco docker si blocca o segfault e problemi correlati riguardanti il ​​monitoraggio di init / processo. (Vorrei collegare più problemi qui, ma non posso, poiché apparentemente non ho abbastanza reputazione).

Come puoi vedere, questo è un argomento su cui si sta attualmente lavorando e alcune patch sono già state unite per migliorare il comportamento, quindi possiamo aspettarci che funzioni molto presto.

Apparentemente alcuni sviluppatori sono già riusciti a farlo funzionare su sistemi Fedora, come hanno documentato nel loro blog .


2

È possibile eseguire systemd all'interno di un contenitore finestra mobile. Il sistema operativo host non ha importanza, sebbene sia necessario montare il volume / sys / fs / cgroup dell'host. Ho funzionato seguendo questa guida: http://developerblog.redhat.com/2014/05/05/running-systemd-within-docker-container/


4
Benvenuti in ServerFault. Invece di collegarti a una soluzione, includi i punti essenziali di essa qui nella tua risposta. In questo modo la tua risposta sarà comunque utile se la destinazione del link scompare.
Andrew Schulman,

L'articolo a cui ti colleghi contiene informazioni molto utili. Affinché la tua risposta sia completa, ti preghiamo di riassumere i suoi principali consigli utili (oltre a montare l'host /sys/fs/cgroup, che hai menzionato).
Amir,

Ed ecco un articolo di follow-up con ulteriori informazioni utili: developers.redhat.com/blog/2016/09/13/…
Amir

1

Sono stato in grado di lavorare all'indietro da questo: https://registry.hub.docker.com/u/codekoala/arch/

Docker 1.1 rende tutto più semplice poiché i gruppi (ro) sono già forniti in contenitori - al momento ho ancora bisogno dell'accesso priv per poter creare montaggi PrivateTmp, ma altrimenti, purché specifichi il cmd da eseguire come binario systemd - funziona bene.


1

Ho trovato questa domanda mentre cercavo di farlo nel debian: 8 container ufficiale. Per chiunque cerchi di farlo sul debian ufficiale: 8 (debian: jessie) container, la risposta di @ Frank-from-DSPEED funziona con una leggera modifica come descritto in un vecchio post di 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

Quindi dal contenitore:

systemctl show-environment

Questo funziona perfettamente per me e poiché questo è solo un ambiente di sviluppo, il problema di sicurezza non mi interessa.

Nota: il comando / sbin / init fa diventare / sbin / init il processo 1, che è una parte fondamentale per farlo funzionare.


1
systemctl show-environmentribadisce per me Failed to get D-Bus connection: Unknown error -1. Quando avvio il contenitore con una --privilegedbandiera anziché --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 risponde come al solito
czerasz

@twildfarmer grazie. Anche per chiunque lo provi. Un altro file Docker in cui questo è stato implementato è: syslog.me/2016/03/31/an-init-system-in-a-docker-container
Vivek Kodira,

0

A partire dal 2018, questo ora funziona per me: docker run -it -e container=docker nome-tua-immagine /sbin/init

Questo non ti darà una shell, tuttavia, quindi dovrai prima abilitare alcuni servizi di systemd (ad esempio sshd) all'interno dell'immagine se ciò non è già stato fatto, per fare qualcosa di utile.


Puoi fornire dettagli su quale immagine stai usando per questo? Ho provato Ubuntu, Debian, Arch, Alpine e OpenSUSE e nessuno di loro funziona. Il binario non esiste o init non riesce ad aprire le risorse.
Codebling
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.