Запуск systemd всередині докерного контейнера (арка Linux)


12

Я намагаюся побачити, чи можу я запустити systemd всередині контейнера docker (який працює з аркою linux в контейнері).

Я запускаю докер з усіма можливостями і пов'язую монтування в групах:

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

однак, якщо я спробую запустити системний бінарний файл:

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

Починається спроба з'ясувати, як правильно запустити речі до систематизації.


Сторінка " systemdman" - це гарне місце для початку. Google також видає кілька статей про запуск системиdd під докером.
larsks

Чи можете ви пояснити, для чого вам потрібен systemd?
030

Відповіді:


4

Для запуску systemd в контейнері Docker, хост- система також повинна запускатися systemd. Це означає, що ви не можете використовувати Ubuntu в якості хоста. Наразі єдині дистрибутиви хостів, які я знаю про цю роботу, - це Fedora (який, на відміну від Ubuntu, має останню версію Docker) або RHEL 7.


4
Arch Linux також використовує systemd.
Джейсон Антман

8
ubuntu станом на 16.04 використовує systemd за замовчуванням
Scott Stensland

4

Ось моя головна піца: D працює systemd всередині контейнера докера з ubuntu: D Я отримав Ubuntu, що працює з systemd всередині докера

GitHub Repo для мого контейнера з докер-системою

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

Вихід:

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
Технічно це працює, але вам довелося порушити безпеку контейнера, щоб це зробити. Це не підходить для виробництва.
Майкл Хемптон

Сьогодні thuis можливий простіше з меншими прапорцями безпеки
google-frank-dspeed

2

Наразі systemd не працює належним чином у контейнері docker через цілу низку причин, тобто відсутність правильних привілеїв. Про це можна прочитати в різних питаннях github проекту docker, як, наприклад, запуск systemd всередині контейнера докерної арки висить або segfault і пов'язані з ними проблеми, пов'язані з моніторингом init / процесів. (Я хотів би пов’язати тут більше питань, але я не можу, оскільки я, мабуть, не маю достатньої репутації).

Як бачимо, це тема, над якою зараз працює, і кілька патчів вже об’єднано для покращення поведінки, так що ми можемо очікувати, що це спрацює зовсім скоро.

Мабуть, деякі розробники вже встигли змусити його працювати на системах Fedora, як вони задокументували у своєму блозі .


2

Можна запустити systemd всередині контейнера докера. Хост ОС не має значення, хоча вам потрібно буде встановити том / sys / fs / cgroup хосту. Я змусив її працювати, керуючись цим посібником: http://developerblog.redhat.com/2014/05/05/running-systemd-within-docker-container/


4
Ласкаво просимо до ServerFault. Замість того, щоб посилатися на рішення, будь-ласка, включіть сюди у свою відповідь основні моменти. Таким чином ваша відповідь все одно буде корисна, якщо ціль посилання відійде.
Ендрю Шульман

Стаття, на яку ви посилаєтесь, містить дуже корисну інформацію. Для того, щоб ваша відповідь була повною, будь ласка, узагальнюйте основні її корисні поради (окрім встановлення /sys/fs/cgroupзгаданого вами хоста ).
Амір

І ось подальша стаття з подальшою корисною інформацією: developers.redhat.com/blog/2016/09/13/…
Амір

1

Мені вдалося попрацювати назад: https://registry.hub.docker.com/u/codekoala/arch/

Docker 1.1 робить це простіше, оскільки групи (ro) вже надаються в контейнерах - мені все ще потрібен приватний доступ, щоб він міг створювати кріплення PrivateTmp, але в іншому випадку, якщо ви вказали cmd для запуску як системний бінарний файл - він працює добре.


1

Знайшов це питання під час спроби зробити це в офіційному контейнері debian: 8. Для всіх, хто намагається зробити це на офіційному контейнері debian: 8 (debian: jessie), @ Frank-from-DSPEED відповідь працює з незначною модифікацією, як описано в старій публікації 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

Потім з контейнера:

systemctl show-environment

Це прекрасно працює для мене, і оскільки це лише середовище розвитку, питання безпеки для мене не має значення.

Примітка: Команда / sbin / init отримує / sbin / init бути Процесом 1, який є ключовою частиною здійснення цієї роботи.


1
systemctl show-environmentreutrns для мене Failed to get D-Bus connection: Unknown error -1. Коли я запускаю контейнер із --privilegedпрапором замість --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 відповідає як зазвичай
czerasz

@twildfarmer дякую. Також для всіх, хто це намагається. Ще один Dockerfile, в який було реалізовано це: syslog.me/2016/03/31/an-init-system-in-a-docker-container
Vivek Kodira

0

Станом на 2018 рік, це зараз працює для мене: docker run -it -e container=docker your-image-name /sbin/init

Однак це не дасть вам оболонки, тому вам потрібно спочатку дозволити деяку системну службу (наприклад, sshd) усередині зображення, якщо цього ще не було зроблено, щоб зробити щось корисне.


Чи можете ви дати детальну інформацію про те, яке зображення ви використовуєте для цього? Я спробував Ubuntu, Debian, Arch, Alpine та OpenSUSE, і жоден з них не працює. Або двійковий файл не існує, або init не відкриває ресурси.
Кодифікація
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.