OS like container

Розробники Docker відстоюють філософію запуску одного логічного сервісу на контейнер. Логічний сервіс може складатися з декількох процесів ОС. Тому у цьому розділі я хочу розповісти про готовий імедж який дозволяє зручно працювати контейнерами у яких запущено декілька процесів https://github.com/phusion/baseimage-docker.

Baseimage-docker підтримує запуск декількох процесів ОС всередині одного контейнера. Це має сенс, оскільки, принаймні, це вирішує проблему PID 1 і проблему "чорної діри" у системному журналі. Запускаючи декілька процесів, ми вирішуємо дуже реальні проблеми на рівні ОС Unix, з мінімальними накладними витратами і без перетворення контейнера на декілька логічних сервісів.

Розділення логічної служби на декілька процесів ОС також має сенс з точки зору безпеки. Запускаючи процеси від імені різних користувачів, ви можете обмежити вплив вразливостей. Baseimage-docker надає інструменти для заохочення запуску процесів від імені різних користувачів, наприклад, інструмент setuser.

Чи підтримують автори Baseimage-docker запуск декількох логічних служб в одному контейнері?

Не обов'язково, але і не забороняємо. В той час як розробники Docker дуже категоричні і мають дуже жорстку філософію щодо того, як мають бути побудовані контейнери, Baseimage-docker абсолютно не має власної думки. Ми віримо у свободу: іноді має сенс запускати декілька сервісів в одному контейнері, а іноді ні. Ви самі вирішуєте, що має сенс, а не розробники Docker.

Основні складові

Компонент Чому він включений? / Примітки
Ubuntu 24.04 LTS Основна система.
Правильний init процес Головна стаття: Docker і проблема з витісненням зомбі-процесів PID 1.

Згідно з моделлю процесів Unix, процес init -- PID 1 -- успадковує всі осиротілі процеси і повинен витісняти їх). Більшість Docker-контейнерів не мають init процесу, який робить це правильно. Як результат, їхні контейнери з часом заповнюються зомбі-процесами.

Крім того, docker stop надсилає SIGTERM процесу init, який зупиняє всі служби. На жаль, більшість init-систем не роблять це правильно в Docker, оскільки вони призначені для апаратного вимкнення. Це призводить до того, що процеси примусово завершуються за допомогою SIGKILL, що не дає їм можливості правильно вимкнутися. Це може призвести до пошкодження файлів.

Baseimage-docker поставляється з init процесом /sbin/my_init, який правильно виконує обидва ці завдання.
Виправляє проблеми сумісності APT з Docker Дивіться https://github.com/dotcloud/docker/issues/1024.
syslog-ng Демон syslog необхідний для того, щоб багато служб - включаючи ядро - могли правильно записувати логи в /var/log/syslog. Якщо демон syslog не працює, багато важливих повідомлень зникають безслідно.

Працює тільки локально. Всі повідомлення syslog пересилаються в "docker logs".

Чому syslog-ng?
У мене були погані досвіди з rsyslog. Я регулярно стикаюся з помилками в rsyslog, і час від часу він завантажує мій лог-хост на 100% ЦП, ставлячи його в цикл, де він нічого не може зробити. Syslog-ng здається набагато стабільнішим.
logrotate Регулярно обертає і стискає логи.
SSH сервер Дозволяє легко входити в контейнер для інспекції або адміністрування.

SSH за замовчуванням вимкнений і є лише одним з методів, які надає baseimage-docker для цієї мети. Інший метод - через docker exec. SSH також надається як альтернатива, оскільки docker exec має декілька застережень.

Аутентифікація за паролем і використання викликів-відповідей за замовчуванням вимкнені. Допускається тільки аутентифікація за ключем.
cron Демон cron повинен працювати для виконання cron-завдань.
runit Замінює Upstart Ubuntu. Використовується для нагляду і управління службами. Набагато легше у використанні, ніж SysV init та підтримує повторний запуск демонів при їх збоях. Набагато легший у використанні і менш ресурсомісткий, ніж Upstart.
setuser Інструмент для виконання команд від імені іншого користувача. Легший у використанні, ніж su, має менший вектор атаки, ніж sudo, і на відміну від chpst, цей інструмент правильно встановлює $HOME. Доступний як /sbin/setuser.
install_clean Інструмент для встановлення apt пакетів, який автоматично очищає після себе. Всі аргументи передаються до apt-get -y install --no-install-recommends, а після встановлення apt кеші очищуються. Щоб включити рекомендовані пакети, додайте --install-recommends.

[!NOTE] Baseimage-docker є дуже легким: він споживає лише 8.3 МБ пам'яті.

Висновок

Baseimage-docker є легким і універсальним образом, який дозволяє запускати декілька процесів всередині контейнера. З компонентами, такими як правильний init процес, виправлення сумісності з APT, syslog-ng, logrotate, SSH сервер, cron, runit, setuser і install_clean, Baseimage-docker надає надійне і ефективне рішення для контейнеризації. Це гнучка альтернатива жорсткій філософії розробників Docker, що дозволяє користувачам вирішувати, коли має сенс запускати декілька сервісів в одному контейнері.

results matching ""

    No results matching ""