Я пытаюсь проверить, могу ли я запустить systemd внутри контейнера докеров (который запускает Arch Linux в контейнере).
Запускаю докер со всеми возможностями, и привязываю 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 в контейнере Docker, хозяин система также должна запускать systemd. Это означает, что вы не можете использовать Ubuntu <16.04 в качестве хоста.
Вот мой главный pice: D, запускающий systemd внутри контейнера докеров с ubuntu: D Я получил Ubuntu, работающий с systemd внутри докера
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
В настоящее время systemd некорректно работает в контейнере докеров по целому ряду причин, то есть из-за отсутствия правильных привилегий. Вы можете прочитать об этом в различных проблемах github в проекте docker, например запуск systemd внутри контейнера Docker Arch зависает или выходит из строя и связанные с этим вопросы, касающиеся мониторинга инициализации / процесса. (Я хотел бы связать здесь больше вопросов, но не могу, поскольку у меня явно недостаточно репутации).
Как видите, это тема, над которой в настоящее время прорабатывается, и несколько патчей уже были объединены для улучшения поведения, так что мы можем ожидать, что это сработает довольно скоро.
По-видимому, некоторым разработчикам уже удалось запустить его в системах Fedora, как они задокументировали. в их блоге.
Я смог работать в обратном направлении от этого: https://registry.hub.docker.com/u/codekoala/arch/
Docker 1.1 упрощает это, поскольку группы (ro) уже предоставлены в контейнерах - мне все еще нужен приватный доступ, чтобы он мог создавать монтирования PrivateTmp, но в остальном, если вы укажете cmd для запуска как двоичный файл systemd - он отлично работает.
Вы можете запустить systemd внутри контейнера докеров. ОС хоста не имеет значения, хотя вам нужно будет смонтировать том хоста / sys / fs / cgroup. Я заставил его работать, следуя этому руководству: http://developerblog.redhat.com/2014/05/05/running-systemd-within-docker-container/
Обнаружил этот вопрос, пытаясь сделать это в официальном контейнере 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, что является ключевой частью этой работы.
По состоянию на 2018 год для меня это работает: docker run -it -e container=docker
ваше-изображение-имя /sbin/init
Однако это не даст вам оболочку, поэтому вам нужно сначала включить какую-либо службу systemd (например, sshd) внутри образа, если это еще не было сделано, чтобы сделать что-нибудь полезное.