Executando systemd dentro de um contêiner de docker (arch linux)

12

Estou tentando ver se consigo executar o systemd dentro de um contêiner do docker (que está executando o arch linux no contêiner).

Inicio o docker com todos os recursos e vinculo mount no cgroups:

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

no entanto, se eu tentar executar o binário systemd:

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

Tentando descobrir como iniciar as coisas corretamente para iniciar o systemd.

Michael Neale
fonte
A systemdpágina de manual seria um bom lugar para começar. O Google também produz vários artigos sobre a execução do systemd no docker.
Larsks
Você poderia explicar por que precisa do systemd?
030

Respostas:

4

Para executar o systemd em um contêiner do Docker, o sistema host também deve executar o systemd. Isso significa que você não pode usar o Ubuntu como host. No momento, as únicas distribuições de host que conheço desse trabalho são o Fedora (que, diferentemente do Ubuntu, tem a versão mais recente do Docker) ou o RHEL 7.

Michael Hampton
fonte
4
O Arch Linux também usa systemd.
Jason Antman
8
ubuntu partir de 16.04 usos systemd por padrão
Scott Stensland
4

Aqui está minha principal dica: D executando o systemd dentro de um contêiner de docker com o ubuntu: D Eu tenho o Ubuntu trabalhando com o systemd dentro do docker

Repositório do GitHub para meu contêiner docker-systemd

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

Resultado:

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
fonte
6
Tecnicamente, isso funciona, mas você precisava quebrar a segurança do contêiner para fazer isso. Isso não é apropriado para uma implantação de produção.
Michael Hampton
Hoje thuis é possível mais fácil com menos bandeiras de segurança
google-frank-dspeed
2

Atualmente, o systemd não funciona corretamente em um contêiner de docker, devido a um conjunto de razões, ou seja, à falta dos privilégios corretos. Você pode ler sobre isso em uma variedade de problemas do github no projeto do docker, como executar systemd dentro de travamentos do container docker arch ou segfaults e problemas relacionados ao monitoramento de processo / inicialização. (Gostaria de vincular mais problemas aqui, mas não posso, pois aparentemente não tenho reputação suficiente).

Como você pode ver, este é um tópico que está sendo trabalhado no momento e alguns patches já foram mesclados para melhorar o comportamento, para que possamos esperar que isso funcione em breve.

Aparentemente, alguns desenvolvedores já conseguiram executá-lo em sistemas fedora, como documentaram em seu blog .

Alexander Jung-Loddenkemper
fonte
2

Você pode executar o systemd dentro de um contêiner de docker. O sistema operacional host não importa, embora você precise montar o volume / sys / fs / cgroup do host. Eu consegui funcionar seguindo este guia: http://developerblog.redhat.com/2014/05/05/running-systemd-within-docker-container/

Tony H
fonte
4
Bem-vindo ao ServerFault. Em vez de vincular a uma solução, inclua os pontos essenciais aqui na sua resposta. Dessa forma, sua resposta ainda será útil se o destino do link desaparecer.
Andrew Schulman
O artigo ao qual você vincula contém informações muito úteis. Para que sua resposta seja completa, resuma suas principais dicas acionáveis ​​(além de montar as do host /sys/fs/cgroupque você mencionou).
Amir
E aqui está um artigo de acompanhamento com mais informações úteis: developers.redhat.com/blog/2016/09/13/…
Amir
1

Eu pude trabalhar de trás para frente com isso: https://registry.hub.docker.com/u/codekoala/arch/

O Docker 1.1 facilita isso, pois o groups (ro) já é fornecido em contêineres - ainda preciso de acesso privado para criar montagens PrivateTmp, mas, caso contrário, desde que você especifique o cmd a ser executado como o binário systemd - ele funciona bem.

Michael Neale
fonte
1

Encontrei esta pergunta ao tentar fazer isso no contêiner oficial debian: 8. Para qualquer outra pessoa que tente fazer isso no contêiner oficial debian: 8 (debian: jessie), a resposta do @ Frank-from-DSPEED funciona com uma pequena modificação, conforme descrito em um post antigo do 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

Em seguida, no contêiner:

systemctl show-environment

Isso funciona perfeitamente para mim e, como esse é apenas um ambiente de desenvolvimento, o problema de segurança não importa para mim.

Nota: O comando / sbin / init faz com que / sbin / init seja o Processo 1, que é uma parte essencial para fazer esse trabalho.

twildfarmer
fonte
1
systemctl show-environmentreutrns para mim Failed to get D-Bus connection: Unknown error -1. Quando eu iniciar o recipiente com uma --privilegedbandeira em vez 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) responde systemctl como de costume
czerasz
@twildfarmer obrigado. Também para quem mais tenta isso. Outra Dockerfile que este foi implementado em é: syslog.me/2016/03/31/an-init-system-in-a-docker-container
Vivek Kodira
0

A partir de 2018, isso agora funciona para mim: docker run -it -e container=docker your-image-name /sbin/init

No entanto, isso não fornecerá um shell, portanto, você deverá primeiro habilitar algum serviço systemd (por exemplo, sshd) dentro da imagem, se isso ainda não tiver sido feito, para fazer algo útil.

Robin Green
fonte
Você pode fornecer detalhes sobre qual imagem você está usando para isso? Eu tentei o Ubuntu, Debian, Arch, Alpine e OpenSUSE e nenhum deles funciona. O binário não existe ou o init falha ao abrir recursos.
Code Bling