systemd та systemctl в образах Dobu Ubuntu [закрито]


78

Проблема

Здається, 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 systemctlsystemctl знаходиться в 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?

Чому systemd не активний у контейнерах Ubuntu Docker? Чи не використовується systemd для створення екземпляра контейнера?

Мені не вдалося знайти жодної документації на цю тему для зображень Ubuntu / Ubuntu Docker, лише інформацію про перехід Ubuntu з Upstartна systemd. Чи існує якась документація, що дає повне пояснення?


Якщо ви хочете повноцінно функціонувати систему init, використовуйте віртуальну машину.
user2105103

Є кілька пропозицій імітувати систему ініціювання на PID-1 всередині контейнера. В основному він повинен реагувати на SIGTERM, який надсилається "зупинкою докера", розподіляючи його між іншими процесами в контейнері. І він повинен мати змогу пожинати зомбі від убитих фонових процесів. => Тепер залишається лише вибрати одну з реалізацій, яка існує. Деякі просто переносять справжній "init" в C / C ++, інші виконують деякі сценарії навколо сигналу (3) і waitpid (3) мовою високого рівня - і для цього працює стандартна бібліотека Python "signal". (як показано в моєму сценарії заміни docker-systemctl)
Гвідо У. Драгейм

2
запустити Docker зображення з docker run --privileged -v /sys/fs/cgroup:/sys/fs/cgroup:ro <image>і systemctlпрацює відмінно
Баки

Відповіді:


76

Це за задумом. Docker повинен запускати процес на передньому плані у вашому контейнері, і він буде створений як PID 1 у просторі імен pid контейнера. Docker призначений для ізоляції процесів, а не для віртуалізації ОС, тому в контейнері немає інших процесів ОС та демонів (таких як systemd, cron, syslog тощо), лише ваша точка входу або команда, яку ви запускаєте.

Якби вони включали команди systemd, ви б виявили, що багато речей не працюють, оскільки ваша точка входу замінює init. Systemd також використовує cgroups, які докер обмежує всередині контейнерів, оскільки можливість зміни cgroups може дозволити процесу уникати ізоляції контейнера. Без того, як systemd працює як init у вашому контейнері, немає демона для обробки ваших команд start і stop.


5
У підручнику, до якого ви зв’язали, не обговорюється жоден з ваших пунктів, тому я не розумію, як ви можете сказати, що це "майже перша примітка в підручнику", і насправді не корисно просто посилатися на на першій сторінці документації. З навчальних відеороликів із самообслуговуванням Docker я дізнався, що точка входу контейнера має PID 1, тому неявно розуміла, що точка входу замінює systemd. Однак, прочитавши численні розділи документів Docker, я відчуваю, що ще не прочитав повного і чіткого пояснення.
Duncan Gravill

4
Щоб зробити щось корисне, майже завжди базове зображення містить операційне середовище, я розумів, що єдина різниця між цією та повноцінною ОС полягає в тому, що вона не має ядра, а використовує ядро ​​хост-ОС. Можливо, передбачається знання ОС. Я новачок у Linux. Мені потрібне детальне пояснення відмінностей між звичайним операційним середовищем Ubuntu / Linux Distro та Dockerized операційним середовищем Ubuntu / Linux Distro.
Duncan Gravill

1
Інший момент полягає в тому, що перше навчальне відео, що самостійно розвивається, передбачає, що всередині контейнера можуть працювати кілька процесів, тому я вважаю, що ваше твердження про "відсутність інших процесів", що працюють у контейнері, є принаймні частково неточним. Дякую за вашу відповідь.
Duncan Gravill

1
Найпопулярніше відповідне питання до цього - чим відрізняється Docker від звичайної віртуальної машини? які можуть вам виявитися корисними.
BMitch

4
До речі .... оскільки у мене було кілька сценаріїв, які видавали також "systemctl start" і "systemctl stop", я просто створив сценарій заміни, який може виконувати необхідні кроки ... /etc/systemd/system/*.service для цього. Для цього не потрібен демон SystemD. Він навіть може виконувати те, що ви очікуєте від процесу PID-1, у контейнері докера. Не соромтеся заглянути на github.com/gdraheim/docker-systemctl-replacement
Guido U. Draheim
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.