systemd и systemctl в образах Ubuntu Docker

39

Кажется, что systemd неактивен или доступен в изображениях Ubuntu Docker.

Я запускаю контейнеры Docker из изображений ubuntu:16.04 и ubuntu:16.10.

Если я выполняю systemctl status ssh в контейнере 16,04, результатом будет ошибка Failed to connect to bus: No such file or directory. В контейнере 16.10 ошибка bash: systemctl: command not found.

Если я делаю which systemctl, systemctl находится в контейнере 16.04, но не в контейнере 16.10.

Я заметил, что существует /lib/systemd.

Я попытался установить systemd с помощью apt-get install systemd libpam-systemd systemd-ui. Тогда which systemctl находит systemctl в 16.10, но systemctl status ssh все еще дает ошибку Failed to connect to bus: No such file or directory

Мой главный вопрос: как можно активировать systemd и systemctl для использования в изображениях Ubuntu Docker?

Почему система не работает в контейнерах Ubuntu Docker? Не используется ли systemd при создании экземпляра контейнера?

Мне не удалось найти документацию по этой теме для изображений Ubuntu/Ubuntu Docker, только информация о переходе Ubuntu от Upstart до systemd. Есть ли какая-либо документация, дающая полное объяснение?

  • 0
    Если вы хотите полностью работающую систему инициализации, используйте виртуальную машину.
  • 0
    Существует несколько предложений по имитации системы init в PID-1 внутри контейнера. По сути, он должен реагировать на SIGTERM, отправляемый «Docker Stop», распространяя его среди других процессов в контейнере. И он должен быть в состоянии пожинать зомби из убитых фоновых процессов. => Теперь осталось только выбрать одну из реализаций, которые есть вокруг. Некоторые просто переносят настоящий «init» в C / C ++, другие делают некоторые сценарии вокруг signal (3) и waitpid (3) на языке высокого уровня - стандартная библиотека Python «signal» работает и для этого. (как показано в моем скрипте docker-systemctl-replace)
Теги:
docker
ubuntu-server
systemd
systemctl

1 ответ

39
Лучший ответ

Это по дизайну. Docker должен запускать процесс на переднем плане в вашем контейнере, и он будет порожден как PID 1 в пространстве имен pid контейнера. Docker предназначен для изоляции процессов, а не для виртуализации ОС, поэтому в контейнере нет никаких других процессов и демонов (например, systemd, cron, syslog и т.д.), Только ваша точка входа или команда, которую вы запускаете.

Если они включают в себя команды systemd, вы найдете много вещей, которые не работают, поскольку ваша точка входа заменяет init. Systemd также используется для групп, которые докер ограничивает внутри контейнеров, поскольку возможность изменения групп может позволить процессу избежать изоляции контейнера. Без systemd, запущенного как init внутри вашего контейнера, нет никакого демона для обработки ваших команд старта и остановки.

  • 2
    Там нет обсуждения каких-либо ваших пунктов в учебнике, с которым вы связались, поэтому я не понимаю, как вы можете сказать, что это «в значительной степени первая заметка в учебнике», и это действительно не полезно просто ссылаться на титульный лист документации. Я узнал из видеороликов Обучения докеров с самостоятельной установкой, что точка входа контейнера имеет PID 1, поэтому неявно понимал, что точка входа заменяет systemd. Однако после прочтения многочисленных разделов документации Docker я чувствую, что мне еще предстоит прочитать полное и четкое объяснение.
  • 1
    Чтобы сделать что-то полезное, почти всегда базовый образ содержит операционную среду, насколько я понимаю, единственное различие между этой и полной ОС заключается в том, что у нее нет ядра, а вместо этого используется ядро операционной системы. Возможно, знание ОС предполагается. Я новичок в Linux. Мне нужно подробное объяснение различий между обычной операционной средой Ubuntu / Linux Distro и Dockerized Ubuntu / Linux Distro.
Показать ещё 9 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню