Запуск systemd внутри Docker-контейнера (Arch Linux)


12

Я пытаюсь выяснить, могу ли я запустить systemd внутри контейнера докера (который запускает arch linux в контейнере).

Я запускаю docker со всеми возможностями и связываю mount в cgroups:

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

однако, если я попытаюсь запустить бинарный файл systemd:

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

Попытка выяснить, как правильно инициировать вещи для запуска systemd.


systemdСтраница людей будет хорошее место для начала. Google также публикует несколько статей о запуске systemd под Docker.
Жаворонки

Не могли бы вы объяснить, почему вам нужен systemd?
030

Ответы:


4

Чтобы запустить systemd в контейнере Docker, хост- система также должна запустить systemd. Это означает, что вы не можете использовать Ubuntu в качестве хоста. В настоящее время я знаю только о дистрибутивах хостов Fedora (в отличие от Ubuntu, имеющей последнюю версию Docker) или RHEL 7.


4
Arch Linux также использует systemd.
Джейсон Антман

8
Ubuntu по состоянию на 16.04 использует systemd по умолчанию
Скотт Стенсланд

4

Вот мой главный пример: D запуск systemd внутри контейнера Docker с Ubuntu: D Я получил Ubuntu, работающий с Systemd внутри Docker

GitHub Repo для моего контейнера docker-systemd

$ 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
Технически это работает, но для этого нужно было нарушить безопасность контейнера. Это не подходит для производственного развертывания.
Майкл Хэмптон

Сегодня это возможно сделать проще с меньшим количеством флагов безопасности
google-frank-dspeed

2

В настоящее время systemd работает неправильно в контейнере Docker из-за целого ряда причин, то есть отсутствия правильных привилегий. Вы можете прочитать об этом во множестве проблем github в проекте docker, таких как запуск systemd внутри зависания контейнера docker arch или segfaults и связанных с этим вопросов, касающихся мониторинга init / process. (Я хотел бы связать больше проблем здесь, но я не могу, поскольку у меня очевидно нет достаточной репутации).

Как видите, эта тема в настоящее время разрабатывается, и несколько патчей уже объединены для улучшения поведения, поэтому мы можем ожидать, что это сработает довольно скоро.

По-видимому, некоторым разработчикам уже удалось заставить его работать на системах 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 делает это проще, так как groups (ro) уже предоставлен в контейнерах - мне все еще нужен привилегированный доступ, чтобы он мог создавать монтирования PrivateTmp, но в остальном, если вы укажете cmd для запуска в качестве бинарного файла systemd - он работает хорошо.


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-environmentвозвращается для меня 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

Однако это не даст вам оболочки, поэтому вам нужно сначала включить в образе некоторую службу systemd (например, sshd), если это еще не сделано, чтобы сделать что-нибудь полезное.


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